Parse dapat digunakan Alamat Jalan, Kota, Negara, Zip dari string [ditutup]

131

Masalah: Saya memiliki bidang alamat dari database Access yang telah dikonversi ke Sql Server 2005. Bidang ini memiliki semuanya dalam satu bidang. Saya perlu menguraikan bagian individual dari alamat ke bidang yang sesuai dalam tabel yang dinormalisasi. Saya perlu melakukan ini untuk sekitar 4.000 catatan dan perlu diulang.

Asumsi:

  1. Asumsikan alamat di AS (untuk saat ini)

  2. menganggap bahwa string input kadang-kadang akan berisi penerima (orang yang dialamatkan) dan / atau alamat jalan kedua (yaitu Suite B)

  3. negara dapat disingkat

  4. kode pos bisa standar 5 digit atau zip + 4

  5. ada kesalahan ketik dalam beberapa kasus

UPDATE: Menanggapi pertanyaan yang diajukan, standar tidak diikuti secara universal, saya perlu menyimpan nilai-nilai individu, bukan hanya geocode dan kesalahan berarti kesalahan ketik (diperbaiki di atas)

Contoh data:

  • AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947

  • 11522 Shawnee Road, Greenwood DE 19950

  • 144 Kings Highway, SW Dover, DE 19901

  • Const terintegrasi Layanan 2 Penns Way Suite 405 New Castle, DE 19720

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

  • Penggalian Nichols 2742 Pulaski Hwy Newark, DE 19711

  • 2284 Bryn Zion Road, Smyrna, DE 19904

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

  • 580 North Dupont Highway Dover, DE 19901

  • PO Box 778 Dover, DE 19903

Rob Allen
sumber
Beberapa pertanyaan: 1. Ada pembatas? 2. Apa urutan bidang dalam string? 3. Perilaku apa yang Anda inginkan dalam kasus kesalahan data (EG mendorong alamat ke dalam satu bidang dalam tabel SQL, biarkan yang lain kosong)
Jay Mooney
Pertanyaan bagus dan jawaban yang sangat menarik. Bekerja mundur dari zip tampaknya menjadi tema umum, tetapi jika Anda mengambil data mentah dari pelanggan, zip mungkin tidak akurat. Saya kira sebagian besar situs memiliki jumlah alamat yang tidak proporsional di 90210 misalnya.
Kevin Williams
4
@ Kevin: Ya, karena Anda orang Amerika suka mengunci kami orang Kanada dengan memerlukan kode "zip", dan tidak menerima kode pos kami, sehingga memaksa kami untuk memasukkan beberapa omong kosong untuk melewati sistem .... sayangnya, satu-satunya zip I know is 90210 :-) Sunting: Nevermind ... Anda tampaknya tinggal beberapa kilometer dari saya di BC. Anda mungkin juga melakukan hal yang sama :-P
mpen
2
Lihat pertanyaan SO ini untuk ikhtisar yang diperluas tentang hal ini.
Matt

Jawaban:

118

Saya telah melakukan banyak pekerjaan pada penguraian seperti ini. Karena ada kesalahan Anda tidak akan mendapatkan akurasi 100%, tetapi ada beberapa hal yang dapat Anda lakukan untuk mendapatkan sebagian besar jalan di sana, dan kemudian lakukan tes BS visual. Inilah cara umum untuk melakukannya. Ini bukan kode, karena cukup akademis untuk menulisnya, tidak ada keanehan, hanya banyak penanganan string.

