Аналіз вуличної адреси, місто, штат, поштовий індекс [закрито]


131

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

Припущення:

  1. Припустимо адресу в США (поки що)

  2. припустимо, що рядок введення інколи буде містити адресата (особа, до якої звертаються) та / або другу адресу вулиці (тобто сюїту B)

  3. стани можуть бути скорочені

  4. поштовий індекс може бути стандартним 5-значним або zip + 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 Новий замок, DE 19720

  • Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958

  • Розкопки Ніколса 2742 Пуласкі Хві Ньюарк, DE 19711

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

  • VEI Dover Crossroads, ТОВ 1500 Serpentine Road, Suite 100 Baltimore MD 21

  • 580 Північний Дюпон, шосе Dover, DE 19901

  • PO Box 778 Dover, DE 19903


Пара питань: 1. Будь-які роздільники? 2. Який порядок польових рядків? 3. Якої поведінки ви хочете у випадку помилки даних (EG передайте адресу в одне поле таблиці SQL, інші залиште порожніми)
Jay Mooney,

Хороше запитання та дуже цікаві відповіді. Робота назад від zip, здається, є загальною темою, але якщо ви берете необроблені дані від клієнтів, поштовий індекс може бути неточним. Я думаю, що більшість сайтів мають, наприклад, непропорційну кількість адрес у 90210.
Кевін Вільямс

4
@Kevin: Так, тому що ви, американці, хотіли заблокувати нас, канадців, вимагаючи "поштового" коду, а не приймаючи наші поштові індекси, тим самим змушуючи нас вводити деякий ривок, щоб обійти систему .... на жаль, єдиний поштовий індекс, який я знаю, це 90210 :-) Редагувати: Ніколи не маю на увазі ... ти, мабуть, живеш за кілька кілометрів від мене в БК. Ви, мабуть, і тоді робите те саме :-P
mpen

2
Дивіться це питання ТА для розширеного огляду цього.
Метт

Відповіді:


118

Я багато пропрацював над цим розбором. Оскільки є помилки, ви не отримаєте 100% точності, але ви можете зробити кілька речей, щоб пройти більшу частину шляху, а потім зробити візуальний тест на BS. Ось загальний шлях для цього. Це не код, тому що написати це досить академічно, немає дивацтва, просто багато обробляння струн.

(Тепер, коли ви опублікували деякі зразкові дані, я внесла деякі незначні зміни)

  1. Робота назад. Почніть з поштового коду, який буде наприкінці, і в одному з двох відомих форматів: XXXXX або XXXXX-XXXX. Якщо це не відображається, ви можете припустити, що ви перебуваєте в місті, штаті, нижче.
  2. Наступна річ, перш ніж поштовий індекс, буде державою, і це буде або у двобуквенному форматі, або у вигляді слів. Ви також знаєте, що це буде - їх лише 50. Крім того, ви можете озвучити слова, щоб допомогти компенсувати орфографічні помилки.
  3. до цього місто, і це, мабуть, на тій же лінії, що і держава. Ви можете використовувати базу даних zip-коду для перевірки міста та штату на основі zip або принаймні використовувати його як детектор BS.
  4. Адреса вулиці, як правило, буде одним або двома рядками. Другий рядок, як правило, буде номером набору, якщо він є, але він також може бути полем PO.
  5. Виявити ім’я в першому або другому рядку буде майже неможливо, хоча якщо він не має префікса цифрою (або якщо він має префікс "attn:" або "увагу до:", це може дати вам підказку як чи це ім'я чи адресний рядок.

Я сподіваюся, що це дещо допомагає.


14
Хоча це правда, що існує 50 штатів, USPS каже, що в домені Поштової служби США є 59 двобуквенних абревіатур, 65 якщо рахувати американські збройні сили. usps.com/send/official-abbreviations.htm
Майк Шеррілл "Відкликання котів"

17
"Тільки 50" повинно було вказувати на наявність досить невеликої кількості. Це може бути "лише 65", але це не важливо для вирішення проблеми.
Тім Салліван

4
Цей алгоритм також детально описаний у публікації USPS 28
Метт

92

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

Наприклад, аналіз "1600 Amphitheatre Parkway, Mountain View, Каліфорнія" дає результати

{
  "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]
      }
    }
  ]
}

