Как два проверить, совпадают ли строки двух неструктурированных уличных адресов?

Мне нужно сравнить два неструктурированных адреса и определить, одинаковы ли они (или достаточно похожи).

Сценарий

  • Адрес предоставляется конечным пользователем в виде обычного текста.
  • Нет ничего, что могло бы помочь пользователю писать более идентифицируемым образом (без автозаполнения, ничего. Просто пустое текстовое поле).
  • "# 102 Nice-Looking Street, Gotham City, NY" должно совпадать с "Nice Loking St., Gotham City, New York, apt 102".
  • Использование стороннего сервиса не вариант.
  • Поиск не проблема. У меня уже есть две струны. Мне нужно проверить, представляют ли они один и тот же адрес, несмотря на его различия в структуре.

Что я нашел

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

  • Есть некоторые ключевые слова (например, сравнение "Street" с "St." или "# 102" с "apt 102", или "NY" с "New York"), которые не должны наказывать степень надежность.
  • Некоторые слова можно расположить в другом порядке (например, квартира в приведенном выше примере).

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

заранее спасибо


person Minduca    schedule 26.05.2016    source источник
comment
Что ж, вы можете передать оба адреса в Google или другой картографический API, вернуть координаты того, где, по его мнению, находится каждый адрес, а затем выполнить некоторые математические вычисления, чтобы узнать, насколько далеко они находятся друг от друга, но это использует сторонний API. В остальном тот факт, что это адреса, почти не имеет значения - это просто проблема нечеткого сопоставления строк, немного упрощенная за счет использования общих замен, как вы упомянули, которые вы можете сохранить в какой-либо базе данных (Street / St, Washington / DC / DC, Нью-Йорк / Нью-Йорк и т. Д.)   -  person Steve Ives    schedule 27.05.2016


Ответы (1)


Для этого я помог создать несколько инструментов с открытым исходным кодом.

По сути, подход состоит в том, чтобы попытаться разделить и адресовать его составные части, а затем разумно сравнить эти части.

Обе части проблемы трудны.

Первую часть часто называют анализом адреса. Вот что мы используем: https://github.com/datamade/usaddress

У второй части много, много имен, но давайте назовем это нечетким соответствием. Вот библиотека, которую мы сделали для этого: https://github.com/datamade/dedupe

Мы также предоставили некоторые возможности для их совместного использования: http://dedupe.readthedocs.io/en/latest/Variable-definition.html#address-type

person fgregg    schedule 18.09.2016