Разбор пригодного адреса, города, штата, почтового индекса из строки [закрыто]

Проблема: у меня есть поле адреса из базы данных Access, которая была преобразована в Sql Server 2005. В этом поле все находится в одном поле. Мне нужно разобрать отдельные разделы адреса в соответствующие поля в нормализованной таблице. Мне нужно сделать это для примерно 4000 записей, и это должно быть повторяемым.

Предположения:

  1. Предположим, адрес в США (пока)

  2. Предположим, что входная строка иногда будет содержать адресата (адрес человека) и / или второй адрес улицы (например, Suite B)

  3. состояния могут быть сокращены

  4. почтовый индекс может быть стандартным 5 цифр или почтовый индекс + 4

  5. в некоторых случаях есть опечатки

ОБНОВЛЕНИЕ: В ответ на поставленные вопросы стандарты не всегда соблюдались, мне нужно хранить отдельные значения, а не только геокод, а ошибки означают опечатку (исправлено выше)

Образец данных:

  • AP Croll & Son 2299 Lewes-Georgetown Hwy, Джорджтаун, DE 19947

  • 11522 Shawnee Road, Greenwood DE 19950

  • 144 Kings Highway, SW Dover, DE 19901

  • Интегрированный Const. Услуги 2 Penns Way Suite 405 New Castle, DE 19720

  • Humes Realty 33 Bridle Ridge Court, Льюис, DE 19958

  • Раскопки Николс 2742 Пуласки Hwy Ньюарк, DE 19711

  • 2284 Bryn Zion Road, Смирна, DE 19904

  • VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Балтимор, MD 21

  • 580 North Dupont Highway Dover, DE 19901

  • PO Box 778 Dover, DE 19903

19.08.2008 15:34:41
Пара вопросов: 1. Есть ли разделители? 2. Каков порядок полей в строке? 3. Какое поведение вы хотите в случае ошибки данных (например, EG помещает адрес в одно поле в таблице SQL, оставляя другие пустыми)
Jay Mooney 19.08.2008 15:41:21
Хороший вопрос и очень интересные ответы. Работа в обратном направлении от zip кажется обычной темой, но если вы берете необработанные данные от клиентов, zip может быть неточным. Я предполагаю, что большинство сайтов имеют непропорциональное количество адресов в 90210, например.
Kevin Williams 22.09.2010 17:19:15
@Kevin: Да, потому что вы, американцы, хотели бы заблокировать нас, канадцев, потребовав «почтовый индекс» и не принимая наши почтовые индексы, что вынуждает нас вводить некоторую неряшливость, чтобы обойти систему ... к сожалению, единственный почтовый индекс, который я знаю, это 90210 :-) Редактировать: Бессмысленно ... вы, очевидно, живете в нескольких километрах от меня в Британской Колумбии. Вы, вероятно, тоже делаете то же самое :-P
mpen 28.12.2010 04:03:11
Смотрите этот вопрос SO для расширенного обзора этого.
Matt 24.06.2012 04:07:36
24 ОТВЕТА
РЕШЕНИЕ

Я проделал большую работу по этому виду анализа. Поскольку есть ошибки, вы не получите 100% точности, но есть несколько вещей, которые вы можете сделать, чтобы пройти большую часть пути, а затем выполнить визуальный тест BS. Вот общий способ сделать это. Это не код, потому что писать его довольно академично, в этом нет ничего странного, просто много обработки строк.