Тепер це піддається розбору!


4
Оскільки це пакетний процес, я б також запропонував використовувати пул потоків, щоб зробити геокодування, щоб ви могли подавати відразу декілька адрес (чи підтримує google пакетний інтерфейс будь-якого виду?)
Девід,

Це не дуже допоможе адресному другому рядку (пінт 5 у питанні)
Крістофер Махан

71
Умови надання послуг часто є обмежуючим фактором для комерційних та / або непублічних цілей.
Джей

Це хороше рішення, але є крайні випадки, за якими Google / Yahoo не повертає результатів, наприклад нові адреси та адреси, які просто відсутні у своїй базі даних.
Peter DeWeese

це було б гарним рішенням "ЯКЩО" Google не обмежував пакетні дзвінки на свої MAPS api
Гектор

25

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

Аналізатор адрес США

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

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

Він не намагається розібрати щось над лінією вулиці, але, ймовірно, міг би зіткнутися з регулярним виразом, щоб отримати щось досить близько - я, мабуть, просто зламаю його за номером будинку.


17

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


2
Smartystreets неймовірно хороший у тому, що вони роблять. Дуже раді почути, що це API, який вони підтримують.
ftrotter

16

Я робив це в минулому.

Або зробіть це вручну (побудуйте приємний інтерфейс, який допомагає користувачеві зробити це швидко), або ввімкніть автоматизовану перевірку наявності недавньої бази даних адрес (вам потрібно це придбати) та вручну обробляйте помилки.

Ручне керування займе приблизно 10 секунд кожна, це означає, що ви можете робити 3600/10 = 360 за годину, тому 4000 повинно зайняти у вас приблизно 11-12 годин. Це дасть вам високу швидкість точності.

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

Отримати копію стандартів відправлення пошти (USPS) на http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf і помітити, що вона становить понад 130 сторінок. Режекси для втілення, що було б гайками.

Для міжнародних адрес усі ставки вимкнено. Американські працівники не змогли б підтвердити.

Як варіант, скористайтеся послугою передачі даних. Однак у мене немає жодних рекомендацій.

Крім того: коли ви надсилаєте повідомлення поштою (для чого це так, правда?), Переконайтеся, що ви поставили "потрібну корекцію адреси" на конверт (в потрібному місці) та оновите базу даних. (Ми зробили простий гуй для людини, що працює на рецепції; людина, яка насправді розбирається поштою)

Нарешті, коли ви очистили дані, шукайте дублікати.


14

Після поради тут я розробив наступну функцію в 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

13

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


8

Це не вирішить вашу проблему, але якщо вам потрібні лише широкі та довгі дані для цих адрес, API Карт Google досить добре розбереть неформатовані адреси.

Гарна пропозиція, або ви можете виконати запит CURL для кожної адреси на Картах Google, і він поверне правильно відформатовану адресу. З цього ви можете переробити вміст вашого серця.


7

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


6

Чи існують взагалі якісь стандарти у записі адрес? Наприклад:

  1. Чи завжди є коми або нові лінії, що відокремлюють вулицю1 від вулиці2 від міста від штату від поштового індексу?
  2. Чи завжди вказані типи адрес (дорога, вулиця, бульвар тощо)? завжди скорочено? Деякі з них?
  3. Визначте "помилку".

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


6

Ще один запит на вибіркові дані.

Як уже згадувалося, я працював би назад на блискавці.

Після того, як у вас є поштовий індекс, я б запитав поштову базу даних, зберігав результати та видаляв їх та поштовий індекс із рядка.

Це залишить вас безладним адресом. MOST (All?) Адреси розпочнеться з числа, тому знайдіть перше виникнення числа в решті, що залишилася, і захопіть все, що знаходиться з нього, до (нового) кінця рядка. Це буде ваша адреса. Що-небудь зліва від цього номера, ймовірно, адресат.

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

Для адресата я б накинувся і схопив останнє слово цього рядка як прізвище, а решту поклав у поле імені. Якщо ви цього не хочете, вам потрібно буде на початку перевірити привітання (містер, пані, доктор та ін.) Та зробити деякі припущення на основі кількості пробілів щодо того, як називається ім'я складено.

