Алгоритмы сопоставления строк - PullRequest
1 голос
/ 04 августа 2011

У меня есть приложение на python с базой данных предприятий, и я хочу иметь возможность искать предприятия по названию (для целей автозаполнения).
Например, рассмотрим названия «лучшая покупка», «макдональдс», «sony» и «яблоко».

Я бы хотел, чтобы "app" вернул "apple", а также "appel" и "ple". «Макдональдс» должен вернуть «Макдональдс». «bst b» и «best-buy» должны возвращать «best buy».

Какой алгоритм я ищу, и есть ли у него реализация Python?

Спасибо!

Ответы [ 6 ]

5 голосов
/ 04 августа 2011

Расстояние Левенштейна должно подойти.

Посмотрите вокруг - есть реализации на многих языках.

2 голосов
/ 04 августа 2011

Левенштейновское расстояние сделает это.

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

Если у вас возникла эта проблема, запишите все опечатки, сделанные пользователями (typo = no direct match), и в автономном режиме создайте базу данных исправлений, которая содержит все сопоставления typo-> fix. некоторые компании делают это еще умнее, например: Google следит за тем, как пользователи исправляют свои опечатки, и изучает сопоставления из этого.

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

отметьте это http://docs.python.org/library/difflib.html это должно помочь вам

0 голосов
/ 05 августа 2011

Levensthein расстояние идет в правильном направлении, но только на полпути. Есть несколько приемов, чтобы заставить его использовать и половинные совпадения.

Можно было бы использовать динамическую деформацию времени подпоследовательности (DTW на самом деле является обобщением расстояния Левенштейна). Для этого вы ослабляете начальный и конечный случаи при расчете матрицы затрат. Если вы ослабите только одно из условий, вы можете получить автозаполнение с проверкой орфографии. Я не уверен, есть ли доступная реализация Python, но если вы хотите реализовать ее для себя, она не должна превышать 10-20 LOC.

Другой идеей было бы использовать Trie для ускорения, которое может одновременно выполнять DTW / Levensthein для нескольких результатов (огромное ускорение, если ваша база данных велика). В IEEE есть статья о Levensthein о попытках, поэтому вы можете найти там алгоритм. Опять же, для этого вам нужно ослабить конечное граничное условие, чтобы получить частичные совпадения. Однако, поскольку вы уходите в три, вам просто нужно проверить, когда вы полностью использовали вход, а затем вернуть все листья.

0 голосов
/ 04 августа 2011

Я думаю, что вы ищете огромную область качества данных и очистки данных.Я боюсь, что вы могли бы найти реализацию Python относительно этого, поскольку это должно быть что-то, что очищает значительный объем данных в БД, который может иметь деловую ценность.

0 голосов
/ 04 августа 2011

Soundex или Metaphone могут работать.

...