Frage

Ich bin versucht zu kommen mit einer Methode, die Suche nach doppelten Adressen, basiert auf einer ähnlichkeit score.Betrachten Sie diese doppelte Adressen:

addr_1 = '# 3 FAIRMONT LINK SOUTH'
addr_2 = '3 FAIRMONT LINK S'

addr_3 = '5703 - 48TH AVE'
adrr_4 = '5703- 48 AVENUE'

Ich bin der Planung auf die Anwendung einiger string-transformation, um lange Wörter abgekürzt, wie NORD -> N, entfernen Sie alle Leerzeichen, Kommas und Bindestriche-und Pfund-Symbole.Nun, mit dieser Ausgabe, wie kann ich vergleichen addr_3 mit dem rest von Adressen und erkennen ähnlich?Welcher Prozentsatz der ähnlichkeit wäre sicher?Könnte Sie bieten eine einfache python-code dafür?

addr_1 = '3FAIRMONTLINKS'
addr_2 = '3FAIRMONTLINKS'

addr_3 = '570348THAV'
adrr_4 = '570348AV'

Dankbar,

Eduardo

War es hilfreich?

Lösung

Erstens vereinfachen Sie die Adresse Zeichenfolge, durch Einstürzende alle whitespace-Zeichen, um ein einzelnes Leerzeichen zwischen den einzelnen Wörtern und zwingen Sie, alles zu Kleinschreibung (oder Großschreibung, wenn Sie es vorziehen):

adr = " ".join(adr.tolower().split())

Dann würde ich ausziehen Dinge wie "st" in "41st Street" oder "nd" in "42nd Street":

adr = re.sub("1st(\b|$)", r'1', adr)
adr = re.sub("([2-9])\s?nd(\b|$)", r'\1', adr)

Beachten Sie, dass der zweite sub() wird mit einem Leerzeichen zwischen "2" und die "nd", aber ich habe nicht das erste, das zu tun;weil ich nicht sicher bin, wie Sie sagen, der Unterschied zwischen "41 St Ave" und "41 St" (das zweite ist "41 Street" abgekürzt).

Lesen Sie die Hilfe für das re-Modul;es ist mächtig, aber kryptisch.

Dann würde ich das aufteilen, was Sie verlassen haben, in eine Liste von Worten, sowie die Anwendung des Soundex-Algorithmus, um Elemente in der Liste sehen nicht wie Nummern:

http://en.wikipedia.org/wiki/Soundex

http://wwwhomes.uni-bielefeld.de/gibbon/Forms/Python/SEARCH/soundex.html

adrlist = [word if word.isdigit() else soundex(word) for word in adr.split()]

Dann arbeiten Sie mit der Liste beitreten oder es wieder zu einem string wie Sie denken am besten.

Die ganze Idee von der Soundex-was ist zu behandeln, falsch geschriebene Adressen.Das kann nicht sein, was Sie möchten, in diesem Fall ignorieren Sie diese Soundex Idee.

Viel Glück.

Andere Tipps

Entfernen Sie Leerzeichen, werden Kommas und Bindestriche mehrdeutig sein. Es wird besser sein, sie mit einem einzigen Raum zu ersetzen.

Nehmen Sie zum Beispiel diese Adresse

56 5th avenue

Und

5, 65th avenue

mit Ihrer Methode beide von ihnen werden:

565THAV

Was Sie tun können, ist zu schreiben eine gute Adresse Verkürzung Algorithmus und dann Vergleich Verwendung String Duplikate zu erkennen. Dies sollte ausreichen, um Duplikate im allgemeinen Fall zu erkennen. Eine allgemeine Ähnlichkeit Algorithmus wird nicht funktionieren. Da eine Nummer Unterschied eine große Veränderung in Adressen bedeuten kann.

Der Algorithmus kann so aus:

  1. alle Kommas Striche mit Leerzeichen ersetzen. Verwenden er Methode für das übersetzen.
  2. Bauen Sie ein Wörterbuch mit Wörtern und ihre abgekürzte Form
  3. Entfernen Sie den TH Teil, wenn es wurde nach einer Reihe.

Dies sollte in den Aufbau Ihrer Wörterbuch der Abkürzungen hilfreich sein:

http://www.usps.com/ncsc/lookups/usps_abbreviations.html

Um dieses Recht zu tun, müssen Sie Ihre Adressen nach USPS-Standards (Ihre Adresse Beispiele Sitz in den USA zu sein scheinen) standardisieren. Es gibt viele Direktmarketing-Dienstleister, die CASS (Coding Genauigkeit Support System) Zertifizierung von Postanschriften . Der CASS-Prozess werden alle Ihre Adressen standardisieren und Anfügen zip + 4 zu ihnen. Etwaige unzustellbare Adressen werden markiert, die weiter Ihre Postpostkosten senken, wenn dies Ihre Absicht. Sobald alle Ihre Adressen standardisiert sind, werden Duplikate eliminiert trivial sein.

Ich hatte diese einmal zu tun. Ich konvertiert alles in Kleinbuchstaben, berechnet jeweils zu jeder anderen Adresse Levenshtein Abstand Adresse und die Ergebnisse geordnet. Es funktionierte sehr gut, aber es war recht zeitaufwendig.

Sie werden eine Implementierung von Levenshtein in C verwenden wollen, anstatt in Python, wenn Sie eine große Datenmenge haben. Meins war ein paar Zehntausende und nahm den größten Teil des Tages zu laufen, denke ich.

ich inspizieren regelmäßig Adressen für die Vervielfältigung, wo ich arbeite, und ich muss sagen, ich finde Soundex sehr ungeeignet. Es ist beides zu langsam und zu eifrig Dinge anzupassen. Ich habe ähnliche Probleme mit Levenshtein Abstand.

Was ist das Beste für mich gearbeitet hat, ist zu sanieren und tokenize die Adressen (los Zeichensetzung erhalten, Split Dinge in Worte nach oben) und dann sehen, wie viele Token zusammenpassen. Da Adressen typischerweise mehrere Token besitzen, können Sie ein Maß an Vertrauen in Form einer Kombination aus (1) entwickeln, wie viele Token wurden angepasst, (2), wie viele numerisch Token wurden angepasst, und (3) wie viele Token zur Verfügung. Wenn zum Beispiel alle Token in der kürzeren Adresse in der längeren Adresse sind, ist das Vertrauen eines Spiels ziemlich hoch. Ebenso, wenn Sie 5 Token entsprechen, die zumindest eine, die numerische ist, auch wenn die Adressen jeweils 8 haben, das ist immer noch ein hoher Zuverlässigkeitsspiel.

Es ist auf jeden Fall nützlich einige Optimierungen zu tun, wie einige gemeinsame Abkürzungen zu ersetzen. Die USPS-Listen helfen, obwohl ich würde nicht gehen Gung-Ho versuchen, alle von ihnen zu implementieren, und einige der wertvollsten Substitutionen sind nicht auf diesen Listen. Zum Beispiel: ‚JFK‘ sollte eine Übereinstimmung für ‚John F. Kennedy‘, und es gibt eine Reihe von gemeinsamen Wegen zu verkürzen ‚MARTIN LUTHER KING JR‘.

Vielleicht ist es selbstverständlich, aber ich werde es trotzdem sagen, der Vollständigkeit halber: Vergessen Sie nicht, sich nur auf die gesamte Adresse einen geraden String-Vergleich zu tun, bevor mit komplizierteren Dinge durcheinander! Dies sollte ein sehr billig Test sein, und so ist wahrscheinlich ein no-brainer ersten Durchgang.

Offensichtlich ist, desto mehr Zeit Sie bereit und in der Lage ist (sowohl auf Programmierung / Testen und zur Laufzeit) zu verbringen, desto besser Sie in der Lage sein zu tun. Fuzzy String-Matching-Techniken (schneller und weniger verallgemeinerten Arten als Levenshtein) können nützlich sein, als separaten Pass aus dem Token-Ansatz (ich würde nicht versuchen, auf Fuzzy-Match einzelnes Tokens gegeneinander). Ich finde, dass Fuzzy-String-Matching mir nicht genug Knall für mein Geld auf Adressen nicht geben (obwohl ich es auf Namen verwenden).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top