Подтвердить что ты не робот

Есть ли библиотека для анализа адресов в США?

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

пример адреса: "16100 Sand Canyon Avenue, Suite 380 Irvine, CA 92618"

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

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

4b9b3361

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Я знаю, что это старый пост, но кому-то это может показаться полезным: 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')

Ответ 6

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

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

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

Ответ 7

usaddress.tag('Robie House, 5757 South Woodlawn Avenue, Чикаго, IL 60637') (OrderedDict ([('BuildingName', 'Robie House'), ('AddressNumber', '5757'), ('StreetNamePreDirectional', ' Юг ", (" StreetName "," Woodlawn "), (" StreetNamePostType "," Avenue "), (" PlaceName "," Chicago "), (" StateName "," IL "), (" ZipCode "," 60637 ')]), "Улица")

Как сохранить эти данные в Excel (заголовок и значения) в Python

Ответ 8

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

Я создал простой образ Docker с Python, связывающим pypostal, который вы можете раскрутить и очень легко попробовать pypostal-docker