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:
Asumsikan alamat di AS (untuk saat ini)
menganggap bahwa string input kadang-kadang akan berisi penerima (orang yang dialamatkan) dan / atau alamat jalan kedua (yaitu Suite B)
negara dapat disingkat
kode pos bisa standar 5 digit atau zip + 4
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
sumber
Jawaban:
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)
Saya harap ini sedikit membantu.
sumber
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"
Nah, itu bisa diuraikan!
sumber
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.
sumber
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:
Dan inilah output yang diformat CSV dari permintaan yang sama:
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.
sumber
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.
sumber
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 .:
Melewati
parseAddress
fungsi "AP Croll & Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947" mengembalikan:sumber
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.
sumber
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.
sumber
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
sumber
Apakah ada standar sama sekali dalam cara alamat dicatat? Sebagai contoh:
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).
sumber
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%.
sumber
Coba www.address-parser.com . Kami menggunakan layanan web mereka, yang dapat Anda uji online
sumber
Berdasarkan data sampel:
Saya akan mulai di akhir string. Parsing kode pos (format apa pun). Baca ujung ke spasi pertama. Jika tidak ditemukan Kode Pos Kesalahan.
Potong ujungnya kemudian untuk spasi dan karakter khusus (koma)
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.
Potong spasi dan koma dari ujung lagi.
Kota menjadi rumit, saya benar-benar akan menggunakan koma di sini, dengan risiko mendapatkan terlalu banyak data di kota. Cari koma, atau awal baris.
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.
sumber
Jika data yang dimasukkan manusia, maka Anda akan menghabiskan terlalu banyak waktu untuk mencoba kode di sekitar pengecualian.
Mencoba:
Ekspresi reguler untuk mengekstrak kode pos
Pencarian kode pos (melalui DB pemerintah yang sesuai) untuk mendapatkan alamat yang benar
Dapatkan magang untuk memverifikasi secara manual data baru sesuai dengan yang lama
sumber
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.
sumber
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
Anda mungkin ingin memeriksa ini !! http://jgeocoder.sourceforge.net/parser.html Bekerja seperti pesona bagi saya.
sumber
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.
sumber
Karena ada kemungkinan kesalahan kata, pikirkan tentang menggunakan SOUNDEX yang dikombinasikan dengan algoritma LCS untuk membandingkan string, ini akan banyak membantu!
sumber
menggunakan google API
sumber
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.sumber
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
sumber
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 ...
sumber
Ada port javascript dari perl Geo :: StreetAddress :: paket US: https://github.com/hassansin/parse-address . Ini berbasis regex dan bekerja dengan cukup baik.
sumber