Функция хеширования, которая хэширует похожие строки в одном и том же сегменте - PullRequest
2 голосов
/ 06 августа 2010

Я ищу "плохую" хеш-функцию: Я хотел бы хэшировать строки и помещать подобные строки в одно ведро.

Можете ли вы дать мне подсказку, с чего начать мое исследование? Некоторые методы или имена алгоритмов ...

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Ваша проблема не из легких.Две идеи:

Это решение может быть слишком сложным, но вы можете попробовать преобразование Фурье.Обработайте ваш входной текст как последовательность образцов функции, а затем запустите преобразование Фурье для преобразования вашего ввода в частотную область.Низкочастотная часть - это основная часть текста, а высокочастотная - небольшие изменения.

Это похоже на сжатие в формате jpeg: отбросьте детали и просто оставьте важные вещи.Если у вас есть два почти идентичных изображения и вы сильно сжимаете их в формате JPEG, вы обычно получаете один и тот же вывод.

pHash использует метод, подобный этому.

Опять же, это будетдовольно сложный способ сделать это.

Вторая идея: minHash

Идея для minHash состоит в том, что вы выбираете некоторые маркеры, которые, вероятно, будут одинаковыми, если входные данные одинаковые.Затем вы вычисляете вектор для выходов всех маркеров.Если два входа имеют одинаковые векторы, то входы похожи.

Например, подсчитайте, сколько раз слово «the» появляется в тексте.Если оно четное, 0, если нечетное, 1. Теперь посчитайте, сколько раз слово «математика» появляется в тексте.Снова 0 для четных, 1 для нечетных.Сделайте это для большого количества слов.

Теперь вы обрабатываете все тексты, и каждый из них выдает вывод типа «011100010101» или что-то еще.Если два текста похожи, они будут иметь одинаковые выходные строки, отличающиеся всего на 1 или два бита.Вы можете использовать многовариантную секцию (MVP) для эффективного поиска выходных данных.

Это также может быть излишним для вашей проблемы.

0 голосов
/ 06 августа 2010

Это зависит от того, что вы подразумеваете под «похожей строкой»?

Но если вы ищете такую ​​плохую, вам придется создать ее самостоятельно.

Пример:

  • Вы можете создать 10 сегментов (от 0 до 9) и сгруппировать строки по их длине mod 10

  • Использовать strcmp () как функция и сгруппировать их по разностям с определенной строкой

...