Как разобрать произвольную улицу / почтовый адрес из текста в компоненты

92

Мы ведем бизнес в основном в Соединенных Штатах и ​​стараемся улучшить работу пользователей, объединив все поля адресов в единую текстовую область. Но есть несколько проблем:

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

По-видимому, это общий вопрос:

Есть ли способ изолировать адрес от текста вокруг него и разбить его на кусочки? Есть ли регулярное выражение для анализа адресов?

  • 0
    Ответы ниже более полезны, потому что они не игнорируют глобальную проблему - адреса не соответствуют общему шаблону.
Теги:
parsing
street-address

6 ответов

209
Лучший ответ

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

Во-первых, нам нужно понять несколько вещей о адресах.

Адреса не regular

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

/\ S + (\ d {2,5}\S +) ([а | р]?! Т\б) (([A-Za-Z |\S +] {1,5}) {1,? 2}) ([\ S | \, |.] +), (([A-Za-Z |\S +]? {1,30}) {1,4}) (суд | кт | улица | й | привод | др | пер | пер | дорога | й | б-р) ([\ S | \, | | \;.]? +) (([A-Za-Z |\S +] {1,30}) {1, 2}) ([\ S | \, |.] +)\Ъ (АК |? АЛ | АР | AZ | CA | СО | КТ | DC | DE | FL | Г.А. | ГУ | HI | IA | ID | IL | IN | KS | KY | LA | MA | MD | ME | MI | MN | МО | MS | MT | NC | ND | NE | NH | NJ | NM | NV | NY | OH | OK | ИЛИ | PA | RI | SC | SD | TN | ТХ | УТ | ВА | VI | ВТ | ВД | WI | WV | Вайоминг) ([\ s | \, |.]? +) (\ s +\д {5}) (? [\ S |\|.] +)/я

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

Публикация USPS 28 документирует множество форматов адресов, которые возможны, со всеми их ключевыми словами и вариантами. Хуже всего, адреса часто неоднозначны. Слова могут означать более одного ( "Св" может быть "Святой" или "Улица" ), и есть слова, которые я уверен, что они придумали. (Кто знал, что "Stravenue" был уличным суффиксом?)

Вам нужен код, который действительно понимает адреса, и если этот код существует, это коммерческий секрет. Но вы, вероятно, можете бросить свои собственные, если вы действительно в это вникнете.

Адреса имеют неожиданные формы и размеры

Вот некоторые надуманные (но полные) адреса:

1)  102 main street
    Anytown, state

2)  400n 600e #2, 52173

3)  p.o. #104 60203

Возможно, это возможно:

4)  829 LKSDFJlkjsdflkjsdljf Bkpw 12345

5)  205 1105 14 90210

Очевидно, что они не стандартизированы. Пунктуация и разрывы строк не гарантируются. Вот что происходит:

  • Номер 1 завершен, поскольку содержит адрес и город и штат. С этой информацией достаточно идентифицировать адрес, и его можно считать "поставляемым" (с некоторой стандартизацией).

  • Номер 2 завершен, так как он также содержит адрес улицы (со вторым номером/номером) и 5-значный почтовый индекс, который достаточно для идентификации адреса.

  • Номер 3 - это полный формат почтового ящика, так как он содержит почтовый индекс.

  • Номер 4 также завершен, потому что почтовый индекс уникален, что означает, что частный объект или Корпорация приобрела это адресное пространство. Уникальный почтовый индекс предназначен для больших или концентрированных помещений доставки. Все, что обращается к почтовому индексу 12345, отправляется в General Electric в Скенектади, штат Нью-Йорк. Этот пример не достигнет никого, в частности, но USPS все равно сможет его доставить.

  • Номер 5 также завершен, верьте или нет. С помощью этих чисел полный адрес может быть обнаружен при анализе базы данных всех возможных адресов. Заполнение недостающих направлений, вторичного указателя и кода ZIP + 4 тривиально, когда вы видите каждое число в качестве компонента. Здесь, как он выглядит, полностью расширен и стандартизирован:

205 N 1105 Вт Apt 14