(Sekarang Anda telah memposting beberapa data sampel, saya telah membuat beberapa perubahan kecil)

  1. Bekerjalah mundur. Mulai dari kode pos, yang akan mendekati akhir, dan dalam salah satu dari dua format yang dikenal: XXXXX atau XXXXX-XXXX. Jika ini tidak muncul, Anda dapat menganggap Anda berada di kota, bagian negara, di bawah.
  2. Hal berikutnya, sebelum zip, adalah status, dan itu akan dalam format dua huruf, atau sebagai kata-kata. Anda tahu apa jadinya nanti - hanya ada 50 saja. Selain itu, Anda bisa menggunakan kata-kata untuk membantu mengkompensasi kesalahan pengejaan.
  3. sebelum itu adalah kota, dan mungkin di jalur yang sama dengan negara. Anda bisa menggunakan basis data kode pos untuk memeriksa kota dan negara bagian berdasarkan zip, atau setidaknya menggunakannya sebagai detektor BS.
  4. Alamat jalan umumnya adalah satu atau dua baris. Baris kedua umumnya akan menjadi nomor suite jika ada, tetapi bisa juga berupa kotak PO.
  5. Akan hampir mustahil untuk mendeteksi nama di baris pertama atau kedua, meskipun jika tidak diawali dengan angka (atau jika diawali dengan "attn:" atau "attention to:", itu bisa memberi Anda petunjuk sebagai apakah itu nama atau garis alamat.

Saya harap ini sedikit membantu.

Tim Sullivan
sumber
14
Meskipun benar bahwa ada 50 negara bagian, USPS mengatakan ada 59 singkatan dua huruf dalam domain Layanan Pos Amerika Serikat, 65 jika Anda menghitung angkatan bersenjata Amerika. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall'
17
"Hanya 50" adalah untuk menunjukkan bahwa ada jumlah yang cukup kecil. Mungkin "hanya 65", tetapi itu tidak penting untuk menyelesaikan masalah yang ada.
Tim Sullivan
4
Algoritma ini juga dirinci dalam USPS Publikasi 28
Matt
92

Saya pikir outsourcing masalah adalah yang terbaik: kirim ke Google (atau Yahoo) geocoder. Geocoder mengembalikan tidak hanya lat / long (yang tidak menarik di sini), tetapi juga parsing alamat yang kaya, dengan bidang isian yang tidak Anda kirim (termasuk ZIP + 4 dan county).

Misalnya, menguraikan hasil "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]
      }
    }
  ]
}

Nah, itu bisa diuraikan!

James A. Rosen
sumber
4
Karena ini adalah proses batch, saya juga menyarankan menggunakan kumpulan thread untuk melakukan geocoding sehingga Anda dapat mengirimkan beberapa alamat sekaligus (apakah google mendukung antarmuka batch apa pun?)
David
Ini tidak akan benar-benar membantu dengan alamat baris dua (pint 5 dalam pertanyaan)
Christopher Mahan
71
Ketentuan layanan seringkali menjadi faktor pembatas di sini untuk penggunaan komersial dan / atau non publik.
Jay
Ini adalah solusi yang baik tetapi ada kasus tepi di mana Google / Yahoo tidak memberikan hasil, misalnya alamat dan alamat baru yang hilang dalam database mereka.
Peter DeWeese
ini akan menjadi solusi yang baik "JIKA" google tidak membatasi panggilan batch ke api MAPS mereka
Hector
25

Poster asli kemungkinan telah lama bergerak, tetapi saya mengambil bacokan di porting Perl Geo :: StreetAddress: modul AS yang digunakan oleh geocoder.us ke C #, membuangnya di CodePlex, dan berpikir bahwa orang-orang tersandung pada pertanyaan ini di masa depan mungkin bermanfaat:

US Address Parser

Di halaman muka proyek, saya mencoba berbicara tentang batasannya (sangat nyata). Karena tidak didukung oleh database USPS alamat jalan yang valid, penguraian dapat menjadi ambigu dan tidak dapat mengkonfirmasi atau menolak validitas alamat yang diberikan. Itu hanya bisa mencoba menarik data keluar dari string.

Ini dimaksudkan untuk kasus ketika Anda perlu mendapatkan seperangkat data sebagian besar di bidang yang tepat, atau ingin memberikan pintasan ke entri data (membiarkan pengguna menempelkan alamat ke kotak teks daripada menabrak di antara beberapa bidang). Itu tidak dimaksudkan untuk memverifikasi kemampuan pengiriman suatu alamat.

Itu tidak berusaha untuk memilah apa pun di atas garis jalan, tetapi orang mungkin bisa menipu dengan regex untuk mendapatkan sesuatu yang cukup dekat - saya mungkin hanya akan memutusnya di nomor rumah.

Nicholas Piasecki
sumber
17

SmartyStreets memiliki fitur baru yang mengekstraksi alamat dari string input yang berubah-ubah. (Catatan: Saya tidak bekerja di SmartyStreets.)

Itu berhasil mengekstraksi semua alamat dari input sampel yang diberikan dalam pertanyaan di atas. (Omong-omong, hanya 9 dari 10 alamat itu yang valid.)

Berikut beberapa hasilnya:masukkan deskripsi gambar di sini

Dan inilah output yang diformat CSV dari permintaan yang sama:

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,