(Теперь, когда вы опубликовали некоторые образцы данных, я внес небольшие изменения)

  1. Работать задом наперед. Начните с почтового индекса, который будет ближе к концу, и в одном из двух известных форматов: XXXXX или XXXXX-XXXX. Если это не появляется, вы можете предположить, что находитесь в городе, штатная часть, ниже.
  2. Следующим, перед zip, будет состояние, и оно будет либо в двухбуквенном формате, либо в виде слов. Вы тоже знаете, что это будет - их всего 50. Кроме того, вы можете озвучить слова, чтобы компенсировать орфографические ошибки.
  3. до этого город, и он, вероятно, на одной линии с государством. Вы можете использовать базу данных почтовых индексов для проверки города и штата на основе почтового индекса или, по крайней мере, использовать ее в качестве детектора BS.
  4. Уличный адрес обычно будет состоять из одной или двух строк. Вторая строка, как правило, будет номером набора, если он есть, но это также может быть почтовый ящик.
  5. Будет почти невозможно обнаружить имя в первой или второй строке, хотя, если оно не имеет префикса с номером (или если оно имеет префикс «attn:» или «Внимание к:», это может дать вам подсказку как будь то имя или адресная строка.

Надеюсь, это поможет несколько.

117
19.08.2008 15:52:05
Хотя в действительности существует 50 штатов, USPS говорит, что в домене Почтовой службы США есть 59 двухбуквенных аббревиатур, 65, если учитывать американские вооруженные силы. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall' 26.07.2011 21:48:46
«Только 50» должно было указать, что есть довольно небольшое число. Это может быть «только 65», но это не важно для решения проблемы.
Tim Sullivan 26.07.2011 21:55:06
Этот алгоритм также подробно описан в публикации USPS 28
Matt 28.10.2012 15:23:13

Это не решит вашу проблему, но если вам нужны только данные широты и долготы для этих адресов, API Карт Google будет хорошо анализировать неформатированные адреса.

3
19.08.2008 15:40:15

Существуют ли какие-либо стандарты в отношении того, как записываются адреса? Например:

  1. Всегда ли запятые или новые строки отделяют улицу 1 от улицы 2 от города от штата от почтового индекса?
  2. Всегда ли прописаны типы адресов (дорога, улица, бульвар и т. Д.)? всегда сокращенно? Некоторые из каждого?
  3. Определите «ошибка».

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

6
19.08.2008 15:40:18

Существуют службы передачи данных, которым присвоен почтовый индекс, и вы получите список названий улиц в этом почтовом индексе.

Используйте регулярные выражения для извлечения Zip или City State - найдите правильный или, если ошибка, получите оба. вытащите список улиц из источника данных. Исправьте город и штат, а затем адрес улицы. После того, как вы получите действительную адресную строку 1, город, штат и почтовый индекс, вы можете сделать допущения в адресной строке 2..3

1
19.08.2008 15:52:48

На основании данных выборки:

  1. Я бы начал в конце строки. Разбор почтового индекса (любой формат). Прочитайте конец первого пробела. Если почтовый индекс не найден, ошибка.

  2. Обрежьте конец для пробелов и специальных символов (запятых)

  3. Затем перейдите к состоянию, снова используйте пробел в качестве разделителя. Возможно, используйте список поиска для проверки двухбуквенных кодов состояний и полных имен состояний. Если действительное состояние не найдено, ошибка.

  4. Обрежьте пробелы и запятые с конца снова.

  5. Город становится сложным, я бы на самом деле использовал запятую здесь, рискуя получить слишком много данных в городе. Ищите запятую или начало строки.

  6. Если в строке еще остались символы, вставьте все это в поле адреса.

Это не идеально, но это должно быть довольно хорошей отправной точкой.

5
19.08.2008 15:55:41

Еще один запрос на образец данных.

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

Как только у вас есть zip, я бы запросил базу данных zip, сохранил результаты и удалил их и zip из строки.

Это оставит вас с адресом беспорядка. Адреса MOST (All?) Будут начинаться с числа, поэтому найдите первое вхождение числа в оставшейся строке и захватите все, начиная с него (до (нового) конца строки). Это будет твой адрес. Что-нибудь слева от этого номера, скорее всего, адресат.

Теперь вы должны хранить город, штат и почтовый индекс в таблице и, возможно, две строки, адресата и адрес. Для адреса проверьте наличие «Suite» или «Apt». и т. д. и разделить это на два значения (адресные строки 1 и 2).

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

Я не думаю, что есть какой-то способ разобрать со 100% точностью.

6
19.08.2008 16:03:28

Я делал это в прошлом.

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

Ручная обработка займет около 10 секунд каждая, то есть вы можете сделать 3600/10 = 360 в час, поэтому 4000 займет у вас примерно 11-12 часов. Это даст вам высокую точность.

Для автоматизации вам нужна свежая база данных адресов в США, и вы должны изменить свои правила. Я предлагаю не увлекаться регулярным выражением (трудно поддерживать в долгосрочной перспективе, так много исключений). Перейти на 90% совпадение с базой данных, остальное сделайте вручную.

Получите копию Стандартов почтовой адресации (USPS) по адресу http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf и обратите внимание, что ее длина составляет более 130 страниц. Регулярные выражения для реализации, что было бы чокнутым.

Для международных адресов все ставки отключены. Работники из США не смогут проверить.

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

Более того: когда вы отправляете материал по почте (для чего он нужен, верно?), Убедитесь, что вы положили «запрос исправления адреса» на конверт (в нужном месте) и обновили базу данных. (Мы сделали простой графический интерфейс для человека на стойке регистрации, чтобы сделать это; человек, который на самом деле сортирует по почте)

Наконец, когда вы очистили данные, поищите дубликаты.

16
19.08.2008 16:31:12

Если данные введены человеком, вы потратите слишком много времени, пытаясь закодировать вокруг исключений.

Пытаться:

  1. Регулярное выражение для извлечения почтового индекса

  2. Поиск почтового индекса (через соответствующую правительственную базу данных), чтобы получить правильный адрес

  3. Получить стажера, чтобы вручную проверить новые данные соответствуют старым

4
19.08.2008 16:47:16

Это не решит вашу проблему, но если вам нужны только данные широты и долготы для этих адресов, API Карт Google будет хорошо анализировать неформатированные адреса.

Хорошее предложение, в качестве альтернативы вы можете выполнить запрос CURL для каждого адреса в Google Maps, и он вернет правильно отформатированный адрес. Исходя из этого, вы можете отгадать содержание вашего сердца.

8
19.08.2008 16:51:08

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

13
19.08.2008 17:08:25

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

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

Передача parseAddressфункции «AP Croll & Son 2299 Lewes-Georgetown Hwy, Джорджтаун, DE 19947» возвращает:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
14
24.09.2013 18:05:03

Я думаю, что проблема заключается в аутсорсинге: отправьте его в геокодер Google (или Yahoo). Геокодер возвращает не только широту / долготу (которые здесь не интересны), но и богатый разбор адреса с заполненными полями, которые вы не отправляли (включая ZIP + 4 и округ).

Например, разбор «1600 Amphitheatre Parkway, Mountain View, CA» дает

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

Теперь это разбирается!

92
19.08.2008 20:30:52
Поскольку это пакетный процесс, я бы также предложил использовать пул потоков для геокодирования, чтобы можно было отправлять несколько адресов одновременно (поддерживает ли Google какой-либо пакетный интерфейс?)
David 18.05.2009 14:17:34
Это не очень поможет с адресной строкой (пункт 5 в вопросе)
Christopher Mahan 2.01.2010 07:31:44
Условия предоставления услуг часто являются ограничивающим фактором для коммерческого и / или непубличного использования.
Jay 19.03.2010 19:53:10
Это хорошее решение, но в некоторых случаях Google / Yahoo не возвращает результаты, например, новые адреса и адреса, которые просто отсутствуют в их базе данных.
Peter DeWeese 2.05.2012 16:52:10
это было бы хорошим решением «ЕСЛИ» Google не ограничивал пакетные вызовы для своих API-интерфейсов MAPS
Hector 30.03.2015 07:56:26

RecogniContact - это COM-объект Windows, который анализирует адреса США и Европы. Вы можете попробовать это прямо на http://www.loquisoft.com/index.php?page=8

3
12.05.2009 14:07:31
RecogniContact, кажется, закрыт для публики. Для доступа требуется отправить контактную форму, но ответа нет. Может быть, кто-то еще знает, как связаться с ними.
Luke Van In 10.02.2017 05:22:08

Попробуйте www.address-parser.com . Мы используем их веб-сервис, который вы можете проверить онлайн

6
8.02.2010 14:53:10
Это хорошо работает для чего-то вроде поиска адреса в большом HTML-документе. Я просто хотел бы, чтобы у них был интерфейс REST, а не SOAP. Спасибо, что поделился этой ссылкой.
jspooner 26.11.2011 18:05:50
Если вы связаны с ними, вы должны раскрыть это.
Matt 8.05.2013 20:24:57
Было бы хорошо, если бы они дали оценку цены, а не требовали, чтобы я сказал им, насколько ценны их услуги, прежде чем давать цену.
Toaster 3.11.2014 10:34:59

+1 к предложенному Джеймсом Розену решению, поскольку оно хорошо сработало для меня, однако для полных участников этот сайт - увлекательное чтение и лучшая попытка, которую я видел при документировании адресов по всему миру: http://www.columbia.edu/kermit /postal.html

7
26.07.2011 21:38:10

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

Если вы строго в США ... получите огромную базу данных всех почтовых индексов, штатов, городов и улиц. Теперь поищите их в своих адресах. Вы можете проверить, что вы нашли, протестировав, например, если найденный вами город существует в найденном вами штате, или проверив, существует ли найденная улица в найденном вами городе. Если нет, скорее всего, Джон не для улицы Джона, но это имя адресата ... По сути, получите как можно больше информации и проверьте свои адреса по ней. Экстремальным примером может быть получение СПИСКА ВСЕХ АДРЕСОВ В США А, а затем поиск того, какой из них наиболее соответствует каждому из ваших адресов ...

1
1.10.2010 02:50:01

Поскольку существует вероятность ошибки в слове, подумайте об использовании SOUNDEX в сочетании с алгоритмом LCS для сравнения строк, это очень поможет!

2
22.01.2011 12:49:26

Вы можете проверить это !! http://jgeocoder.sourceforge.net/parser.html Для меня это сработало.

3
15.10.2011 01:23:49

Оригинальный постер, вероятно, долго не продвигался, но я попытался перенести модуль Perl Geo :: StreetAddress: US, используемый geocoder.us, на C #, сбросил его на CodePlex и подумал, что в будущем люди могут наткнуться на этот вопрос. найти это полезным:

Парсер адресов США

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

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

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

25
24.12.2011 21:38:50

используя Google API

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);
2
9.10.2012 09:48:49
Это, вероятно, против ToS, но похоже, что он должен работать - хотя перечитывая вопрос, он не совсем соответствует требованиям.
Jamie Bull 18.10.2012 19:26:19

SmartyStreets имеет новую функцию, которая извлекает адреса из произвольных строк ввода. (Примечание: я не работаю на SmartyStreets.)

Он успешно извлек все адреса из примера ввода, приведенного в вопросе выше. (Кстати, только 9 из этих 10 адресов действительны.)

Вот некоторые из результатов:введите описание изображения здесь

А вот вывод того же запроса в формате CSV:

ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,

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

9
12.06.2015 21:55:00
Smartystreets невероятно хороши в том, что они делают. Очень рад слышать, что это API, который они поддерживают.
ftrotter 14.10.2017 22:33:20

Для разработчиков ruby ​​или rails есть хороший гем под названием street_address . Я использовал это на одном из моих проектов, и он выполняет ту работу, которая мне нужна.

Единственная проблема, с которой я столкнулся, заключалась в том, что всякий раз, когда адрес в этом формате P. O. Box 1410 Durham, NC 27702 возвращал ноль, мне пришлось заменить «Почтовый ящик» на «», и после этого он смог его проанализировать.

2
1.11.2013 21:08:45
Ссылка на вышеуказанный модуль не работает, используйте это вместо: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan 14.11.2016 06:51:50

Этот тип проблемы трудно решить из-за неясностей, лежащих в основе данных.

Вот решение на основе Perl, которое определяет дерево грамматики рекурсивного спуска на основе регулярных выражений для анализа многих допустимых комбинаций адресов улиц: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm . Это включает в себя дополнительные свойства в пределах адреса, такого как: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA

Он похож на http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm, упомянутый выше, но также работает для адресов, которые не из США, таких как Великобритания, Австралия и Канада.

Вот вывод для одного из ваших примеров адресов. Обратите внимание, что раздел названия необходимо сначала удалить из «AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947», чтобы уменьшить его до «2299 Lewes-Georgetown Hwy, Georgetown, DE 19947». Это легко достигается путем удаления всех данных вплоть до первого числа, найденного в строке.

Non matching part       ''
Error                   '0'
Error descriptions      ''
Case all                '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS              ''
country                 ''
po_box_type             ''
post_box                ''
post_code               '19947'
pre_cursor              ''
property_identifier     '2299'
property_name           ''
road_box                ''
street                  'Lewes-Georgetown'
street_direction        ''
street_type             'Hwy'
sub_property_identifier ''
subcountry              'DE'
suburb                  'Georgetown'
3
1.10.2014 12:00:54

Существует порт javascript для пакета Perl Geo :: StreetAddress :: US: https://github.com/hassansin/parse-address . Он основан на регулярных выражениях и работает довольно хорошо.

1
13.12.2014 01:33:31