Проверьте на наличие опечаток, сравнивая две строки в T-SQL

Мы разработали серию бизнес-правил, которые определяют дубликат записи контактов, основа этих правил - сначала проверка на одно и то же имя, а затем сравнение других полей, таких как номер телефона, электронная почта, телефон и т. Д.

Проблема в том, что только небольшой процент записей захватывается и автоматически очищается / объединяется.

Чтобы получить больше записей, я хотел бы включить или проверить опечатки в имени контакта (например, Michael=Micheal).

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

1 ответ

Решение

Имейте в виду, что большинство алгоритмов измерения схожести строк требуют большого объема вычислений и, в зависимости от объема выполняемой работы, T-SQL может оказаться плохим выбором с точки зрения производительности.

Вместо собственно измерения сходства строк рассмотрим хеш-функции, в частности те, которые сохраняют основную "структуру" слов. Преимущество хеш-кодов заключается в том, что они вычисляются только один раз, используя только одну строку в качестве входных данных, а затем могут использоваться в фильтрах [TSQL] с простым предикатом равенства (в отличие от измерений подобия, которые подразумевают, что вы запускаете алгоритм для каждой возможной ссылочной строки). Вероятным предложением хеш-кода является SOUNDEX, который особенно хорошо подходит для типичных изменений имен людей и компаний и который также "изначально" реализован как функция TSQL.

Вероятно, было бы предпочтительнее вычислить код soundex для каждого отдельного слова в поле имени, например, для создания двух кодов для ввода, таких как "Чарльз Дарвин", трех для "Жана Жака Руссо" и т. Д., И для повышения производительности вам может потребоваться чтобы найти способ отличить фамилию от имени, чтобы облегчить условия вашего фильтра.

Если вы предпочитаете работать с методами схожести строк, я обнаружил, что либо расстояние Левенштейна, либо мера Ратклиффа / Оберхелпа достаточно хорошо работают для работы с небольшими вариациями, такими как опечатки. Как и в случае с Soundex, вы все равно можете рассмотреть возможность обработки слов отдельно, что затем создает трудности при работе с несколькими значениями для заданной записи имени, но также позволяет более активно обрабатывать типичную ситуацию с именами, при этом некоторые экземпляры являются именами порядка затем фамилия и другие экземпляры в обратном порядке (или при этом части имени опускаются или сокращаются).

Другие вопросы по тегам