Saya adalah pengembang yang awalnya menulis layanan. Algoritme yang kami terapkan sedikit berbeda dari jawaban spesifik apa pun di sini, tetapi setiap alamat yang diekstraksi diverifikasi terhadap API pencarian alamat, sehingga Anda dapat yakin apakah itu valid atau tidak. Setiap hasil yang diverifikasi dijamin, tetapi kami tahu hasil lainnya tidak akan sempurna karena, seperti yang telah dibuat sangat jelas di utas ini, alamat tidak dapat diprediksi, bahkan untuk manusia kadang-kadang.

Mat
sumber
2
Smartystreets sangat bagus dalam hal apa yang mereka lakukan. Sangat senang mendengar bahwa ini adalah API yang mereka dukung.
ftrotter
16

Saya sudah melakukan ini di masa lalu.

Baik melakukannya secara manual, (membangun gui bagus yang membantu pengguna melakukannya dengan cepat) atau membuatnya otomatis dan memeriksa terhadap database alamat terbaru (Anda harus membeli itu) dan secara manual menangani kesalahan.

Penanganan manual akan memakan waktu sekitar 10 detik masing-masing, artinya Anda dapat melakukan 3600/10 = 360 per jam, sehingga 4000 akan membawa Anda sekitar 11-12 jam. Ini akan memberi Anda tingkat akurasi yang tinggi.

Untuk otomasi, Anda memerlukan basis data alamat AS terbaru, dan sesuaikan aturan Anda dengan itu. Saya sarankan untuk tidak menggunakan regex (sulit untuk mempertahankan jangka panjang, begitu banyak pengecualian). Pergi untuk pertandingan 90% dengan database, lakukan sisanya secara manual

Dapatkan salinan Standar Pengalamatan Pos (USPS) di http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf dan perhatikan bahwa panjangnya 130+ halaman. Regex untuk mengimplementasikan itu akan menjadi gila.

Untuk alamat internasional, semua taruhan dibatalkan. Pekerja yang berbasis di AS tidak akan dapat memvalidasi.

Atau, gunakan layanan data. Namun saya tidak punya rekomendasi.

Lebih jauh: ketika Anda mengirim barang melalui pos (memang untuk itu, kan?) Pastikan Anda memasukkan "koreksi alamat yang diminta" pada amplop (di tempat yang tepat) dan memperbarui database. (Kami membuat gui sederhana untuk orang di meja depan untuk melakukan itu; orang yang benar-benar memilah-milah surat)

Akhirnya, ketika Anda telah menggosok data, cari duplikat.

Christopher Mahan
sumber
14

Setelah saran di sini, saya telah menyusun fungsi berikut dalam VB yang membuat lumayan, meskipun tidak selalu sempurna (jika nama perusahaan dan garis suite diberikan, itu menggabungkan data yang dapat digunakan suite dan kota). Silakan berkomentar / refactor / berteriak pada saya karena melanggar salah satu aturan saya sendiri, dll .:

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

Melewati parseAddressfungsi "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" mengembalikan:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
Rob Allen
sumber
13

Saya telah bekerja di domain pemrosesan alamat selama sekitar 5 tahun sekarang, dan benar-benar tidak ada peluru perak. Solusi yang benar akan tergantung pada nilai data. Jika itu tidak terlalu berharga, lemparkan melalui pengurai seperti yang disarankan oleh jawaban lain. Jika itu bahkan agak berharga Anda pasti perlu memiliki manusia yang mengevaluasi / memperbaiki semua hasil pengurai. Jika Anda mencari solusi yang sepenuhnya otomatis dan dapat diulang, Anda mungkin ingin berbicara dengan vendor koreksi alamat seperti Group1 atau Trillium.

Nicholas Trandem
sumber
8

Ini tidak akan menyelesaikan masalah Anda, tetapi jika Anda hanya membutuhkan data lat / long untuk alamat ini, Google Maps API akan mengurai alamat yang tidak diformat dengan cukup baik.

Saran bagus, atau Anda dapat menjalankan permintaan CURL untuk setiap alamat ke Google Maps dan itu akan mengembalikan alamat yang diformat dengan benar. Dari itu, Anda dapat mengubah menjadi isi hati Anda.

Kevin
sumber
7

Memberi +1 pada James A. Rosen solusi yang disarankan karena telah bekerja dengan baik untuk saya, namun bagi para pelengkap situs ini adalah bacaan yang menarik dan upaya terbaik yang pernah saya lihat dalam mendokumentasikan alamat di seluruh dunia: http://www.columbia.edu/kermit /postal.html

Weston
sumber
6

