Рекомендации по сценарию сопоставления почтовых адресов?

Мой SQL-сервер содержит 2 таблицы, содержащие аналогичный набор полей для почтового (физического) адреса. NB эти таблицы заполняются до того, как данные попадут в мою базу данных (не могу это изменить). Набор полей в таблицах похож, но не идентичен - большинство из них существует в обеих таблицах, некоторые только в одной, некоторые - в другой. Цель состоит в том, чтобы с «высокой степенью достоверности» определить, совпадают ли два почтовых адреса.

Примеры полей:

  1. Номер улицы
  2. Преднаправление
  3. Название улицы
  4. Суффикс улицы
  5. Постнаправление (одна таблица, а не другая)
  6. Имя устройства (одна таблица) v Адрес 2 (другая таблица) - добавляет сложности
  7. Почтовый индекс (длина варьируется в каждой таблице от 5 до 5+ цифр)
  8. Юридическое описание

В идеале я хотел бы иметь простой способ вызвать «функцию», которая возвращает либо логическое значение, либо уровень достоверности совпадения (0,0 - 1,0). Этот вызов может быть выполнен в моем решении на SQL или Python; свободный / открытый исходный код очень предпочитается клиентом.

Среди таких опций, как SOUNDEX, DIFFERENCE, расстояние Левенштейна (все SQL) и usaddress, дедупликация (Python) ни один не выделяется как подходящее решение.


person Kevin R. M.    schedule 22.11.2019    source источник
comment
высокая степень уверенности - проблема ... вам нужно стандартизировать адреса в обеих таблицах, прежде чем вы сможете попытаться сопоставить их. Вы можете посмотреть что-то вроде Accuzip.com ... но, как я уже сказал, вам сначала нужно стандартизировать адреса, прежде чем пытаться их сравнивать.   -  person BillRuhl    schedule 22.11.2019
comment
Я согласен с @BillRuhl о стандартизации обоих адресов и последующем их сравнении. Вот один вариант, но он будет стоить дорого.   -  person Isaac    schedule 22.11.2019
comment
Стандартизация адресов сложнее, чем можно подумать, и требует постоянного контроля. Взгляните на stackoverflow.com/questions / 41249742 /   -  person John Cappelletti    schedule 22.11.2019
comment
Можете ли вы развернуться? Поля в таблицах похожи, но не идентичны. - ваш ответ на этот вопрос важен для определения наилучшего курса действий.   -  person Alan Burstein    schedule 22.11.2019
comment
Спасибо всем за ответ! @JohnCappelletti: ваш подход с использованием API Карт Google для стандартизации кажется нам простым и экономичным. Объясните, пожалуйста, необходимость постоянного мониторинга. После лучшего понимания стандартизации я продолжу с метриками сравнения / сходства. Спасибо еще раз.   -  person Kevin R. M.    schedule 23.11.2019
comment
@ KevinR.M. Если вы создадите собственный метод, ВСЕГДА будут новые исключения и соображения. Я подозреваю, что вам потребуется процесс ALERT для выбросов. Несколько лет назад я создал довольно сложную методологию связывания, которая превзошла работу Dunn & Bradstreet и даже Experian. Хотя я очень гордился этим процессом, он никогда не был 100% или полностью оправдан.   -  person John Cappelletti    schedule 23.11.2019


Ответы (1)


В идеале я хотел бы иметь простой способ вызвать «функцию», которая возвращает либо логическое значение, либо уровень достоверности совпадения (0,0 - 1,0).

Метрика сходства - это то, что вам нужно. Вы можете использовать метрики расстояния для вычисления сходства. Расстояние Левенштейна, Расстояние Дамерау-Левенштейна и Расстояние Хэмминга являются примерами метрик расстояния.

Учитывая самый короткий из двух: M - короче из двух, N - самый длинный, и ваш показатель расстояния (D), вы можете измерить строку Сходство с использованием (MD) / N. Вы также можете использовать самую длинную общую подпоследовательность или самую длинную общую подстроку (LCS) для измерения сходства путем деления LCS / N.

Если вы можете использовать CLR, я НАСТОЯТЕЛЬНО рекомендую mdq.similarity, который можно получить по адресу здесь. Это даст метрику сходства с использованием следующих алгоритмов:

  1. Расстояние Дамарау-Левенштейна (в документации написано только «Левенштейн», но они ошибаются)
  2. Алгоритм коэффициента подобия Жаккара.
  3. форма алгоритма расстояния Яро-Винклера. 4 самый длинный алгоритм общей подпоследовательности (который увеличивается на единицу при использовании транспозиций)

Если производительность важна (эти показатели могут быть довольно медленными в зависимости от того, что вы их кормите), я бы ознакомился с моим функция Берни. Он разработан, чтобы помочь измерить сходство с использованием любого из вышеупомянутых алгоритмов намного быстрее. Bernie имеет 100% открытый исходный код и может быть легко воссоздан на любом языке (Python, C # и т. Д.). То же самое с моей функцией N-Grams.

Вы можете легко создать свою собственную метрику, используя NGrams8K.

Для чистых версий T-SQL Левенштейна или самой длинной общей подпоследовательности вы можете проверить блог Фила Фактора. (Обратите внимание, что они не могут конкурировать с упомянутой мной CLR).

Я пока остановлюсь. Лучший совет можно дать после того, как мы лучше поймем, чем отличаются строки (обратите внимание на мой вопрос под вашим комментарием).

person Alan Burstein    schedule 22.11.2019
comment
Я уточнил свой вопрос выше. Есть 2 набора данных (в конечном итоге до 9). Вы дали мне больше информации о показателях сходства. Пока не уверен, какой из них я буду использовать, но это заметно ускорило мое расследование. - person Kevin R. M.; 23.11.2019