Jak wykonać dopasowanie rozmyte adresów pocztowych?

14

Chciałbym wiedzieć, jak dopasować adresy pocztowe, gdy ich format różni się lub gdy jeden z nich jest źle zapisany.

Do tej pory znalazłem różne rozwiązania, ale myślę, że są one dość stare i niezbyt wydajne. Jestem pewien, że istnieją lepsze metody, więc jeśli masz dla mnie referencje, jestem pewien, że jest to przedmiot, który może zainteresować kilka osób.

Rozwiązanie, które znalazłem (przykłady znajdują się w R):

  • Odległość Levenshteina, która jest równa liczbie znaków, które musisz wstawić, usunąć lub zmienić, aby przekształcić jedno słowo w drugie.

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

  • Porównanie fonemów

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

  • Zastosowanie korektora pisowni (ostatecznie bayesowskiego, takiego jak Peter Norvig) , ale wydaje mi się , że nie jest zbyt wydajny pod adresem.

  • Myślałem o skorzystaniu z sugestii Google, ale podobnie nie jest to bardzo skuteczne w przypadku osobistych adresów pocztowych.

  • Możesz sobie wyobrazić stosowanie podejścia nadzorowanego przez uczenie maszynowe, ale musisz zapisać błędnie napisane żądania użytkowników, co nie jest dla mnie opcją.

Stéphanie C.
źródło
Sugeruję użycie prawdziwej bazy danych, która obsługuje dopasowanie rozmytych ciągów: posgres . To będzie skuteczne.
Emre
Tylko USA, Kanada, Wielka Brytania, francuski, japoński, wiele krajów ...? Przypuszczalnie dla każdego z nich najpierw ustalasz / zgadniesz, jaki to język i kraj, a następnie zastosujesz klasyfikator właściwy dla danego kraju? Czy masz zestaw szkoleń, a jeśli tak, jaki jest podział krajów?
smci,
Gdzie to się skończyło? Rozwiązaniem, które opracowaliśmy, było szorowanie i wzbogacanie adresów i nazw miejsc, uderzanie w geokodowanie Google i umieszczanie internetowych interfejsów API, a następnie wykonanie przybliżonych obliczeń w celu ustalenia poprawnego wyniku w porównaniu do surowych danych. Jest trochę niezgrabny, ale działa, ale musi być bardziej elegancki sposób na znormalizowanie adresów i miejsc / lokalizacji.
Chris Smith

Odpowiedzi:

9

Kiedy używasz R, możesz zajrzeć do pakietu strunistycznego i metryki odległości Jaro-Winklera, którą można wykorzystać w obliczeniach. Zostało to opracowane w US Census Bureau do łączenia.

Więcej informacji na temat odległości Jaro i Jaro-Winkler w tym czasopiśmie .

Aby porównać różne techniki dopasowania, przeczytaj ten artykuł

phiver
źródło
4

Istnieje wiele sprytnych sposobów na zwiększenie odległości Levenshteina, aby uzyskać pełniejszy obraz. Krótkie wprowadzenie do bardzo przydatnego modułu (dla pytona) o nazwie „ Fuzzy Wuzzy ” jest tutaj autorstwa zespołu SeatGeek.

Kilka rzeczy, które możesz zrobić, to częściowe podobieństwo ciągów (jeśli masz ciągi o różnej długości, powiedz m & n za pomocą m <n), to dopasowujesz tylko dla m znaków. Możesz również podzielić ciąg na tokeny (pojedyncze słowa) i sprawdzić, jak zestawy tokenów pasują do siebie lub ułożyć je alfabetycznie i uporządkować.

dmb
źródło
4

Inną popularną techniką wykrywania częściowych dopasowań ciągów (choć zwykle na poziomie dokumentu) jest półpasiec . Zasadniczo jest to podejście z ruchomym oknem, które wyodrębnia zestaw n-gramów dla docelowego słowa / dokumentu i porównuje je z zestawami n-gramów dla innych słów / dokumentów za pomocą współczynnika Jaccard . Manning i współpracownicy (2008) omawiają prawie duplikaty i półpasiec w kontekście wyszukiwania informacji.

Brandon Loudermilk
źródło
4

W Pythonie napisałem ogólny probabalistyczny program do porównywania rozmytych danych, który wykona rozsądną pracę dopasowując dowolny typ danych:

https://github.com/robinl/fuzzymatcher

Jest w pamięci, więc prawdopodobnie nie chcesz go używać do dopasowywania zestawów danych powyżej około 100 000 wierszy.

Napisałem również podobny projekt dotyczący adresów w Wielkiej Brytanii, ale zakłada to, że masz dostęp do Addressbase Premium. Ten nie jest w pamięci, więc został użyty na około 100m adresów w Wielkiej Brytanii. Spójrz tutaj:

https://github.com/RobinL/AddressMatcher

Jeśli chcesz szybko to zrobić, polecam użycie libpostal do normalizacji adresów, a następnie umieszczę je w moim ogólnym programie fuzzymatcher ( pip install fuzzymatcher).

Przykłady użycia można znaleźć tutaj .

RobinL
źródło
Cześć Robin, jestem zainteresowany twoją biblioteką AddressMatcher. Czy zdarza ci się mieć jakąkolwiek dokumentację, jak z niej korzystać? Mam dokładnie ten problem - muszę dopasować 1 zestaw adresów (niechlujny) do innego (oficjalne adresy pocztowe). Dzięki
SCool,
1
niestety ze dopasowaniem adresu nie jest to wcale trywialne i nie mam dobrej dokumentacji. najważniejsze jest, aby załadować pakiet bazowy premium, produkt komercyjny, do Postgresql.
RobinL,
Ok, dziękuję za odwiedzenie mnie. Pracuję z, jak sądzę, irlandzką wersją klasy Addressbase o nazwie Eircode, która będzie niekompatybilna. Czy sądzisz, że rozmycie dopasowywania byłoby wystarczające w przypadku dopasowywania adresów w środowisku produkcyjnym? Chcę po prostu dodać kody pocztowe do adresów w moich danych, które ich nie mają, np. Przeszukaj bazę danych Eircode, '1 Main Street, Some Town, County'a jeśli znajdę dopasowanie - przywróć kod pocztowy.
SCool,
1
fuzzy matcher - tak, zdecydowanie uważam, że warto spróbować. Powinien działać dość dobrze, aby niewielka lista adresów znajdowała się na dużej liście adresów autoryzowanych (tj. eircode) na rozbudowanej maszynie. Inną opcją jest pakiet szybkiego łącza w R
RobinL