Беверли-Хиллз CA 90210-5221

Адресные данные не являются вашими собственными

В большинстве стран, которые предоставляют официальные адресные данные лицензированным поставщикам, сами адресные данные принадлежат к управляющему агентству. В США USPS владеет адресами. То же самое верно для Canada Post, Royal Mail и других, хотя каждая страна вводит в действие или определяет право собственности немного по-другому. Знание этого важно, поскольку оно обычно запрещает обратную разработку адресной базы данных. Вы должны быть осторожны, как приобретать, хранить и использовать данные.

Google Maps является распространенным решением для быстрого исправления адресов, но TOSявляется довольно запретительным; например, вы не можете использовать свои данные или API без отображения Карты Google и только для некоммерческих целей (если вы не платите), и вы не можете хранить данные (за исключением временного кэширования). Имеет смысл. Данные Google являются одними из лучших в мире. Однако Google Maps не проверяет адрес. Если адрес не существует, он все равно покажет вам, где будет адрес, если он существует (попробуйте на своей улице, используйте номер дома, который, как вы знаете, не существует). Иногда это полезно, но имейте это в виду.

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

У USPS есть API, но он сильно падает и не имеет никаких гарантий и поддержки. Это также может быть трудно использовать. Некоторые люди используют его без проблем. Но легко пропустить, что USPS требует, чтобы вы использовали свой API только для подтверждения адресов для отправки через них.

Люди ожидают, что адреса будут жесткими

К сожалению, мы вынудили наше общество ожидать, что адреса будут сложными. В этом есть десятки хороших статей UX по всему Интернету, но факт заключается в том, что если у вас есть адресная форма с отдельными полями, то, что ожидают пользователи, даже если это затрудняет адреса в крайнем случае, которые не соответствуют формат формы ожидает, или, может быть, форма требует поля, которое не должно. Или пользователи не знают, где разместить определенную часть своего адреса.

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

Часть этой боли можно смягчить, поставив поле страны на фронт, перед адресом. Когда они сначала заполняют поле страны, вы знаете, как сделать свою форму. Возможно, у вас есть хороший способ справиться с однопользовательскими адресами США, поэтому, если они выберут Соединенные Штаты, вы можете уменьшить свою форму до одного поля, иначе отобразите поля компонентов. Просто о чем подумать!

Теперь мы знаем, почему это сложно; что вы можете с этим сделать?

Поставщики лицензий USPS через процесс под названием CASS Certification для предоставления проверенных адресов клиентам. Эти поставщики имеют доступ к базе данных USPS, обновляемой ежемесячно. Их программное обеспечение должно соответствовать строгим стандартам, которые должны быть сертифицированы, и они не часто требуют согласия с такими предельными условиями, как обсуждалось выше.

Есть много сертифицированных CASS компаний, которые могут обрабатывать списки или иметь API: Melissa Data, Experian QAS и SmartyStreets, чтобы назвать несколько.

(Из-за того, что я получил "рекламу", я урезал свой ответ на данный момент. Вам решать, какое решение вам подходит.)

Правда: На самом деле, ребята, я не работаю ни в одной из этих компаний. Это не реклама.

  • 1
    А как насчет адресов Южной Америки (Уругвай)? : D
  • 1
    @ Барт Я не знаю службы, которая поддерживает извлечение адресов из Уругвая, извините!
Показать ещё 15 комментариев
7

Есть много парсеров уличных адресов. Они представлены в двух основных вариантах: те, которые имеют базы данных с названиями мест и названиями улиц, а также те, которые этого не делают.

Анализатор уличного адреса регулярного выражения может получить около 95% успеха без особых проблем. Затем вы начинаете сталкиваться с необычными случаями. Perl один в CPAN, "Geo:: StreetAddress:: US", об этом хорош. Есть порты Python и Javascript этого, все с открытым исходным кодом. У меня улучшенная версия в Python, которая немного улучшает скорость, обрабатывая больше случаев. Однако, чтобы получить последние 3% права, вам нужны базы данных, которые помогут с устранением неоднозначности.

