Использование SOLR для вычисления сходства/счетчика битов между двумя улонгами

У нас есть база данных изображений, где я рассчитал PHASH, используя Др. Метод Нила Кравеца, реализованный Дэвидом Офтедалом.

Часть примера кода, вычисляющего разницу между этими длинными, находится здесь:

ulong hash1 = AverageHash(theImage);
ulong hash2 = AverageHash(theOtherImage);

uint BitCount(ulong theNumber)
{
    uint count = 0;
    for (; theNumber > 0; theNumber >>= 8) {
        count += bitCounts[(theNumber & 0xFF)];
    }
    return count;
}

Console.WriteLine("Similarity: " + ((64 - BitCount(hash1 ^ hash2)) * 100.0) / 64.0 + "%");

Проблема в том, что я знаю только один из этих хэшей и хочу запросить SOLR, чтобы найти другие хэши в порядке сходства.

Несколько заметок:

  1. Здесь используется SOLR (единственная альтернатива, которая у меня есть, это HBASE)
  2. Хотите избежать установки какой-либо пользовательской Java в solr (с удовольствием установим существующий плагин)
  3. С удовольствием выполняю много предварительной обработки на C#
  4. С удовольствием использую несколько полей для хранения данных в виде битовой строки, длинной и т. Д.
  5. Использование SOLRNet в качестве клиента

Изменить, немного дополнительной информации (извините, я увлекся проблемой и начал предполагать, что это широко известная область). Вот прямая загрузка в консоль C#/пример приложения: http://01101001.net/Imghash.zip

Пример вывода этого консольного приложения:

004143737f7f7f7f phash-test-001.jpg
0041417f7f7f7f7f phash-test-002.jpg
Сходство: 95,3125%


person CameraSchoolDropout    schedule 14.02.2014    source источник


Ответы (1)


Вы можете использовать нечеткий поиск Solr для этого, у вас есть чтобы немного прокрутить страницу вниз.

Стандартный синтаксический анализатор запросов Solr поддерживает нечеткий поиск на основе алгоритма расстояния Левенштейна или алгоритма редактирования расстояния. Нечеткий поиск обнаруживает термины, похожие на указанный термин, но не обязательно являющиеся точным совпадением. Чтобы выполнить нечеткий поиск, используйте символ тильды ~ в конце термина, состоящего из одного слова.

Предположим, у вас есть схема, как показано ниже, где это поле phash содержит рассчитанный вами phash.

<fields>
    <!-- ... all your other fields ... -->
    <field name="phash" type="string" indexed="true" stored="true" />
</fields>

Вы можете выполнить запрос, например

q=phash:004143737f7f7f7f~0.8&
fl=score,phash

Это вернет все документы, которые имеют PHASH с Levenshtein Distance or Edit Distance не менее 80%. Вы не получите 95,3125%, которые вы указали в своем вопросе, но 87,5%, поскольку учитываются совпадающие/не совпадающие символы.

Если вы хотите увидеть это значение, вы можете выполнить следующий запрос

q=phash:004143737f7f7f7f~0.8&
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)

Это вызов функции для получения расстояния между строками с использованием расстояние Левенштейна или редактирования и даст результат, аналогичный

+----------------+---------------------------------------+
|hash            |strdist("0041417f7f7f7f7f", hash, edit)|
+----------------+---------------------------------------+
|0041417f7f7f7f7f|1.0                                    |
+----------------+---------------------------------------+
|004143737f7f7f7f|0.875                                  |
+----------------+---------------------------------------+

Если вы хотите уменьшить разрыв между 95.3125% и 87,5%, вы должны хранить PHASH не как шестнадцатеричное значение, а, например, как восьмеричное.

person cheffe    schedule 14.02.2014
comment
Спасибо @cheffe - я проверю это сейчас, чтобы улучшить strdist даже дальше октета, имеет ли смысл использовать строку отдельных битов, например: 000000000100000101000011011100110111111110111111011111111011111111, я пытаюсь максимально приблизиться к битовому счету, как в примере . (Хотя я очень рад, что SOLR проделал 90% работы, а остальное проделал на C#) - person CameraSchoolDropout; 15.02.2014
comment
Спасибо за ответ - так же, как и к вашему сведению, описанный выше метод приводит к точному совпадению с алгоритмом подсчета битов. - person CameraSchoolDropout; 16.02.2014