Wie kann man Postanschriften Fuzzy Matching machen?

14

Ich würde gerne wissen, wie man Postanschriften vergleicht, wenn sich deren Format unterscheidet oder wenn eine von ihnen falsch geschrieben ist.

Bisher habe ich verschiedene Lösungen gefunden, aber ich denke, dass sie ziemlich alt und nicht sehr effizient sind. Ich bin mir sicher, dass es einige bessere Methoden gibt. Wenn Sie also Referenzen haben, die ich lesen kann, ist dies sicher ein Thema, das möglicherweise mehrere Personen interessiert.

Die Lösung, die ich gefunden habe (Beispiele sind in R):

  • Levenshtein-Abstand, der der Anzahl der Zeichen entspricht, die Sie einfügen, löschen oder ändern müssen, um ein Wort in ein anderes umzuwandeln.

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

  • Der Vergleich von Phonemen

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

  • Die Verwendung einer Rechtschreibkorrektur (möglicherweise eine Bayes'sche wie die von Peter Norvig) , die aber in Bezug auf die Adresse meiner Meinung nach nicht sehr effizient ist.

  • Ich habe überlegt, die Vorschläge von Google zu verwenden, aber es ist auch nicht sehr effizient bei persönlichen Postanschriften.

  • Sie können sich vorstellen, einen maschinell lernüberwachten Ansatz zu verwenden, müssen jedoch die falsch geschriebenen Anforderungen der Benutzer gespeichert haben, was für mich keine Option ist.

Stéphanie C
quelle
Ich würde vorschlagen, eine echte Datenbank zu verwenden, die Fuzzy-String-Matching unterstützt: posgres . Es wird effizient sein.
Emre
Nur USA, Kanada, Großbritannien, Französisch, Japanisch, Mehrländer ...? Vermutlich müssen Sie für jede Sprache zuerst die Sprache und das Land erraten und dann einen länderspezifischen Klassifikator anwenden. Haben Sie ein Trainingsset und wenn ja, wie ist die Verteilung auf die Länder?
smci
Wo bist du dazu gekommen? Die Lösung, die wir entwickelt haben, bestand darin, die Adressen und Ortsnamen zu bereinigen und anzureichern, die Google-Geokodierung aufzurufen und Web-APIs zu platzieren und dann einige grobe Berechnungen durchzuführen, um das korrekte Ergebnis im Vergleich zu den Rohdaten zu ermitteln. Es ist ein bisschen klobig, funktioniert aber, aber es muss eine elegantere Möglichkeit geben, Adressen und Orte / Orte zu normalisieren.
Chris Smith

Antworten:

9

Wenn Sie R verwenden, sollten Sie sich das stringdist-Paket und die Jaro-Winkler-Distanzmetrik ansehen, die für die Berechnungen verwendet werden können. Dies wurde am US Census Bureau zur Verknüpfung entwickelt.

Weitere Informationen zur Entfernung von Jaro und Jaro-Winkler finden Sie in dieser Zeitschrift .

Lesen Sie dieses Dokument, um einen Vergleich der verschiedenen Matching-Techniken zu erhalten

Phiver
quelle
4

Es gibt viele clevere Möglichkeiten, die Levenshtein-Distanz zu vergrößern, um ein vollständigeres Bild zu erhalten. Eine kurze Einführung in ein ziemlich nützliches Modul (für Python) namens " Fuzzy Wuzzy " gibt es hier vom Team von SeatGeek.

Ein paar Dinge, die Sie tun können, sind teilweise String-Ähnlichkeiten (wenn Sie unterschiedlich lange Strings haben, sagen Sie m & n mit m <n), dann stimmen Sie nur mit m Zeichen überein. Sie können die Zeichenfolge auch in Token (einzelne Wörter) unterteilen und überprüfen, wie Tokensätze übereinstimmen, oder sie alphabetisch anordnen und sortieren.

dmb
quelle
4

Eine andere beliebte Technik zum Erkennen partieller Zeichenfolgenübereinstimmungen (obwohl typischerweise auf Dokumentebene) ist das Schindeln . Im Wesentlichen handelt es sich um einen Moving-Window-Ansatz, der eine Menge von n-Gramm für das Zielwort / -dokument extrahiert und diese mit der Menge von n-Gramm für andere Wörter / Dokumente über den Jaccard-Koeffizienten vergleicht . Manning und Kollegen (2008) diskutieren im Kontext des Informationsabrufs nahezu doppelte Daten und Schindeln .

Brandon Loudermilk
quelle
3

Ich habe einen generischen probabalistischen Fuzzy-Matcher in Python geschrieben, der alle Arten von Daten in angemessener Weise abgleichen kann:

https://github.com/robinl/fuzzymatcher

Es befindet sich im Speicher, daher möchten Sie es wahrscheinlich nicht verwenden, um Datasets zuzuordnen, die über 100.000 Zeilen liegen.

Ich habe auch ein ähnliches Projekt speziell für Adressen in Großbritannien geschrieben, aber dies setzt voraus, dass Sie Zugriff auf Addressbase Premium haben. Dieser ist nicht im Speicher, wurde also gegen die etwa 100-Meter-Adressen in Großbritannien verwendet. Siehe hier:

https://github.com/RobinL/AddressMatcher

Wenn Sie dies schnell erledigen möchten, empfehle ich, libpostal zu verwenden , um Ihre Adressen zu normalisieren und sie dann in meinen generischen Fuzzymatcher ( pip install fuzzymatcher) zu übertragen.

Anwendungsbeispiele finden Sie hier .

RobinL
quelle
Hallo Robin, ich interessiere mich für Ihre AddressMatcher-Bibliothek. Haben Sie eine Dokumentation zur Verwendung? Ich habe genau dieses Problem - ich muss einen Adressensatz (unordentlich) mit einem anderen (offizielle Postanschrift) abgleichen. Vielen Dank
SCool
1
Leider ist es mit dem Adressvergleich überhaupt nicht trivial und ich habe keine gute Dokumentation. Hauptsache, Sie müssen AddressBase Premium, ein kommerzielles Produkt, in postgresql laden.
RobinL
Ok, danke, dass du dich bei mir gemeldet hast. Ich arbeite mit der irischen Version von Addressbase Premium namens Eircode, die inkompatibel sein wird. Glauben Sie, dass der Fuzzy-Matcher für die Adressanpassung in der Produktionsumgebung geeignet ist? Ich möchte nur Postleitzahlen an Adressen in meinen Daten anhängen, die diese nicht haben, z. B. die Eircode-Datenbank nach durchsuchen '1 Main Street, Some Town, County'und, wenn ich eine Übereinstimmung finde, die Postleitzahl zurückbringen.
SCool
1
Fuzzy Matcher - Ja, ich denke auf jeden Fall einen Versuch wert. Es sollte einigermaßen gut funktionieren, wenn eine kleine Liste von Adressen in einer großen Liste von maßgeblichen Adressen (z. B. Eircode) auf einer bulligen Maschine enthalten ist. Eine weitere Option ist die Fastlink pacakge in R
RobinL