Улучшенный алгоритм Левенштейна - PullRequest
8 голосов
/ 21 октября 2011

Я недавно внедрил алгоритм Левенштейна в нашу базу данных поисковой системы, но мы столкнулись с проблемой.

По основному левенштейну

Левенштейн («123456», «12x456») совпадает со значением Левенштейна («123456», «12345x»)

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

Если у кого-нибудь есть идеи, пожалуйста, дайте мне знать.

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

Используйте Расстояние Яро-Винклера ... Это именно то, что вы просите.

2 голосов
/ 21 октября 2011

См. Алгоритм Смита-Уотермана , широко используемый в биоинформатике. Он может выполнить локальное выравнивание вашего запроса, но это будет медленнее, чем Левенштейн.

1 голос
/ 21 октября 2011

У нас была похожая проблема, и мы использовали метод Brew edit distance

Мы были в Perl, поэтому мы использовали библиотеку Text :: Brew . Мой коллега сделал хорошую презентацию об использовании нескольких различных алгоритмов , включая Brew.

...