Мне нужен алгоритм сопоставления адресов

Я искал онлайн для этого, но на самом деле не нашел. В основном мне нужно сравнить кучу адресов, чтобы увидеть, соответствуют ли они. Адреса могут быть написаны по-разному. Например: 1345 135-й NE, 1345 NE 135TH ST и т.д. Кроме того, они могут быть на разных языках. Прежде чем я попытаюсь написать какой-либо алгоритм сопоставления синтаксического анализа, кто-нибудь знает какие-либо библиотеки или способы, которыми я мог бы легко это сделать? Мой друг, хотя и использует веб-сервис google или bing, передает им адрес и возвращает геокоординированные координаты и сравнивает их с использованием координат вместо соответствия строк. Но тогда я должен позвонить в веб-службу тысячи раз за все эти адреса, которые у меня есть, не очень элегантные;) Любая помощь будет приятной:)

Ответ 1

Я не думаю, что это проблема типа REGEX. Сначала вы сначала конвертируете в сопоставимый формат.

Существует несколько веб-сервисов/продуктов, которые будут стандартизировать адрес для вас. Bing для "API стандартизации адресов USPS", и вы найдете массу информации. После стандартизации адреса сравнение должно быть простым.

http://www.bing.com/search?q=usps+address+standardization+api&go=&form=QBRE&qs=n&sk=&sc=1-32

В качестве альтернативы вы можете GeoCode адрес получить набор координат, а затем сравнить их.

http://code.google.com/apis/maps/documentation/geocoding/

Ответ 2

Я нашел 2 варианта.

Во-первых, возможно, вместо того, чтобы принимать какие-либо данные, вы позволяете пользователям выбирать из ограниченного числа опций, аналогично тому, как facebook имеет дело с адресами. Если вы используете автозаполнение api, по мере их ввода, возможные адреса будут сужаться api. Вот один из google:

http://code.google.com/p/geo-autocomplete/

Во-вторых, поиск и отбор адресов (но они не бесплатны):

https://www.craftyclicks.co.uk/

https://smartystreets.com/ (ранее квалифицированный адрес)

https://www.alliescomputing.com/ (ранее предлагаемые мировые адреса)

Ответ 3

Адреса США могут (обычно) быть однозначно представлены 12-значным номером, который называется точкой доставки (DPBC). Этот номер состоит из полного 9-значного почтового индекса и трехзначного номера точки доставки. Это то, что используется для формирования штрих-кодов на почтовых отправлениях для ускорения доставки. Использование службы, сертифицированной CASS, может обеспечить 12-значную точку доставки и даже дублировать флага для вас.

В интересах полного раскрытия я работаю для SmartyStreets, который ранее был Квалифицированным адресом, о котором упоминалось в другом ответе Mowgli.

Мы предоставляем API, который можно запросить, а также службу пакетной обработки (которая будет указывать дубликаты, как описано выше).

Имейте в виду, что даже 12-разрядный DPBC не всегда однозначно идентифицирует конкретный адрес. Это происходит часто, когда определенный уличный блок или 9-значный почтовый индекс имеет длинный участок домов с аналогичными первичными номерами. В этих случаях лучше всего использовать службу CASS для стандартизации и проверки адресов, а затем использовать их для удобного сравнения. (Но, как сказано, дубликаты уже будут отмечены некоторыми службами CASS.)

Обновить: SmartyStreets теперь предоставляет подтверждение международного адреса.

Ответ 4

Существует библиотека python с открытым исходным кодом для разрешения дедупликации/сущности записи, которая может применяться для сопоставления адресов: Dedupe.

Он бесплатный и может работать на ноутбуке, в отличие от огромного сервера.

Ответ 5

Я бы не рассматривал эту проблему в регулярном выражении.

Одним из бесплатных инструментов, которые могут быть полезны, является usaddress, библиотека python для парсинга адресов. Он отлично работает во всех форматах адресов, b/c использует вероятностный подход, а не подход с регулярным выражением (хотя он сделан для адресов в США и может плохо работать на адресах на других языках) http://usaddress.readthedocs.org/en/latest/

Разбор адресов не решит вашу проблему на 100%, но сравнение двух адресов, особенно адресов с различными форматами, будет намного проще, если адреса будут разделены на их соответствующие компоненты (чтобы вы могли сравнивать улицу # с улицей #, город против города и т.д.)

Затем для сравнения записей вы можете использовать dedupe - еще одну бесплатную библиотеку python. http://dedupe.readthedocs.org/en/latest/

Ответ 6

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

Простой алгоритм может рассказать вам, какие адреса имеют что-то общее, например, "1345 135th NE NE" и "1345 NE 135TH ST" имеют номер "1345".

У вас тогда будет меньше, чтобы сравнить себя. Это также уменьшило бы число, которое вы геолокатируете.