Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top