Apakah ada standar sama sekali dalam cara alamat dicatat? Sebagai contoh:

  1. Apakah selalu ada koma atau baris baru yang memisahkan street1 dari street2 dari city dari state dari zip?
  2. Apakah tipe alamat (jalan, jalan, bulevar, dll) selalu dijabarkan? selalu disingkat? Beberapa dari masing-masing?
  3. Tentukan "kesalahan".

Jawaban umum saya adalah serangkaian Ekspresi Reguler, meskipun kompleksitasnya tergantung pada jawabannya. Dan jika tidak ada konsistensi sama sekali, maka Anda mungkin hanya dapat mencapai keberhasilan parsial dengan Regex (yaitu: menyaring kode pos dan negara) dan harus melakukan sisanya dengan tangan (atau setidaknya melalui sisanya sangat hati-hati untuk memastikan Anda menemukan kesalahan).

Yaakov Ellis
sumber
6

Permintaan lain untuk data sampel.

Seperti yang telah disebutkan saya akan bekerja mundur dari zip.

Setelah Anda memiliki zip, saya akan meminta basis data zip, menyimpan hasilnya, dan menghapusnya & zip dari string.

Itu akan meninggalkan Anda dengan kekacauan alamat. Alamat-alamat PALING (Semua?) Akan dimulai dengan nomor, jadi temukan kemunculan pertama nomor dalam string yang tersisa dan ambil semuanya dari itu ke ujung (baru) string. Itu akan menjadi alamat Anda. Apa pun di sebelah kiri nomor itu kemungkinan adalah penerima.

Anda sekarang harus memiliki Kota, Negara, & Zip disimpan dalam sebuah tabel dan mungkin dua string, penerima dan alamat. Untuk alamatnya, periksa keberadaan "Suite" atau "Apt." dll. dan membaginya menjadi dua nilai (baris alamat 1 & 2).

Untuk penerima, saya akan menyepak dan mengambil kata terakhir dari string itu sebagai nama terakhir dan memasukkan sisanya ke dalam bidang nama depan. Jika Anda tidak ingin melakukan itu, Anda harus memeriksa salam (Tn., Nn., Dr., dll.) Di awal dan membuat beberapa asumsi berdasarkan jumlah spasi tentang bagaimana nama tersebut. mengarang.

Saya tidak berpikir ada cara Anda dapat menguraikan dengan akurasi 100%.

Membuang
sumber
6

Coba www.address-parser.com . Kami menggunakan layanan web mereka, yang dapat Anda uji online

Kita tahu
sumber
1
Ini berfungsi dengan baik untuk sesuatu seperti menemukan alamat dalam dokumen html besar. Saya hanya berharap mereka memiliki antarmuka REST dan bukan SABUN. Terima kasih untuk membagikan tautan ini.
jspooner
1
Jika Anda berafiliasi dengan mereka, Anda harus mengungkapkannya.
Matt
1
Alangkah baiknya jika mereka memberikan perkiraan harga daripada menuntut agar saya memberi tahu mereka betapa berharganya layanan mereka sebelum memberikan harga.
Pemanggang roti
5

Berdasarkan data sampel:

  1. Saya akan mulai di akhir string. Parsing kode pos (format apa pun). Baca ujung ke spasi pertama. Jika tidak ditemukan Kode Pos Kesalahan.

  2. Potong ujungnya kemudian untuk spasi dan karakter khusus (koma)

  3. Kemudian pindah ke Negara, sekali lagi gunakan Space sebagai pembatas. Mungkin menggunakan daftar pencarian untuk memvalidasi kode negara 2 huruf, dan nama lengkap negara. Jika tidak ditemukan keadaan yang valid, galat.

  4. Potong spasi dan koma dari ujung lagi.

  5. Kota menjadi rumit, saya benar-benar akan menggunakan koma di sini, dengan risiko mendapatkan terlalu banyak data di kota. Cari koma, atau awal baris.

  6. Jika Anda masih memiliki karakter yang tersisa di string, masukkan semua itu ke dalam bidang alamat.

Ini tidak sempurna, tetapi harus menjadi titik awal yang cukup bagus.

Jay Mooney
sumber
4

Jika data yang dimasukkan manusia, maka Anda akan menghabiskan terlalu banyak waktu untuk mencoba kode di sekitar pengecualian.

Mencoba:

  1. Ekspresi reguler untuk mengekstrak kode pos

  2. Pencarian kode pos (melalui DB pemerintah yang sesuai) untuk mendapatkan alamat yang benar

  3. Dapatkan magang untuk memverifikasi secara manual data baru sesuai dengan yang lama

engtech
sumber
3

