Saya ingin tahu cara mencocokkan alamat pos ketika formatnya berbeda atau ketika salah satu dari mereka salah eja.
Sejauh ini saya telah menemukan solusi yang berbeda tetapi saya pikir mereka sudah cukup tua dan tidak terlalu efisien. Saya yakin ada beberapa metode yang lebih baik, jadi jika Anda memiliki referensi untuk saya baca, saya yakin itu adalah subjek yang mungkin menarik minat beberapa orang.
Solusi yang saya temukan (contohnya dalam R):
Levenshtein distance, yang sama dengan jumlah karakter yang harus Anda sisipkan, hapus atau ubah untuk mengubah satu kata menjadi yang lain.
agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE)
## [1] "accusait" "abusait"
Perbandingan fonem
library(RecordLinkage)
soundex(x<-c('accusait','acusait','abusait'))
## [1] "A223" "A223" "A123"
Penggunaan koreksi ejaan (akhirnya yang bayesian seperti Peter Norvig) , tapi tidak terlalu efisien pada alamat kurasa.
Saya berpikir untuk menggunakan saran dari Google menyarankan, tetapi juga, itu tidak sangat efisien pada alamat pos pribadi.
Anda dapat membayangkan menggunakan pendekatan yang diawasi pembelajaran mesin tetapi Anda harus menyimpan permintaan yang salah eja dari pengguna untuk melakukannya yang bukan merupakan pilihan bagi saya.
sumber
Jawaban:
Saat Anda menggunakan R, Anda mungkin ingin melihat ke dalam paket stringdist dan metrik jarak Jaro-Winkler yang dapat digunakan dalam perhitungan. Ini dikembangkan di Biro Sensus AS untuk dihubungkan.
Lihat untuk informasi lebih lanjut tentang jarak Jaro dan Jaro-Winkler di jurnal ini .
Untuk perbandingan berbagai teknik pencocokan, baca makalah ini
sumber
Ada banyak cara pintar untuk memperluas jarak Levenshtein untuk memberikan gambaran yang lebih lengkap. Pengenalan singkat ke modul yang cukup berguna (untuk python) bernama ' Fuzzy Wuzzy ' ada di sini oleh tim di SeatGeek.
Beberapa hal yang dapat Anda lakukan adalah kesamaan string parsial (jika Anda memiliki string panjang yang berbeda, katakan m & n dengan m <n), maka Anda hanya cocok dengan karakter m. Anda juga dapat memisahkan string menjadi token (kata-kata individual) dan melihat bagaimana set token cocok atau mengaturnya secara alfabet dan memesannya.
sumber
Teknik populer lainnya untuk mendeteksi kecocokan string parsial (meskipun biasanya di tingkat dokumen) adalah shingling . Pada dasarnya ini adalah pendekatan jendela bergerak yang mengekstrak seperangkat n-gram untuk kata target / doc dan membandingkannya dengan set n-gram untuk kata / dokumen lain melalui koefisien Jaccard . Manning dan rekan (2008) membahas duplikat dekat dan shingling dalam konteks pengambilan informasi.
sumber
Saya telah menulis sebuah pencocokan fuzzy probabalistic generik dengan Python yang akan melakukan pekerjaan yang wajar untuk mencocokkan semua jenis data:
https://github.com/robinl/fuzzymatcher
Ada dalam memori, jadi Anda mungkin tidak ingin menggunakannya untuk mencocokkan dataset yang di atas sekitar 100rb baris.
Saya juga telah menulis proyek serupa untuk alamat Inggris, tetapi ini mengasumsikan Anda memiliki akses ke Addressbase Premium. Yang ini tidak ada dalam memori, jadi telah digunakan terhadap 100m atau lebih alamat UK. Lihat disini:
https://github.com/RobinL/AddressMatcher
Jika Anda ingin menjalankan ini dengan cepat, saya akan merekomendasikan menggunakan libpostal untuk menormalkan alamat Anda dan kemudian memasukkannya ke fuzzymatcher generik saya (
pip install fuzzymatcher
).Anda dapat menemukan contoh penggunaan di sini .
sumber
'1 Main Street, Some Town, County'
dan jika saya menemukan kecocokan - bawa kembali kode pos.