Подтвердить что ты не робот

Улучшение производительности сопоставления нечеткой строки со словарем

Итак, в настоящее время я работаю с SecondString для сопоставления нечеткой строки, где у меня есть большой словарь для сравнения с (с каждой записью в словаре есть связанный не уникальный идентификатор). В настоящее время я использую hashMap для хранения этого словаря.

Когда я хочу выполнить нечеткое сопоставление строк, сначала проверяю, есть ли строка в hashMap, а затем я перебираю все остальные потенциальные ключи, вычисляя сходство строк и сохраняя k, v pair/s с наивысшее сходство. В зависимости от того, какой словарь я использую, это может занять много времени (12330 - 1800035 записей). Есть ли способ ускорить это или сделать его быстрее? В настоящее время я пишу функцию/таблицу memoization как способ ускорить это, но может ли кто-нибудь еще подумать о лучшем способе улучшить скорость этого? Может быть, другая структура или что-то еще, что мне не хватает.

Большое спасибо заранее,

Натан

4b9b3361

Ответ 1

То, что вы ищете, - это BKTree (BK-Tree) в сочетании с алгоритмом расстояния Левенштейна. Производительность поиска в BKtree зависит от того, как "Нечеткий" ваш поиск. Где нечеткое определяется как количество расстояний (редактирование) между поисковым словом и совпадениями.

Вот хороший блог на эту тему: http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees

Некоторые заметки о производительности: http://www.kafsemo.org/2010/08/03_bk-tree-performance-notes.html

Примечания к алгоритму http://en.wikipedia.org/wiki/Levenshtein_distance.

Кроме того, здесь представлено BK-дерево, написанное на Java. Должен дать вам представление об интерфейсе: http://code.google.com/p/java-bk-tree/