Ini tidak akan menyelesaikan masalah Anda, tetapi jika Anda hanya membutuhkan data lat / long untuk alamat ini, Google Maps API akan mengurai alamat yang tidak diformat dengan cukup baik.

pix0r
sumber
3

RecogniContact adalah objek Windows COM yang mem-parsing alamat AS dan Eropa. Anda dapat mencobanya langsung di http://www.loquisoft.com/index.php?page=8


sumber
RecogniContact tampaknya tertutup untuk umum. Akses membutuhkan pengiriman formulir kontak, tetapi tidak ada jawaban. Mungkin orang lain tahu cara menghubungi mereka.
Luke Van In
3

Jenis masalah ini sulit dipecahkan karena ambiguitas yang mendasari data.

Berikut ini adalah solusi berbasis Perl yang mendefinisikan pohon tata bahasa keturunan rekursif berdasarkan ekspresi reguler untuk mem-parsing banyak kombinasi alamat jalan yang valid: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /EN/AddressParse.pm . Ini termasuk sub properti dalam alamat seperti: 12 1st Avenue N Suite # 2 Somewhere CA 12345 USA

Ini mirip dengan http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm yang disebutkan di atas, tetapi juga berfungsi untuk alamat yang bukan dari AS, seperti Inggris, Australia, dan Australia. Kanada.

Ini adalah output untuk salah satu alamat sampel Anda. Perhatikan bahwa bagian nama harus dihapus terlebih dahulu dari "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" untuk menguranginya menjadi "2299 Lewes-Georgetown Hwy, Georgetown, DE 19947". Ini mudah dicapai dengan menghapus semua data hingga nomor pertama yang ditemukan dalam string.

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'
Kim Ryan
sumber
2

Karena ada kemungkinan kesalahan kata, pikirkan tentang menggunakan SOUNDEX yang dikombinasikan dengan algoritma LCS untuk membandingkan string, ini akan banyak membantu!

anand
sumber
2

menggunakan 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);
komal
sumber
1
Itu mungkin bertentangan dengan ToS tetapi sepertinya harus bekerja - meskipun membaca kembali pertanyaan, itu tidak persis sesuai dengan persyaratan.
Jamie Bull
2

Untuk pengembang ruby ​​atau rails ada permata bagus yang tersedia bernama street_address . Saya telah menggunakan ini di salah satu proyek saya dan itu melakukan pekerjaan yang saya butuhkan.

Satu-satunya Masalah yang saya miliki adalah setiap kali sebuah alamat dalam format P. O. Box 1410 Durham, NC 27702 ini dikembalikan nihil dan karena itu saya harus mengganti "PO Box" dengan '' dan setelah ini ia dapat menguraikannya.

Sachin Prasad
sumber
Tautan ke modul di atas rusak, gunakan ini sebagai gantinya: search.cpan.org/~kimryan/Lingua-EN-AddressParse
Kim Ryan
1

Ada layanan data yang diberi kode pos akan memberi Anda daftar nama jalan di kode pos itu.

Gunakan regex untuk mengekstrak Zip atau Kota Negara - temukan yang benar atau jika kesalahan mendapatkan keduanya. tarik daftar jalan dari sumber data. Perbaiki kota dan negara bagian, lalu alamat jalan. Setelah Anda mendapatkan garis Alamat 1, kota, negara bagian, dan zip yang valid, Anda kemudian dapat membuat asumsi di baris alamat 2..3

AdamSane
sumber
1

Saya tidak tahu BAGAIMANA MUNGKIN ini, tapi saya belum melihat ini disebutkan jadi saya pikir saya akan melanjutkan dan menyarankan ini:

Jika Anda benar-benar berada di AS ... dapatkan basis data besar semua kode pos, negara bagian, kota, dan jalan. Sekarang cari ini di alamat Anda. Anda dapat memvalidasi apa yang Anda temukan dengan menguji jika, katakanlah, kota yang Anda temukan ada di negara bagian yang Anda temukan, atau dengan memeriksa apakah jalan yang Anda temukan ada di kota yang Anda temukan. Jika tidak, kemungkinan John bukan untuk jalan John, tetapi adalah nama yang dituju ... Pada dasarnya, dapatkan sebanyak mungkin informasi dan periksa alamat Anda yang menentangnya. Contoh ekstrem adalah mendapatkan DAFTAR SEMUA ALAMAT DI AS A dan kemudian menemukan yang mana yang paling cocok dengan masing-masing alamat Anda ...

Shawn
sumber