Я работаю над некоторым материалом для внутренней CRM. Текущий frontend компании допускает много дубликатов. Я пытаюсь мешать конечным пользователям включить того же человека, потому что они искали 'Bill Johnson' и не 'William Johnson'. Таким образом, пользователь вставит некоторую информацию об их новом клиенте, и мы будем находить аналогичные имена (включая нечеткие имена) и соответствовать им против того, что уже находится в нашей базе данных, и спросите, имели ли в виду они те вещи... Такая база данных или технология существуют?
Я реализовал такую функциональность на одном сайте. Я использую 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 ($ word);
2) Во время поиска выполняется нечеткий поиск $ word в базе данных: $ Soundlike = double_metaphone ($ word)
4) SELECT * FROM table
WHERE soundlike
LIKE $ soundlike (если у вас есть levenstein, сохраненный как процедура, намного лучше : SELECT * FROM table WHERE levenstein ( soundlike
, $ soundlike) < Mythreshold ORDER BY levenstein ( word
, $ word) ASC LIMIT ... и т. д.
У меня это хорошо сработало, хотя я не могу использовать хранимую процедуру, так как не могу контролировать сервер, и он использует MySQL 4.20 или что-то в этом роде.
Я однажды задавал аналогичный вопрос. Name Hypocorism List Я так и не смог ничего с ним сделать, но проблема возникла снова на работе, поэтому я мог бы написать и открыть исходный код библиотеки в .net для выполнения некоторого сопоставления.
Обновление: Я портировал модуль perl, о котором упоминал там, на C # и разместил его на github. http://github.com/stimms/Nicknames
Реализуйте расстояние Левенштейна:
http://en.wikipedia.org/wiki/Levenshtein_distance
Это может быть написано как SQL-функция и запрошено различными способами.
Вы можете использовать SOUNDEX, чтобы получить похожие по звучанию имена. Однако он не будет сочетаться, например, с William и Bill.
В качестве примера попробуйте использовать SQL.
SELECT SOUNDEX('John'), SOUNDEX('Jon')
Что ж, у SSIS есть несколько задач нечеткой логики, которые мы используем для поиска дубликатов постфактум.
Я думаю, что для достижения наилучших результатов вам нужно, чтобы ваша логика смотрела не только на название. Если они вводят адрес, электронную почту или телефонную информацию, возможно, вы могли бы найти людей с такой же фамилией с одним или несколькими другими совпадениями и спросить, подойдет ли один из них. Вы также можете составить таблицу псевдонимов для различных имен и сопоставить ее. Вы не получите их всех, но вы можете получить по крайней мере некоторые из самых распространенных в вашей стране.
В SQL Server есть некоторые встроенные функции SOUNDS LIKE, см. SOUNDEX http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80% 29.aspx
Что касается полного поиска / поиска по нику, мне ничего не известно о нем. Псевдонимы различаются в зависимости от региона, и нужно отслеживать большой объем информации. Может существовать база данных, связывающая полные имена с псевдонимами, которые вы могли бы использовать в своем собственном приложении.