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.
quelle
Antworten:
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
quelle
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.
quelle
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 .
quelle
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 .
quelle
'1 Main Street, Some Town, County'
und, wenn ich eine Übereinstimmung finde, die Postleitzahl zurückbringen.