Есть ли библиотека для анализа адресов в США? - PullRequest
20 голосов
/ 27 февраля 2012

У меня есть список адресов в США, которые мне нужно разбить на город, штат, почтовый индекс, штат и т. Д.

пример адреса: "16100 Sand Canyon Avenue, Suite 380 Ирвин, Калифорния 92618 "

Кто-нибудь знает библиотеку или бесплатный API для этого? Геокодер Google / Yahoo запрещается использовать TOS для коммерческих проектов.

Было бы здорово найти библиотеку python, которая преформирует это.

Ответы [ 7 ]

24 голосов
/ 07 марта 2015

Многим из этих ответов уже несколько лет.

Самая пуленепробиваемая библиотека, которую я когда-либо видел, это usaddress: https://github.com/datamade/usaddress:

  • Гораздо точнее, чем address, который мы использовали в течение года https://pypi.python.org/pypi/address/0.1.1.
  • Все же увидеть, что это не сработало на адресе
  • На момент написания этой статьи все еще привержен

Совет для профессионалов: при тестировании адресов во всех этих библиотеках используйте 1) без запятых в вашем адресе, 2) названия городов из нескольких слов, желательно с "St." в названии, чтобы увидеть, может ли библиотека различать «улицу» и «святую» (например, Сент-Луис), и 3) неправильный корпус. Эта комбинация обычно делает даже лучшие парсеры падающими.

17 голосов
/ 27 февраля 2012

Pyparsing имеет множество функций для разбора уличных адресов, посмотрите пример здесь: http://pyparsing.wikispaces.com/file/view/streetAddressParser.py

8 голосов
/ 07 июня 2013

Проверьте этот пакет Python: https://github.com/SwoopSearch/pyaddress

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

5 голосов
/ 28 февраля 2012

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

Имейте в виду, что такое решение подразумевает, что в какой-то момент вы будете стандартизировать недействительные адреса ... они просто будут выглядеть действительными.Если для вашего приложения важно знать, является ли адрес действительно реальным (и, возможно, подлежащим доставке), вам следует использовать сертифицированную USPS услугу, которая использует проверку точки доставки (DPV).Я являюсь разработчиком SmartyStreets , который предоставляет именно такую ​​услугу вместе с SDK, которые упрощают интеграцию ( вот краткий пример ).

Ответы возвращаютсястандартизировано в соответствии с публикацией USPS 28. API является бесплатным для пользователей с низким уровнем использования.

1 голос
/ 06 апреля 2017

Я знаю, что это старый пост, но кто-то может найти его полезным: https://usaddress.readthedocs.io/en/latest/

>>> import usaddress
>>> usaddress.parse('Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637')
[('Robie', 'BuildingName'),
('House,', 'BuildingName'),
('5757', 'AddressNumber'),
('South', 'StreetNamePreDirectional'),
('Woodlawn', 'StreetName'),
('Avenue,', 'StreetNamePostType'),
('Chicago,', 'PlaceName'),
('IL', 'StateName'),
('60637', 'ZipCode')]

Или:

>>> import usaddress
>>> usaddress.tag('Robie House, 5757 South Woodlawn Avenue, Chicago, IL 60637')
(OrderedDict([
   ('BuildingName', 'Robie House'),
   ('AddressNumber', '5757'),
   ('StreetNamePreDirectional', 'South'),
   ('StreetName', 'Woodlawn'),
   ('StreetNamePostType', 'Avenue'),
   ('PlaceName', 'Chicago'),
   ('StateName', 'IL'),
   ('ZipCode', '60637')]),
'Street Address')

>>> usaddress.tag('State & Lake, Chicago')
(OrderedDict([
   ('StreetName', 'State'),
   ('IntersectionSeparator', '&'),
   ('SecondStreetName', 'Lake'),
   ('PlaceName', 'Chicago')]),
'Intersection')

>>> usaddress.tag('P.O. Box 123, Chicago, IL')
(OrderedDict([
   ('USPSBoxType', 'P.O. Box'),
   ('USPSBoxID', '123'),
   ('PlaceName', 'Chicago'),
   ('StateName', 'IL')]),
'PO Box')
0 голосов
/ 23 мая 2019

Существует мощная библиотека с открытым исходным кодом libpostal , которая очень хорошо подходит для этого варианта использования.Есть привязки к разным языкам программирования.Libpostal - это библиотека C для синтаксического анализа / нормализации уличных адресов по всему миру с использованием статистических НЛП и открытых данных.Цель этого проекта - понять строки на основе местоположения на любом языке, везде.

Я создал простой образ Docker с Python-привязкой Python, который вы можете легко раскрутить и попробовать Pypostal-Docker

0 голосов
/ 25 сентября 2013

Тщательно проверьте ваш набор данных, чтобы убедиться, что эта проблема еще не была решена для вас.

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

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

...