Супер нечеткая проверка имени? - PullRequest
15 голосов
/ 20 июля 2010

Я работаю над некоторыми вещами для внутренней CRM. Текущий интерфейс компании позволяет много дубликатов. Я пытаюсь помешать конечным пользователям вводить одного и того же человека, потому что они искали «Билла Джонсона», а не «Уильяма Джонсона». Таким образом, пользователь введет некоторую информацию о своем новом клиенте, и мы найдем похожие имена (включая нечеткие имена) и сопоставим их с тем, что уже есть в нашей базе данных, и спросим, ​​имели ли они в виду эти вещи ... Такая база данных или технологии существуют?

Ответы [ 6 ]

6 голосов
/ 20 июля 2010

Я реализовал такую ​​функциональность на одном сайте. Я использую double_metaphone () + levenstein () в PHP. Я предварительно вычисляю double_metaphone () для каждой записи в базе данных, которую я ищу, используя SELECT из первых x символов в поисковом термине «метафонированный».

Затем я сортирую возвращаемый результат по их расстоянию Левенштейна. double_metaphone () не является частью какой-либо библиотеки PHP (последний раз, когда я проверял), поэтому я позаимствовал реализацию PHP, которую я нашел где-то давно в сети (сайт больше не подключен). Я должен опубликовать это где-то, я полагаю.

РЕДАКТИРОВАТЬ: веб-сайт все еще находится в archive.org: http://web.archive.org/web/20080728063208/http://swoodbridge.com/DoubleMetaPhone/

или кеш Google: http://webcache.googleusercontent.com/search?q=cache:Tr9taWl9hMIJ:swoodbridge.com/DoubleMetaPhone/+Stephen+Woodbridge+double_metaphon

, что приводит ко многим другим полезным ссылкам с исходным кодом для double_metaphone (), включая ссылку в Javascript на github: http://github.com/maritz/js-double-metaphone

РЕДАКТИРОВАТЬ : Прошел через мой старый код, и вот примерно шаги того, что я делаю, псевдокодировано, чтобы не усложнять:

1) Предварительно вычислить double_metaphone () для каждого слова в базе данных, то есть $ word = 'blahblah'; $ Soundslike = double_metaphone ($ слово);

2) Во время поиска $ word нечетко ищется в базе данных: $ soundslike = double_metaphone ($ word)

4) SELECT * FROM table WHERE soundlike LIKE $ soundlike (если levenstein хранится как процедура, намного лучше : SELECT * FROM table WHERE levenstein (soundlike, $ soundlike ) <мифический порог ORDER BY levenstein (<code>word, $ word) ASC LIMIT ... и т. д.

Это хорошо сработало для меня, хотя я не могу использовать хранимую процедуру, поскольку у меня нет контроля над сервером, и он использует MySQL 4.20 или что-то в этом роде.

4 голосов
/ 20 июля 2010

Я задал похожий вопрос один раз. Name Hypocorism List Я никогда не удосужился что-либо с этим сделать, но проблема снова возникла на работе, поэтому я мог бы написать и открыть исходный код библиотеки в .net для некоторого сопоставления.

Обновление: Я перенес модуль Perl, который я там упомянул, на C # и установил его на github. http://github.com/stimms/Nicknames

2 голосов
/ 20 июля 2010

Реализация расстояния Левенштейна:

http://en.wikipedia.org/wiki/Levenshtein_distance

Это может быть записано как функция SQL и может быть запрошено разными способами.

1 голос
/ 20 июля 2010

Ну, в SSIS есть нечеткие логические задачи, которые мы используем, чтобы найти дубликаты после свершившегося факта.

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

0 голосов
/ 20 июля 2010

В SQL Server есть некоторые встроенные функции SOUNDS LIKE, см. SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

Что касается полного / никнеймного поиска, то здесь нет ничего построенного, о чем я знаю. Псевдонимы варьируются в зависимости от региона, и это много информации для отслеживания. Может существовать база данных, связывающая полные имена с псевдонимами, которые вы можете использовать в своем собственном приложении.

0 голосов
/ 20 июля 2010

Вы можете использовать SOUNDEX, чтобы получить похожие звучащие имена.Однако, это не будет соответствовать, например, Уильяму и Биллу.

Попробуйте это в качестве примера в SQL.

SELECT SOUNDEX('John'), SOUNDEX('Jon')
...