Я не думаю, що ви можете розібратися зі 100% точністю.


6

Спробуйте www.address-parser.com . Ми використовуємо їх веб-сервіс, який ви можете протестувати в Інтернеті


1
Це добре підходить для чогось типу пошуку адреси у великому html-документі. Я просто хочу, щоб у них був інтерфейс REST, а не SOAP. Thx для спільного використання цього посилання.
jspooner

1
Якщо ви пов’язані з ними, вам потрібно розкрити це.
Метт

1
Було б добре, якби вони дали оцінку ціни, а не вимагали, щоб я сказав їм, наскільки цінна їхня послуга, перш ніж давати ціну.
Тостер

5

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

  1. Я б почав з кінця рядка. Розбір поштового коду (будь-якого формату). Прочитайте кінець до першого місця. Якщо не було знайдено поштовий індекс, помилка.

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

  3. Потім перейдіть до стану, знову використовуйте пробіл як роздільник. Можливо, використовуйте список пошуку для перевірки 2-х кодів букв та повних імен стану. Якщо не знайдено дійсного стану, помилка.

  4. Обріжте пробіли та коми з кінця знову.

  5. Місто стає хитромудрим, я б фактично використав коску тут, ризикуючи отримати занадто багато даних у місті. Шукайте кому чи початок рядка.

  6. Якщо у вас ще залишилися символи в рядку, пересуньте все це в адресне поле.

Це не ідеально, але це повинно бути досить хорошою відправною точкою.


4

Якщо це введені людиною дані, ви витратите занадто багато часу, намагаючись кодувати винятки.

Спробуйте:

  1. Регулярне вираження для отримання поштового індексу

  2. Пошук поштового коду (через відповідну урядову БД), щоб отримати правильну адресу

  3. Отримайте практику, щоб вручну перевірити відповідність нових даних старим


3

Це не вирішить вашу проблему, але якщо вам потрібні лише широкі та довгі дані для цих адрес, API Карт Google досить добре розбереть неформатовані адреси.


3

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


Здається, RecogniContact закритий для публіки. Для доступу потрібно надіслати контактну форму, але відповіді немає. Можливо, хтось ще знає, як з ними зв’язатися.
Люк Ван


3

Цей тип проблеми важко вирішити через неясності в даних.

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

Він подібний до згаданого вище http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm , але також працює для адрес, які не є зі США, наприклад, Великобританії, Австралії та Канада.

Ось вихід для однієї з ваших прикладних адрес. Зауважте, що розділ імен потрібно буде спочатку видалити з "AP Croll & Son 2299 Lewes-Georgetown Hwy, Джорджтаун, DE 19947", щоб зменшити його до "2299 Lewes-Georgetown Hwy, Джорджтаун, 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'

2

Оскільки в слові є помилка, подумайте про використання SOUNDEX у поєднанні з алгоритмом LCS для порівняння рядків, це допоможе дуже багато!


2

за допомогою API Google

$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);

1
Це, мабуть, проти ToS, але схоже, що це має спрацювати - хоча перечитуючи питання, воно не зовсім відповідає вимогам.
Джеймі Булл

2

Для розробників рубінів або рейок є приємний дорогоцінний камінь, який називається street_address . Я використовував це в одному зі своїх проектів, і це робить потрібну мені роботу.

Єдиним випуском, який я мав, був кожен раз, коли адреса знаходиться у такому форматі, P. O. Box 1410 Durham, NC 27702 вона поверталася нульовою, і тому мені довелося замінити "PO Box" на "", і після цього він зміг її розібрати.


Посилання на вищезгаданий модуль розірвано, використовуйте його замість цього: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Кім Райан

1

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

Використовуйте регулярні вирази для витягу Zip або City State - знайдіть правильний або якщо помилка отримає обидва. витягніть список вулиць із джерела даних. Виправте місто та штат, а потім адресу вулиці. Як тільки ви отримаєте дійсний рядок 1 адреси, місто, штат та поштовий індекс, ви можете робити припущення щодо адресного рядка 2..3


1

Я не знаю, наскільки це було б можливим, але я не бачив цього, тому я думав, що продовжу і запропонував би це:

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.