Posta adresleri bulanık eşleştirme nasıl yapılır?


14

Biçimleri farklı olduğunda veya bunlardan biri yanlış yazıldığında posta adreslerinin nasıl eşleştirileceğini bilmek istiyorum.

Şimdiye kadar farklı çözümler buldum, ancak oldukça eski ve çok verimli olmadıklarını düşünüyorum. Eminim bazı daha iyi yöntemler vardır, bu yüzden okumak için referanslarınız varsa, bunun birkaç kişiyi ilgilendirebilecek bir konu olduğuna eminim.

Bulduğum çözüm (örnekler R'dir):

  • Levenshtein mesafesi, bir kelimeyi diğerine dönüştürmek için eklemeniz, silmeniz veya değiştirmeniz gereken karakter sayısına eşittir.

    agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE) ## [1] "accusait" "abusait"

  • Fonemlerin karşılaştırılması

    library(RecordLinkage) soundex(x<-c('accusait','acusait','abusait')) ## [1] "A223" "A223" "A123"

  • Bir yazım düzeltici (nihayetinde Peter Norvig'inki gibi bir bayesci) kullanımı , ancak sanırım adresinde çok verimli değil.

  • Google'ın önerilerini kullanmayı düşündüm, ancak aynı şekilde kişisel posta adreslerinde çok etkili değil.

  • Bir makine öğrenimi denetimli yaklaşımı kullandığınızı hayal edebilirsiniz, ancak benim için bir seçenek olmayan kullanıcıların yanlış yazılmış isteklerini saklamanız gerekir.


Posgres bulanık dize eşleşmesini destekleyen gerçek bir veritabanı kullanmanızı öneririm . Verimli olacak.
Emre

Yalnızca ABD, Kanada, İngiltere, Fransızca, Japonca, çok ülkeli ...? Muhtemelen her biri için, hangi dili ve ülkeyi belirlediğini / tahmin edersiniz, sonra ülkeye özgü bir sınıflandırıcı uygularsınız? Bir eğitim setiniz var mı? Varsa, ülkelerin dağılımı nedir?
smci

Bunu nereden buldun? Tasarladığımız çözüm, adresleri ve yer adlarını fırçalamak ve zenginleştirmek ve google coğrafi kodlama ve web API'lerini yerleştirmek ve daha sonra ham verilere kıyasla doğru sonucu belirlemek için bazı kaba hesaplamalar yapmaktı. Biraz tıknaz ama çalışıyor ama adresleri ve yerleri / yerleri normalleştirmenin daha zarif bir yolu olmalı.
Chris Smith

Yanıtlar:


9

R'yi kullanırken, hesaplamalarda kullanılabilecek stringdist paketine ve Jaro-Winkler mesafe metriğine bakmak isteyebilirsiniz. Bu, ABD Nüfus Sayım Bürosunda bağlantı kurmak için geliştirilmiştir.

Bu dergideki Jaro ve Jaro-Winkler mesafeleri hakkında daha fazla bilgi için bakınız .

Farklı eşleştirme tekniklerinin karşılaştırması için bu makaleyi okuyun


4

Levenshtein mesafesini daha dolgun bir resim vermek için genişletmenin birçok akıllı yolu vardır. ' Bulanık Wuzzy ' adlı oldukça kullanışlı bir modüle (python için) kısa bir giriş burada SeatGeek'teki ekip tarafından.

Yapabileceğiniz birkaç şey kısmi dize benzerliğidir (farklı uzunluk dizeleriniz varsa, m <n ile m & n diyelim), o zaman sadece m karakterleri ile eşleşirsiniz. Ayrıca dizeyi belirteçlere (tek tek sözcükler) ayırabilir ve belirteç kümelerinin nasıl eşleştiğine veya alfabetik olarak düzenleyip sıralayabildiğine bakabilirsiniz.


4

Kısmi dize eşleşmelerini algılamak için bir başka popüler teknik (tipik olarak belge düzeyinde olsa da) shingling'tir . Temelde, hedef kelime / doc için bir n-gram seti ayıran ve bunları Jaccard katsayısı yoluyla diğer kelimeler / dokümanlar için n-gram setleri ile karşılaştıran hareketli bir pencere yaklaşımıdır . Manning ve meslektaşları (2008) kopyaların yakınına ve shingling'i bilgi edinme bağlamında tartışmaktadır .


4

Python'da herhangi bir veri türünü eşleştirmenin makul bir işini yapacak genel bir olasılıksal bulanık eşleştirici yazdım:

https://github.com/robinl/fuzzymatcher

Bellekte, bu yüzden muhtemelen yaklaşık 100 bin satırın üzerindeki veri kümelerini eşleştirmek için kullanmak istemezsiniz.

Ayrıca İngiltere adreslerine özgü benzer bir proje yazdım, ancak bu Addressbase Premium'a erişiminiz olduğunu varsayar. Bu bellekte değil, bu yüzden 100m kadar İngiltere adreslerine karşı kullanıldı. Buraya bakın:

https://github.com/RobinL/AddressMatcher

Bunu hızlı bir şekilde yapmak istiyorsanız , adreslerinizi normalleştirmek ve daha sonra bunları genel fuzzymatcher ( ) içine beslemek için libpostal'ı kullanmanızı tavsiye ederim pip install fuzzymatcher.

Kullanım örneklerini burada bulabilirsiniz .


Merhaba Robin, AddressMatcher kitaplığınızla ilgileniyorum. Nasıl kullanılacağına dair bir belgeniz var mı? Ben tam olarak bu sorun var - 1 adresleri (dağınık) diğerine (resmi posta adresleri) eşleştirmek gerekir. Teşekkürler
SCool

1
ne yazık ki adres eşleştirici ile hiç de önemsiz değil ve iyi belgeler yok. ihtiyacınız olan en önemli şey ticari bir ürün olan adres tabanı primini postgresql'e yüklemektir.
RobinL

Tamam, bana geri döndüğün için teşekkürler. Ben adresim Eircode adlı uyumsuz olacak İrlandalı adresinin İrlandalı sürümü varsayalım. Bulanık eşleştiricinin üretim ortamı adres eşleştirmesindeki göreve uygun olacağını düşünüyor musunuz? Verilerimde olmayan adreslere posta kodları eklemek istiyorum, örneğin Eircode veritabanında arama yapın '1 Main Street, Some Town, County've bir eşleşme bulursam posta kodunu geri getirin.
Scool

1
bulanık eşleştirici - evet kesinlikle gitmeye değer düşünüyorum. küçük bir adres listesinin etli bir makinedeki yetkili adreslerin (yani eircode) geniş bir listesi içinde bulunması oldukça iyi olmalıdır. Başka bir seçenek R
RobinL'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.