Kami melakukan bisnis sebagian besar di Amerika Serikat dan berusaha meningkatkan pengalaman pengguna dengan menggabungkan semua bidang alamat ke dalam satu area teks. Tetapi ada beberapa masalah:
- Alamat yang diketikkan oleh pengguna mungkin tidak benar atau dalam format standar
- Alamat harus dipisahkan menjadi beberapa bagian (jalan, kota, negara bagian, dll.) Untuk memproses pembayaran kartu kredit
- Pengguna dapat memasukkan lebih dari sekedar alamat mereka (seperti nama atau perusahaan mereka dengan itu)
- Google dapat melakukan ini tetapi Ketentuan Layanan dan batas kueri tidak diperbolehkan, terutama dengan anggaran yang ketat
Rupanya, ini adalah pertanyaan umum:
- Script PHP ke alamat parse?
- Bagaimana cara menguraikan alamat format gratis untuk menyimpan ke dalam DataBase
- parser alamat pos java
- Cara yang lebih efisien untuk mengekstrak komponen alamat
- Bagaimana saya bisa menampilkan alamat pos yang sudah diisi sebelumnya di layar kontak dengan jalan, kota, zip di android
- PHP regexp alamat US
Apakah ada cara untuk mengisolasi alamat dari teks di sekitarnya dan memecahnya menjadi beberapa bagian? Apakah ada ekspresi reguler ke alamat parse?
Jawaban:
Saya sering melihat pertanyaan ini ketika saya bekerja di perusahaan verifikasi alamat. Saya memposting jawaban di sini untuk membuatnya lebih mudah diakses oleh programmer yang mencari-cari dengan pertanyaan yang sama. Perusahaan tempat saya memproses miliaran alamat, dan kami belajar banyak dalam prosesnya.
Pertama, kita perlu memahami beberapa hal tentang alamat.
Alamat tidak teratur
Ini berarti bahwa ekspresi reguler keluar. Saya telah melihat semuanya, dari ekspresi reguler sederhana yang cocok dengan alamat dalam format yang sangat spesifik, hingga ini:
... untuk ini di mana 900+ file kelas garis menghasilkan ekspresi reguler supermasif dengan cepat untuk mencocokkan lebih banyak lagi. Saya tidak merekomendasikan ini (misalnya, ini biola dari regex di atas, yang membuat banyak kesalahan ). Tidak ada formula ajaib yang mudah untuk membuatnya bekerja. Dalam teori dan oleh teori, itu tidak mungkin untuk mencocokkan alamat dengan ekspresi reguler.
USPS Publikasi 28 mendokumentasikan banyak format alamat yang mungkin, dengan semua kata kunci dan variasinya. Yang terburuk dari semua, alamat seringkali ambigu. Kata-kata dapat berarti lebih dari satu hal ("St." dapat "Saint" atau "Street") dan ada kata-kata yang saya yakin mereka ciptakan. (Siapa yang tahu bahwa "Stravenue" adalah sufiks jalanan?)
Anda memerlukan beberapa kode yang benar-benar memahami alamat, dan jika kode itu memang ada, itu adalah rahasia dagang. Tapi Anda mungkin bisa menggulung sendiri jika Anda benar-benar menyukainya.
Alamat datang dalam bentuk dan ukuran yang tidak terduga
Berikut adalah beberapa alamat yang dibuat-buat (tapi lengkap):
Bahkan ini mungkin valid:
Jelas, ini tidak standar. Tanda baca dan jeda baris tidak dijamin. Inilah yang terjadi:
Nomor 1 selesai karena berisi alamat jalan dan kota dan negara bagian. Dengan informasi itu, cukup mengidentifikasi alamat, dan itu dapat dianggap "terkirim" (dengan beberapa standardisasi).
Angka 2 selesai karena juga berisi alamat jalan (dengan nomor sekunder / unit) dan kode ZIP 5 digit, yang cukup untuk mengidentifikasi alamat.
Nomor 3 adalah format kotak pos lengkap, karena berisi kode ZIP.
Nomor 4 juga lengkap karena kode ZIP unik , artinya entitas swasta atau perusahaan telah membeli ruang alamat itu. Kode ZIP unik adalah untuk ruang pengiriman volume tinggi atau terkonsentrasi. Apa pun yang ditujukan ke kode ZIP 12345 pergi ke General Electric di Schenectady, NY. Contoh ini tidak akan menjangkau siapa pun secara khusus, tetapi USPS masih dapat mengirimkannya.
Angka 5 juga lengkap, percaya atau tidak. Dengan hanya angka-angka itu, alamat lengkap dapat ditemukan ketika diuraikan terhadap basis data semua alamat yang memungkinkan. Mengisi directionals yang hilang, designator sekunder, dan kode ZIP + 4 adalah sepele ketika Anda melihat setiap angka sebagai komponen. Begini tampilannya, sepenuhnya diperluas dan terstandarisasi:
Data alamat bukan milik Anda
Di sebagian besar negara yang menyediakan data alamat resmi untuk vendor berlisensi, data alamat itu sendiri milik badan pengatur. Di AS, USPS memiliki alamat. Hal yang sama berlaku untuk Canada Post, Royal Mail, dan lainnya, meskipun masing-masing negara memberlakukan atau mendefinisikan kepemilikan sedikit berbeda. Mengetahui hal ini penting, karena biasanya melarang rekayasa ulang database alamat. Anda harus berhati-hati cara mendapatkan, menyimpan, dan menggunakan data.
Google Maps adalah tujuan umum untuk perbaikan alamat cepat, tetapi KL agak mahal; misalnya, Anda tidak dapat menggunakan data atau API mereka tanpa menunjukkan Google Map, dan hanya untuk tujuan non-komersial (kecuali Anda membayar), dan Anda tidak dapat menyimpan data (kecuali untuk caching sementara). Masuk akal. Data Google adalah beberapa yang terbaik di dunia. Namun, Google Maps tidak memverifikasi alamat. Jika alamat tidak ada, masih akan menunjukkan di mana alamat akan menjadi jika memang ada (mencobanya di jalan Anda sendiri, menggunakan nomor rumah yang Anda tahu tidak ada). Terkadang ini berguna, tetapi perlu diperhatikan.
Kebijakan penggunaan Nominatim sama-sama membatasi, terutama untuk volume tinggi dan penggunaan komersial, dan data sebagian besar diambil dari sumber-sumber gratis, sehingga tidak dipelihara dengan baik (seperti sifat proyek terbuka) - namun, ini mungkin masih sesuai kebutuhanmu. Itu didukung oleh komunitas yang hebat.
USPS sendiri memiliki API, tetapi turun banyak dan tidak disertai jaminan atau dukungan. Mungkin juga sulit digunakan. Beberapa orang menggunakannya dengan hemat tanpa masalah. Tetapi mudah untuk dilewatkan bahwa USPS mengharuskan Anda menggunakan API mereka hanya untuk mengonfirmasi alamat untuk dikirimkan melalui mereka.
Orang berharap alamat menjadi sulit
Sayangnya, kami mengkondisikan masyarakat kami untuk mengharapkan alamat menjadi rumit. Ada lusinan artikel UX yang bagus di seluruh Internet tentang hal ini, tetapi faktanya, jika Anda memiliki formulir alamat dengan bidang individual, itulah yang diharapkan pengguna, meskipun itu membuat lebih sulit untuk alamat tepi-kasus yang tidak sesuai dengan format formulir mengharapkan, atau mungkin formulir memerlukan bidang yang seharusnya tidak. Atau pengguna tidak tahu di mana harus meletakkan bagian tertentu dari alamat mereka.
Saya bisa terus-menerus tentang UX buruk dari formulir checkout hari ini, tetapi sebagai gantinya saya hanya akan mengatakan bahwa menggabungkan alamat ke dalam satu bidang akan menjadi perubahan yang disambut baik - orang akan dapat mengetikkan alamat mereka sesuai keinginan mereka , daripada mencoba mencari tahu bentuk panjang Anda. Namun, perubahan ini akan tidak terduga dan pengguna mungkin merasa sedikit menggelegar pada awalnya. Sadarilah itu.
Bagian dari rasa sakit ini dapat dikurangi dengan menempatkan bidang negara di depan, di depan alamat. Ketika mereka mengisi bidang negara terlebih dahulu, Anda tahu cara membuat formulir Anda muncul. Mungkin Anda memiliki cara yang baik untuk menangani alamat US bidang tunggal, jadi jika mereka memilih Amerika Serikat, Anda bisa mengurangi formulir Anda menjadi satu bidang, jika tidak, tunjukkan bidang komponen. Hanya hal-hal untuk dipikirkan!
Sekarang kita tahu mengapa itu sulit; apa yang bisa kamu lakukan?
USPS melisensikan vendor melalui proses yang disebut Sertifikasi CASS ™ untuk memberikan alamat terverifikasi kepada pelanggan. Vendor ini memiliki akses ke basis data USPS, diperbarui setiap bulan. Perangkat lunak mereka harus sesuai dengan standar ketat untuk disertifikasi, dan mereka tidak sering memerlukan persetujuan untuk persyaratan pembatasan seperti yang dibahas di atas.
Ada banyak perusahaan CASS-Certified yang dapat memproses daftar atau memiliki API: Data Melissa, Experian QAS, dan SmartyStreets.
(Karena mendapatkan kritik untuk "iklan", saya telah memotong jawaban saya pada titik ini. Terserah Anda untuk menemukan solusi yang cocok untuk Anda.)
Kebenaran: Sungguh, kawan, saya tidak bekerja di perusahaan mana pun. Itu bukan iklan.
sumber
libpostal: perpustakaan open-source untuk mengurai alamat, pelatihan dengan data dari OpenStreetMap, OpenAddresses, dan OpenCage.
https://github.com/openvenue/libpostal ( info lebih lanjut tentang itu )
Alat / layanan lain:
http://www.gisgraphy.com Layanan web gratis, open source, dan siap pakai geocoder dan geolocalisation, mengintegrasikan OpenStreetMap, GeoNames, dan Quattroshapes.
https://github.com/kodapan/osm-common Library untuk mengakses layanan OpenStreetMap, penguraian dan pemrosesan data.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
sumber
Ada banyak parser alamat jalan. Mereka datang dalam dua rasa dasar - yang memiliki database nama tempat dan nama jalan, dan yang tidak.
Pengurai alamat jalan ekspresi reguler dapat mencapai tingkat keberhasilan 95% tanpa banyak kesulitan. Kemudian Anda mulai memukul kasus-kasus yang tidak biasa. Yang Perl di CPAN, "Geo :: StreetAddress :: US", adalah tentang itu baik. Ada port Python dan Javascript itu, semua open source. Saya memiliki versi perbaikan dalam Python yang menggerakkan tingkat keberhasilan sedikit dengan menangani lebih banyak kasus. Untuk mendapatkan 3% terakhir yang benar, Anda perlu basis data untuk membantu disambiguasi.
Basis data dengan kode ZIP 3 digit serta nama dan singkatan negara bagian AS sangat membantu. Ketika parser melihat kode pos yang konsisten dan nama negara, itu dapat mulai mengunci ke format. Ini bekerja sangat baik untuk AS dan Inggris.
Penguraian alamat jalan yang benar dimulai dari akhir dan bekerja mundur. Begitulah cara sistem USPS melakukannya. Alamat paling tidak ambigu pada akhirnya, di mana nama negara, nama kota, dan kode pos relatif mudah dikenali. Nama jalan biasanya dapat diisolasi. Lokasi di jalan adalah yang paling rumit untuk diurai; di sana Anda menemukan hal-hal seperti "Lantai Kelima" dan "Paviliun Staples". Saat itulah database sangat membantu.
sumber
UPDATE: Geocode.xyz sekarang berfungsi di seluruh dunia. Untuk contoh, lihat https://geocode.xyz
Untuk AS, Meksiko, dan Kanada, lihat geocoder.ca .
Sebagai contoh:
Anda juga dapat memeriksa hasilnya di antarmuka web atau mendapatkan output sebagai Json atau Jsonp. misalnya. Saya mencari restoran di sekitar 123 Main Street, New York
sumber
geocode.xyz
'sscantext
metode gagal sebagian besar waktu. Itu selalu memilih "Jenewa, AS" daripada "Jenewa, Swiss" dan umumnya bias AS.Tidak ada kode? Karena malu!
Berikut adalah pengurai alamat JavaScript sederhana. Ini cukup mengerikan untuk setiap alasan yang diberikan Matt dalam disertasinya di atas (yang saya hampir 100% setuju dengan: alamat adalah tipe yang kompleks, dan manusia membuat kesalahan; lebih baik untuk melakukan outsourcing dan mengotomatisasi ini - ketika Anda mampu).
Tetapi bukannya menangis, saya memutuskan untuk mencoba:
Kode ini berfungsi baik untuk parsing sebagian besar hasil untuk Esri
findAddressCandidate
dan juga dengan beberapa geocoder (mundur) lain yang mengembalikan alamat satu baris di mana jalan / kota / negara dibatasi oleh koma. Anda dapat memperluas jika Anda ingin atau menulis parser khusus negara. Atau gunakan ini sebagai studi kasus tentang betapa sulitnya latihan ini atau betapa buruknya saya di JavaScript. Saya akui saya hanya menghabiskan sekitar tiga puluh menit untuk ini (iterasi di masa depan dapat menambahkan cache, validasi zip, dan pencarian status serta konteks lokasi pengguna), tetapi itu berfungsi untuk kasus penggunaan saya: Pengguna akhir melihat formulir yang mem-parsing respons pencarian geocode ke dalam 4 kotak teks. Jika parsing alamat salah (yang jarang terjadi kecuali sumber data buruk) itu bukan masalah besar - pengguna dapat memverifikasi dan memperbaikinya! (Tetapi untuk solusi otomatis dapat membuang / mengabaikan atau menandai kesalahan sehingga dev dapat mendukung format baru atau memperbaiki data sumber.)sumber
Jika Anda ingin mengandalkan data libpostal OSM sangat kuat dan menangani banyak peringatan paling umum dengan input alamat.
sumber
Pilihan lain untuk alamat yang berbasis di AS adalah YAddress (dibuat oleh perusahaan tempat saya bekerja).
Banyak jawaban untuk pertanyaan ini menyarankan alat geocoding sebagai solusi. Penting untuk tidak membingungkan parsing alamat dan geocoding; mereka tidak sama. Sementara geocoder dapat memecah alamat menjadi komponen sebagai manfaat sampingan, mereka biasanya mengandalkan set alamat non-standar. Ini berarti bahwa alamat parsing geocoder mungkin tidak sama dengan alamat resmi. Misalnya, apa yang disebut Google geocoding API "6th Ave" di Manhattan, USPS menyebut "Avenue of the Americas".
sumber
Untuk Parsing Alamat AS,
Saya lebih suka menggunakan paket usaddress yang tersedia di pip untuk usaddress saja
Dokumentasi
Pypi
Ini bekerja dengan baik bagi saya untuk alamat AS.
Menjalankan address_parser.py
sumber
Di salah satu proyek kami, kami telah menggunakan parser alamat berikut. Ini mem-parsing alamat untuk sebagian besar negara di dunia dengan akurasi yang baik.
http://address-parser.net/
Ini tersedia sebagai perpustakaan yang berdiri sendiri atau sebagai API langsung.
sumber
Saya terlambat ke pesta, ini skrip Excel VBA yang saya tulis bertahun-tahun yang lalu untuk Australia. Itu dapat dengan mudah dimodifikasi untuk mendukung Negara lain. Saya telah membuat repositori GitHub dari kode C # di sini. Saya telah meng-host-nya di situs saya dan Anda dapat mengunduhnya di sini: http://jeremythompson.net/rocks/ParseAddress.xlsm
Strategi
Untuk negara mana pun dengan Kode Pos yang numerik atau dapat dicocokkan dengan RegEx, strategi saya berfungsi dengan sangat baik:
Pertama, kami mendeteksi Nama Depan dan Nama Belakang yang dianggap sebagai baris teratas. Mudah untuk melewatkan nama dan mulai dengan alamat dengan menghapus centang pada kotak centang (disebut 'Nama adalah baris atas' seperti yang ditunjukkan di bawah ini).
Selanjutnya aman untuk mengharapkan Alamat yang terdiri dari Street dan Number datang sebelum Suburb dan St, Pde, Ave, Av, Rd, Cres, loop, dll adalah pemisah.
Mendeteksi Pinggiran Kota vs Negara dan bahkan Negara dapat menipu parser yang paling canggih karena mungkin ada konflik. Untuk mengatasinya saya menggunakan PostCode look up berdasarkan fakta bahwa setelah menelanjangi nomor Street dan Apartment / Unit serta PoBox, Ph, Fax , Mobile dll, hanya nomor PostCode yang akan tetap ada. Ini mudah dicocokkan dengan regEx untuk kemudian mencari di pinggiran kota dan negara.
Contoh
Kode VBA
DISCLAIMER, saya tahu kode ini tidak sempurna, atau bahkan ditulis dengan baik namun sangat mudah untuk dikonversi ke bahasa pemrograman apa pun dan berjalan di semua jenis aplikasi. Strategi adalah jawabannya tergantung pada negara dan aturan Anda, ambil kode ini sebagai contoh :
sumber