База данных с 3-значными почтовыми индексами и названиями и сокращениями в США является большой помощью. Когда синтаксический анализатор видит последовательный почтовый индекс и имя состояния, он может начать блокировку в формате. Это очень хорошо работает для США и Великобритании.

Правильный анализ уличного адреса начинается с конца и работает назад. Это то, как это делают системы USPS. Адреса наименее двусмысленны в конце, где имена стран, названия городов и почтовые коды относительно легко распознаются. Названия улиц обычно могут быть изолированы. Местоположения на улицах являются наиболее сложными для анализа; там вы сталкиваетесь с такими вещами, как "Пятый этаж" и "Скрепки павильона". Это, когда база данных является большой помощью.

  • 0
    Существует также модуль CPAN Lingua: EN :: AddressParse. Хотя он медленнее, чем "Geo :: StreetAddress :: US", он дает более высокий уровень успеха.
6

Я создал систему анализа адресов, которая принимает в качестве входного текста свободной формы и извлекает из нее адреса. Данные, которые я использую, относятся к openaddresses.io (по открытой лицензии).
API находится здесь: geocode.xyz (работает только для Испании на данный момент)

Например:

Вход: Мне нужно место, чтобы остаться возле Плаза Волатера 3 Парка де Негосиос Мас Блау И Эль Прат де Льобрегат 08820 Испания на пару дней

Выход:

<geodata>
    <latt>41.3189957000</latt>
    <longt>2.0746469000</longt>
    <standard>
       <stnumber>3</stnumber>
       <staddress>VOLATERIA Plaza</staddress>
       <city>EL PRAT DE LLOBREGAT</city>
       <prov>ES</prov>
       <confidence>0.8</confidence>
    </standard>
 </geodata>

(Возможно, он немного медленный, он работает на экземпляре Amazon Micro с 1G оперативной памяти и одним процессором. Если это слишком медленно для вас, получите свой собственный сервер с предоставленным AMI.)

Для США, Мексики и Канады см. geocoder.ca.

Например:

Вход: что-то происходит рядом с пересечением главного и артурского убийства rd new york

Вывод:

<geodata>
  <latt>40.5123510000</latt>
  <longt>-74.2500500000</longt>
  <AreaCode>347,718</AreaCode>
  <TimeZone>America/New_York</TimeZone>
  <standard>
    <street1>main</street1>
    <street2>arthur kill</street2>
    <stnumber/>
    <staddress/>
    <city>STATEN ISLAND</city>
    <prov>NY</prov>
    <postal>11385</postal>
    <confidence>0.9</confidence>
  </standard>
 </geodata>

Вы также можете проверить результаты в веб-интерфейсе или получить выходные данные как Json или Jsonp. например. Я ищу рестораны вокруг 123 Main Street, Нью-Йорк

  • 0
    Как вы реализовали систему парсинга адресов, используя openaddress? Вы используете стратегию грубой силы?
  • 1
    Что вы подразумеваете под "грубой силой"? Разбиение текста на все возможные комбинации возможных адресных строк и сравнение каждой из них с базой данных адресов нецелесообразно и потребует гораздо больше времени для предоставления ответа, чем эта система. Открытые адреса являются одним из источников данных для построения «обучающего набора» форматов адресов для алгоритма. Он использует эту информацию для анализа адресов из неструктурированного текста.
Показать ещё 3 комментария
3

libpostal: библиотека с открытым исходным кодом для анализа адресов, обучения данными из OpenStreetMap, OpenAddresses и OpenCage.

https://github.com/openvenues/libpostal (больше информации об этом)

Другие инструменты/услуги:

1

Если вы хотите полагаться на данные OSM libpostal, он очень эффективен и обрабатывает множество наиболее распространенных оговорок с адресными входами.

  • 0
    Я думаю, что ваш ответ является дубликатом этого поста. Хорошее предложение, хотя.
0

В одном из наших проектов мы использовали следующий парсер адресов. Он анализирует адреса для большинства стран мира с хорошей точностью.

http://address-parser.net/

Он доступен как автономная библиотека или как живой API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню