Синтаксический анализ используемого почтового адреса, города, штата, почтового индекса из строки

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

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

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

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

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

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

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

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

Пример данных:

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

  • 11522 Shawnee Road, Гринвуд, DE 19950

  • 144 Kings Highway, S.W. Дувр, DE 19901

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

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

  • Николс Раскопки 2742 Pulaski Hwy Newark, DE 19711

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

  • VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21

  • 580 North Dupont Highway Dover, DE 19901

  • P.O. Box 778 Dover, DE 19903


person Rob Allen    schedule 19.08.2008    source источник
comment
Пара вопросов: 1. Есть ли разделители? 2. Каков порядок полей в строке? 3. Какое поведение вы хотите в случае ошибки данных (например, вставить адрес в одно поле в таблице SQL, а остальные оставить пустыми)   -  person Jay Mooney    schedule 19.08.2008
comment
Хороший вопрос и очень интересные ответы. Работа в обратном направлении от zip-архива кажется распространенной темой, но если вы берете необработанные данные от клиентов, zip-архив может быть неточным. Я предполагаю, что у большинства сайтов, например, непропорционально большое количество адресов в 90210.   -  person Kevin Williams    schedule 22.09.2010
comment
@Kevin: Да, потому что вам, американцам, нравится блокировать нас, канадцев, требуя почтовый индекс и не принимая наши почтовые индексы, тем самым вынуждая нас вводить какую-то тарабарщину, чтобы обойти систему ... к сожалению, единственный zip, который я знаю, это 90210 :-) Edit: Неважно ... вы, очевидно, живете в нескольких километрах от меня в Британской Колумбии. Вы, вероятно, тоже сделаете то же самое :-P   -  person mpen    schedule 28.12.2010
comment
См. этот вопрос SO для расширенного обзора этого .   -  person Matt    schedule 24.06.2012


Ответы (24)


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

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

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

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

person Tim Sullivan    schedule 19.08.2008
comment
Хотя это правда, что существует 50 штатов, USPS утверждает, что в домене Почтовой службы США существует 59 двухбуквенных сокращений, 65, если считать американские вооруженные силы. usps.com/send/official-abbreviations.htm - person Mike Sherrill 'Cat Recall'; 27.07.2011
comment
Только 50 означало, что это довольно небольшое число. Может быть, всего 65, но это не важно для решения проблемы. - person Tim Sullivan; 27.07.2011
comment
Этот алгоритм также подробно описан в публикации 28 USPS. - person Matt; 28.10.2012

Я думаю, что лучше всего передать эту проблему на аутсорсинг: отправить ее в геокодер 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]
      }
    }
  ]
}

Теперь доступен для синтаксического анализа!

person James A. Rosen    schedule 19.08.2008
comment
Поскольку это пакетный процесс, я бы также предложил использовать пул потоков для выполнения геокодирования, чтобы вы могли отправлять сразу несколько адресов (поддерживает ли Google какой-либо пакетный интерфейс?) - person David; 18.05.2009
comment
Это не поможет со второй адресной строкой (пинта 5 в вопросе) - person Christopher Mahan; 02.01.2010
comment
Условия обслуживания часто являются ограничивающим фактором для коммерческого и / или непубличного использования. - person Jay; 19.03.2010
comment
Это хорошее решение, но есть крайние случаи, когда Google / Yahoo не возвращает результаты, например новые адреса и адреса, которые просто отсутствуют в их базе данных. - person Peter DeWeese; 02.05.2012
comment
это было бы хорошим решением, ЕСЛИ Google не ограничивал пакетные вызовы для своих MAPS api - person Hector; 30.03.2015

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

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

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

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

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

person Nicholas Piasecki    schedule 24.12.2011

Я делал это раньше.

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

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

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

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

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

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

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

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

person Christopher Mahan    schedule 19.08.2008

После приведенного здесь совета я разработал следующую функцию в 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 функции "A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" возвращает:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
person Rob Allen    schedule 19.08.2008

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

person Nicholas Trandem    schedule 19.08.2008

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 поиска адреса, поэтому вы можете быть уверены, действителен он или нет. Каждый проверенный результат гарантирован, но мы знаем, что другие результаты не будут идеальными, потому что, как было предельно ясно в этой беседе, адреса непредсказуемы, даже иногда для людей.

person Matt    schedule 08.05.2013
comment
Smartystreets невероятно хороши в своем деле. Очень приятно слышать, что это API, который они поддерживают. - person ftrotter; 15.10.2017

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

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

person Kevin    schedule 19.08.2008

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

person weston    schedule 17.09.2010

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

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

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

person Yaakov Ellis    schedule 19.08.2008

Еще один запрос на демонстрационные данные.

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

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

Это оставит вас с беспорядком с адресами. БОЛЬШИНСТВО (все?) Адресов будут начинаться с числа, поэтому найдите первое вхождение числа в оставшейся строке и возьмите все от него до (нового) конца строки. Это будет ваш адрес. Все, что находится слева от этого числа, скорее всего, является адресатом.

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

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

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

person Community    schedule 19.08.2008

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

person We Know    schedule 08.02.2010
comment
Это хорошо работает для чего-то вроде поиска адреса в большом html-документе. Я просто хочу, чтобы у них был интерфейс REST, а не SOAP. Спасибо, что поделились этой ссылкой. - person jspooner; 26.11.2011
comment
Если вы связаны с ними, вы обязаны это раскрыть. - person Matt; 09.05.2013
comment
Было бы хорошо, если бы они дали оценку стоимости, а не требовали, чтобы я сказал им, насколько ценна их услуга, прежде чем назвать цену. - person Toaster; 03.11.2014

На основе выборочных данных:

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

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

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

  4. Снова обрезайте пробелы и запятые с конца.

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

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

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

person Jay Mooney    schedule 19.08.2008

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

Пытаться:

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

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

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

person engtech    schedule 19.08.2008

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

person pix0r    schedule 19.08.2008

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

person Community    schedule 12.05.2009
comment
RecogniContact кажется закрытым для публики. Для доступа требуется заполнить контактную форму, но ответа нет. Может, кто-то еще знает, как с ними связаться. - person Luke Van In; 10.02.2017

Возможно, вы захотите это проверить !! http://jgeocoder.sourceforge.net/parser.html Сработал для меня как шарм.

person CoolDude    schedule 15.10.2011

Проблемы такого типа трудно решить из-за неоднозначности данных.

Вот решение на основе 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, упомянутый выше, но также работает для адресов не из США, таких как Великобритания, Австралия и Канада.

Вот результат для одного из ваших примеров адресов. Обратите внимание, что раздел имени необходимо сначала удалить из «A. P. Croll & Son 2299 Lewes-Georgetown Hwy, Джорджтаун, 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'
person Kim Ryan    schedule 01.10.2014

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

person anand    schedule 22.01.2011

с помощью 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);
person komal    schedule 09.10.2012
comment
Это, вероятно, противоречит ToS, но похоже, что это должно работать - хотя, перечитывая вопрос, это не совсем соответствует требованиям. - person Jamie Bull; 18.10.2012

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

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

person Sachin Prasad    schedule 01.11.2013
comment
Ссылка на указанный выше модуль не работает, используйте вместо нее: search.cpan.org/~ kimryan / Lingua-EN-AddressParse - person Kim Ryan; 14.11.2016

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

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

person AdamSane    schedule 19.08.2008

Я не знаю, НАСКОЛЬКО это было бы РЕАЛЬНО, но я не видел, чтобы об этом упоминалось, поэтому я решил пойти дальше и предложить следующее:

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

person Shawn    schedule 01.10.2010

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

person hassansin    schedule 13.12.2014