интеллектуальный поиск по базе данных - PullRequest
3 голосов
/ 21 октября 2008

Проблема в том, что существует база данных с около 20 тыс. Записей клиентов, и я хочу приложить максимум усилий, чтобы избежать дублирования записей. База данных - Microsoft SQL Server 2005, приложение, которое поддерживает эту базу данных, - Microsoft Dynamics / SL. Я создаю веб-сервис ASP.NET, который взаимодействует с этой базой данных. Мой сервис может вставлять записи о клиентах в базу данных, читать записи из нее или изменять эти записи. Либо в моем веб-сервисе, либо через MS Dynamics, либо в Sql Server я хотел бы дать список возможных совпадений, прежде чем пользователь подтвердит добавление новой записи.

Таким образом, пользователь отправит запись, если она кажется уникальной, запись сохранит и вернет новый идентификатор. Если есть возможные дубликаты, пользователь может повторно отправить запрос с подтверждением: «Да, я вижу возможные дубликаты, это новая запись, и я хочу отправить ее».

Это легко, если это просто пунктуация или пробел (например, если вы вводите "Company, Inc." и в базе данных есть "Company Inc", но что, если есть небольшие изменения, такие как " Company Corp. »вместо« Company Inc »или, если есть неправильная орфография, например« Cmpany, Inc. ». Можно ли даже вернуть такие записи в списке? Если это абсолютно невозможно, я разберусь с тем, что у меня есть. Это просто вызывает больше работы позже, если записи должны быть объединены из-за дублирования.

Ответы [ 4 ]

5 голосов
/ 22 октября 2008

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

Для имен вам лучше всего использовать фонетический алгоритм - который учитывает произношение. Они забьют Смита и Шмидта близко друг к другу, поскольку их легко спутать, когда произносит слова. Двойной метафон - хороший выбор.

Для толстых аппликатур вам, вероятно, будет лучше использовать алгоритм edit distance - который дает "разницу" между 2 словами. Они могли бы собрать Смита и Смота близко друг к другу - хотя 2 могут ускользнуть через фонетический поиск.

T-SQL имеет SOUNDEX и DIFFERENCE - но они довольно плохие. Вариант Левенштейна является каноническим, но есть и другие хорошие варианты - большинство из которых довольно просто реализовать в C #, если вы не можете найти подходящую лицензированную реализацию.

Все это будет гораздо проще кодировать / использовать на C #, чем на T-SQL (хотя я обнаружил двойной метафон в ужасающем злоупотреблении T-SQL , которое может работать в SQL).

Хотя этот пример находится в Access (и я никогда не смотрел на код и не использовал реализацию), включенная презентация дает довольно хорошее представление о том, что вам, вероятно, понадобится делать. Код, вероятно, стоит посмотреть, и, возможно, порт из VBA.

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

Если возможно интегрировать Lucene.NET в ваше решение, вы обязательно должны попробовать его.

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

Просмотр SOUNDEXing в SQL Server. Я верю, что это даст вам нечеткость возможных совпадений, которые вы ищете.

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

0 голосов
/ 21 октября 2008

Вы можете попробовать использовать полнотекстовый поиск с функциями FreeText (или FreeTextTable), чтобы попытаться найти возможные совпадения.

...