Мы ведем бизнес в основном в Соединенных Штатах и пытаемся улучшить взаимодействие с пользователем, объединяя все поля адреса в одну текстовую область. Но есть несколько проблем:
- Адрес, который вводит пользователь, может быть неправильным или в стандартном формате.
- Адрес должен быть разделен на части (улица, город, штат и т. Д.) Для обработки платежей по кредитным картам.
- Пользователи могут вводить не только свой адрес (например, свое имя или компанию с ним)
- Google может сделать это, но Условия предоставления услуг и ограничения запросов являются непомерными, особенно при ограниченном бюджете
Видимо, это общий вопрос:
- PHP скрипт для разбора адреса?
- Как мне разобрать адрес в свободном формате для сохранения в базе данных
- парсер почтовых адресов Java
- Более эффективный способ извлечения компонентов адреса
- Как я могу показать предварительно заполненный почтовый адрес на экране контактов с улицы, города, почтовый индекс на Android
- PHP regexp адрес в США
Есть ли способ изолировать адрес от текста вокруг него и разбить его на куски? Есть ли регулярное выражение для разбора адресов?
api
parsing
street-address
Matt
источник
источник
Ответы:
Я часто видел этот вопрос, когда работал в компании по проверке адресов. Я публикую ответ здесь, чтобы сделать его более доступным для программистов, которые ищут тот же вопрос. Компания, в которой я работал, обрабатывала миллиарды адресов, и мы многому научились в процессе.
Во-первых, нам нужно кое-что понять об адресах.
Адреса не регулярные
Это означает, что регулярные выражения отсутствуют. Я видел все это, от простых регулярных выражений, которые соответствуют адресам в очень конкретном формате, до этого:
... к этому, где файл класса строк из 900+ генерирует сверхмассивное регулярное выражение на лету, чтобы соответствовать еще большему количеству. Я не рекомендую их (например, вот скрипка из приведенного выше регулярного выражения, которая допускает множество ошибок ). Нет простой волшебной формулы, чтобы заставить это работать. В теории и по теории, это не представляется возможным , чтобы соответствовать адреса с регулярным выражением.
Публикация USPS 28 документирует множество возможных форматов адресов со всеми их ключевыми словами и вариантами. Хуже всего то, что адреса часто неоднозначны. Слова могут означать больше, чем одно («Святой» может быть «Святой» или «Улица»), и есть слова, которые, я уверен, они изобрели. (Кто знал, что "Стрэйвен" был уличным суффиксом?)
Вам понадобится код, который действительно понимает адреса, и если этот код существует, это коммерческая тайна. Но вы, вероятно, можете свернуть свои собственные, если вы действительно в этом.
Адреса бывают неожиданной формы и размера
Вот некоторые придуманные (но полные) адреса:
Даже они, возможно, действительны:
Очевидно, они не стандартизированы. Пунктуация и переносы строк не гарантируются. Вот что происходит:
Номер 1 завершен, потому что он содержит адрес, город и штат. С этой информацией достаточно идентифицировать адрес, и его можно считать «доставляемым» (с некоторой стандартизацией).
Номер 2 полон, поскольку он также содержит адрес улицы (с дополнительным номером / номером единицы) и 5-значный почтовый индекс, которого достаточно для идентификации адреса.
Номер 3 - это полный формат почтового ящика, поскольку он содержит почтовый индекс.
Номер 4 также завершен, потому что почтовый индекс является уникальным , что означает, что частное лицо или корпорация приобрели это адресное пространство. Уникальный почтовый индекс предназначен для больших объемов или сосредоточенных мест доставки. Все, что адресовано почтовому индексу 12345, отправляется в компанию General Electric в Скенектади, штат Нью-Йорк. Этот пример никому конкретно не дойдет, но USPS все равно сможет его доставить.
Номер 5 также завершен, хотите верьте, хотите нет. Только с этими числами полный адрес может быть обнаружен при анализе в базе данных всех возможных адресов. Заполнение пропущенных указателей, вторичного обозначения и кода ZIP + 4 тривиально, когда вы видите каждое число как компонент. Вот как это выглядит, полностью развернутое и стандартизованное:
Адресные данные не ваши
В большинстве стран, которые предоставляют официальные адресные данные лицензированным поставщикам, сами адресные данные принадлежат управляющему агентству. В США USPS владеет адресами. То же самое верно и для Почты Канады, Королевской почты и других, хотя в каждой стране право собственности определяется или определяется по-своему. Знание этого важно, так как обычно оно запрещает обратный инжиниринг базы данных адресов. Вы должны быть осторожны при получении, хранении и использовании данных.
Карты Google - обычное средство для быстрого исправления адресов, но TOS довольно запретительны; например, вы не можете использовать их данные или API-интерфейсы без отображения карты Google и только для некоммерческих целей (если вы не платите), а также вы не можете хранить данные (за исключением временного кэширования). Имеет смысл. Данные Google являются одними из лучших в мире. Однако Google Maps не проверяет адрес. Если адрес не существует, он еще покажет вам , где адрес будет , если он действительно существует (попробовать на собственной улице, используйте номер дома , который вы знаете , не существует). Иногда это полезно, но помните об этом.
Политика использования Nominatim также ограничивает, особенно для больших объемов и коммерческого использования, и данные в основном берутся из бесплатных источников, поэтому они не так хорошо поддерживаются (такова природа открытых проектов) - однако, это может все же подойти твои нужды. Его поддерживает большое сообщество.
У самого USPS есть API, но он сильно падает и не имеет никаких гарантий и поддержки. Это также может быть сложно использовать. Некоторые люди используют его экономно, без проблем. Но легко не заметить, что USPS требует, чтобы вы использовали их API только для подтверждения адресов для доставки через них.
Люди ожидают, что адреса будут сложными
К сожалению, мы заставили наше общество ожидать, что адреса будут сложными. По всему Интернету есть десятки хороших статей по UX, но факт в том, что если у вас есть адресная форма с отдельными полями, это то, чего ожидают пользователи, даже если это усложняет работу с крайними адресами, которые не соответствуют отформатируйте ожидаемую форму, или, возможно, для формы требуется поле, которого не должно быть. Или пользователи не знают, где разместить определенную часть своего адреса.
В наши дни я мог бы продолжать и говорить о плохом UX форм оформления заказа, но вместо этого я просто скажу, что объединение адресов в одно поле будет долгожданным изменением - люди смогут вводить свой адрес так, как они считают нужным. вместо того, чтобы пытаться выяснить вашу длинную форму. Однако это изменение будет неожиданным и поначалу может показаться пользователям немного неприятным. Просто знайте об этом.
Частично эту боль можно облегчить, поместив поле страны перед адресом. Когда они сначала заполняют поле страны, вы знаете, как сделать так, чтобы ваша форма отображалась. Возможно, у вас есть хороший способ справиться с адресами в США из одного поля, поэтому, если они выбирают Соединенные Штаты, вы можете свести форму к одному полю, в противном случае отобразить поля компонента. Просто вещи для размышления!
Теперь мы знаем, почему это сложно; Что вы можете сделать по этому поводу?
USPS лицензирует поставщиков через процесс, называемый CASS ™ Certification, для предоставления клиентам проверенных адресов. Эти поставщики имеют доступ к базе данных USPS, обновляемой ежемесячно. Их программное обеспечение должно соответствовать строгим стандартам для сертификации, и они не часто требуют согласия на такие ограничивающие условия, как описано выше.
Существует много компаний, сертифицированных CASS, которые могут обрабатывать списки или иметь API: Melissa Data, Experian QAS и SmartyStreets.
(В связи с тем, что я получил «рекламу», я обрезал свой ответ на этом этапе. Вам решать, какое решение подойдет вам.)
Правда: действительно, ребята, я не работаю ни в одной из этих компаний. Это не реклама.
источник
libpostal: библиотека с открытым исходным кодом для анализа адресов, обучение работе с данными из OpenStreetMap, OpenAddresses и OpenCage.
https://github.com/openvenues/libpostal ( дополнительная информация об этом )
Другие инструменты / услуги:
http://www.gisgraphy.com Бесплатный веб- сервис с открытым исходным кодом и готовый к использованию геокодер и геолокализация, включая OpenStreetMap, GeoNames и Quattroshapes.
https://github.com/kodapan/osm-common Библиотека для доступа к службам OpenStreetMap, анализа и обработки данных.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
источник
Есть много парсеров адресов. Они бывают двух основных типов: те, которые имеют базы данных названий мест и улиц, и те, которые не имеют.
Синтаксический анализатор уличных адресов с регулярным выражением может достигать 95% успеха без особых проблем. Тогда вы начинаете поражать необычные случаи. Perl в CPAN, "Geo :: StreetAddress :: US", примерно так хорош. Есть порты Python и Javascript, все с открытым исходным кодом. У меня есть улучшенная версия в Python, которая немного увеличивает вероятность успеха, обрабатывая больше случаев. Однако, чтобы получить последние 3%, вам нужны базы данных, чтобы помочь в устранении неоднозначности.
База данных с 3-значными почтовыми индексами, а также названиями и сокращениями штатов США очень помогает. Когда анализатор видит непротиворечивый почтовый индекс и название штата, он может начать привязываться к формату. Это очень хорошо работает для США и Великобритании.
Правильный синтаксический анализ адреса начинается с конца и работает в обратном направлении. Вот как это делают системы USPS. Адреса наименее неоднозначны в конце, где названия стран, названия городов и почтовые индексы относительно легко распознать. Названия улиц обычно можно выделить отдельно. Места на улицах сложнее всего анализировать; там вы встретите такие вещи, как «Пятый этаж» и «Стейплс Павильон». Вот когда база данных очень помогает.
источник
ОБНОВЛЕНИЕ: Geocode.xyz теперь работает по всему миру. Для примеров смотрите https://geocode.xyz
Для США, Мексики и Канады см. Geocoder.ca .
Например:
Вы также можете проверить результаты в веб-интерфейсе или получить вывод в виде Json или Jsonp. например. Я ищу рестораны около 123 Main Street, Нью-Йорк
источник
geocode.xyz
«sscantext
метод не удалось большую часть времени. Он всегда выбирал «Женева, США», а не «Женева, Швейцария» и был в целом предвзятым для США.Нет кода? Стыдно!
Вот простой парсер адресов JavaScript. Это довольно ужасно по каждой причине, которую Мэтт приводит в своей диссертации выше (с чем я почти на 100% согласен: адреса - это сложные типы, а люди совершают ошибки; лучше, если вы можете себе это позволить, использовать это на стороне и автоматизировать).
Но вместо того, чтобы плакать, я решил попробовать:
Этот код работает нормально для анализа большинства результатов Esri для
findAddressCandidate
а также с некоторыми другими (обратными) геокодерами, которые возвращают однострочный адрес, где улица / город / штат разделены запятыми. Вы можете расширить, если хотите, или написать парсер для конкретной страны. Или просто используйте это как пример того, насколько сложным может быть это упражнение или насколько я паршив в JavaScript. Признаюсь, я потратил на это всего около тридцати минут (будущие итерации могут добавить кеши, проверку почтового индекса и поиск состояния, а также контекст местоположения пользователя), но это сработало для моего варианта использования: конечный пользователь видит форму, которая анализирует ответ поиска геокода на 4 Textboxes. Если разбор адреса оказывается неправильным (что бывает редко, если исходные данные не были плохими), ничего страшного - пользователь может проверить и исправить это! (Но для автоматизированных решений можно либо отбросить / игнорировать, либо пометить как ошибку, чтобы разработчик мог либо поддерживать новый формат, либо исправлять исходные данные.)источник
Если вы хотите полагаться на данные OSM, libpostal очень мощный и обрабатывает множество наиболее распространенных ошибок при вводе адреса.
источник
Другой вариант для адресов в США - это YAddress (созданный компанией, в которой я работаю).
Многие ответы на этот вопрос предлагают в качестве решения инструменты геокодирования. Важно не путать парсинг адресов и геокодирование; Они не одинаковы. Хотя геокодеры могут разбивать адрес на компоненты в качестве побочного преимущества, они обычно полагаются на нестандартные наборы адресов. Это означает, что адрес, проанализированный геокодером, может не совпадать с официальным адресом. Например, то, что API геокодирования Google называет «6-й авеню» на Манхэттене, USPS называет «авеню Америки».
источник
Для анализа адресов США
Я предпочитаю использовать пакет usaddress, который доступен в pip только для usaddress
Документация
PyPi
Это хорошо сработало для меня в США.
Выполнение address_parser.py
источник
В одном из наших проектов мы использовали следующий парсер адресов. Он с хорошей точностью анализирует адреса большинства стран мира.
http://address-parser.net/
Он доступен как отдельная библиотека или как живой API.
источник
Я опаздываю на вечеринку, вот сценарий Excel VBA, который я написал несколько лет назад для Австралии. Его можно легко изменить для поддержки других стран. Я сделал GitHub-репозиторий кода C # здесь. Я разместил его на своем сайте, и вы можете скачать его здесь: http://jeremythompson.net/rocks/ParseAddress.xlsm
стратегия
Для любой страны с числовым кодом PostCode, который может быть сопоставлен с RegEx, моя стратегия работает очень хорошо:
Сначала мы обнаруживаем Имя и Фамилию, которые считаются верхней строкой. Легко пропустить имя и начать с адреса, сняв флажок (называемый «Имя - верхний ряд», как показано ниже).
Затем можно ожидать, что Адрес, состоящий из улицы и номера, будет находиться перед Пригородом, а St, Pde, Ave, Av, Rd, Cres, loop и т. Д. Являются разделителями.
Обнаружение пригорода против штата и даже страны может обмануть самые сложные парсеры, поскольку могут возникнуть конфликты. Чтобы преодолеть это, я использую поиск по PostCode, основываясь на том факте, что после удаления номеров улиц и квартир / квартир, а также PoBox, Ph, Fax , Mobile и т. Д. Останется только номер PostCode. Это легко сопоставить с regEx, чтобы потом искать пригород (ы) и страну.
пример
Код VBA
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ, я знаю, что этот код не идеален или даже не написан хорошо, но его очень легко преобразовать на любой язык программирования и запустить в любом типе приложения. Стратегия - это ответ в зависимости от вашей страны и правил, возьмите этот код в качестве примера :
источник