Problem: Ich habe ein Adressfeld aus einer Access-Datenbank, die in SQL Server 2005 konvertiert wurde. Dieses Feld enthält alles in einem Feld. Ich muss die einzelnen Abschnitte der Adresse in die entsprechenden Felder in einer normalisierten Tabelle zerlegen. Ich muss dies für ungefähr 4.000 Datensätze tun und es muss wiederholbar sein.
Annahmen:
Nehmen Sie eine Adresse in den USA an (vorerst)
Angenommen, die Eingabezeichenfolge enthält manchmal einen Adressaten (die angesprochene Person) und / oder eine zweite Adresse (dh Suite B).
Zustände können abgekürzt werden
Die Postleitzahl kann standardmäßig 5-stellig oder Postleitzahl + 4 sein
In einigen Fällen gibt es Tippfehler
UPDATE: Als Antwort auf die gestellten Fragen wurden Standards nicht allgemein befolgt, ich muss die einzelnen Werte speichern, nicht nur Geocode und Fehler bedeuten Tippfehler (oben korrigiert)
Beispieldaten:
AP Croll & Son 2299 Lewes-Georgetown Highway, Georgetown, DE 19947
11522 Shawnee Road, Greenwood DE 19950
144 Kings Highway, SW Dover, DE 19901
Integrierte Konst. Dienstleistungen 2 Penns Way Suite 405 New Castle, DE 19720
Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958
Nichols-Ausgrabung 2742 Pulaski Hwy Newark, DE 19711
2284 Bryn Zion Road, Smyrna, DE 19904
VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21
580 North Dupont Highway Dover, DE 19901
Postfach 778 Dover, DE 19903
quelle
Antworten:
Ich habe viel an dieser Art von Analyse gearbeitet. Da es Fehler gibt, erhalten Sie keine 100% ige Genauigkeit, aber es gibt einige Dinge, die Sie tun können, um den größten Teil des Weges dorthin zu schaffen und dann einen visuellen BS-Test durchzuführen. Hier ist der allgemeine Weg, um dies zu erreichen. Es ist kein Code, weil es ziemlich akademisch ist, ihn zu schreiben, es gibt keine Verrücktheit, nur viel String-Handling.
(Nachdem Sie einige Beispieldaten veröffentlicht haben, habe ich einige geringfügige Änderungen vorgenommen.)
Ich hoffe das hilft etwas.
quelle
Ich denke, das Problem auszulagern ist die beste Wahl: Senden Sie es an den Geocoder von Google (oder Yahoo). Der Geocoder gibt nicht nur das Lat / Long zurück (was hier nicht von Interesse ist), sondern auch eine umfassende Analyse der Adresse mit Feldern, die Sie nicht gesendet haben (einschließlich ZIP + 4 und County).
Das Parsen von "1600 Amphitheatre Parkway, Mountain View, CA" ergibt beispielsweise Ausbeuten
Nun , das ist parseable!
quelle
Das Originalplakat hat sich wahrscheinlich schon lange weiterentwickelt, aber ich habe versucht, das von geocoder.us verwendete Perl Geo :: StreetAddress: US- Modul auf C # zu portieren , es auf CodePlex abzulegen und zu glauben, dass die Leute in Zukunft über diese Frage stolpern könnten finde es nützlich:
US-Adressparser
Auf der Homepage des Projekts versuche ich, über seine (sehr realen) Einschränkungen zu sprechen. Da es nicht von der USPS-Datenbank mit gültigen Straßenadressen unterstützt wird, kann das Parsen mehrdeutig sein und die Gültigkeit einer bestimmten Adresse weder bestätigen noch leugnen. Es kann nur versuchen, Daten aus der Zeichenfolge herauszuziehen.
Dies ist für den Fall gedacht, dass Sie einen Datensatz hauptsächlich in den richtigen Feldern abrufen oder eine Verknüpfung zur Dateneingabe bereitstellen möchten (Benutzer können eine Adresse in ein Textfeld einfügen, anstatt zwischen mehreren Feldern zu wechseln). Es ist nicht dazu gedacht, die Zustellbarkeit einer Adresse zu überprüfen.
Es wird nicht versucht, etwas über der Straßenlinie zu analysieren, aber man könnte sich wahrscheinlich mit dem regulären Ausdruck herumschlagen, um etwas ziemlich Nahes zu erreichen - ich würde es wahrscheinlich einfach an der Hausnummer abbrechen.
quelle
SmartyStreets verfügt über eine neue Funktion, mit der Adressen aus beliebigen Eingabezeichenfolgen extrahiert werden. (Hinweis: Ich arbeite nicht bei SmartyStreets.)
Es wurden erfolgreich alle Adressen aus der in der obigen Frage angegebenen Beispieleingabe extrahiert. (Übrigens sind nur 9 dieser 10 Adressen gültig.)
Hier sind einige der Ausgaben:
Und hier ist die CSV-formatierte Ausgabe derselben Anfrage:
Ich war der Entwickler, der den Dienst ursprünglich geschrieben hat. Der von uns implementierte Algorithmus unterscheidet sich ein wenig von den hier angegebenen spezifischen Antworten. Jede extrahierte Adresse wird jedoch anhand der Adressensuch-API überprüft, sodass Sie sicher sein können, ob sie gültig ist oder nicht. Jedes geprüfte Ergebnis garantiert ist, aber wir wissen , die anderen Ergebnisse nicht perfekt sein , da hat sich als gemacht worden völlig klar , in diesem Thread, Adressen sind unberechenbar, auch für den Menschen manchmal.
quelle
Ich habe das in der Vergangenheit getan.
Entweder manuell (erstellen Sie eine nette Benutzeroberfläche, die dem Benutzer hilft, es schnell zu erledigen) oder automatisieren und mit einer aktuellen Adressdatenbank vergleichen (das müssen Sie kaufen) und Fehler manuell behandeln.
Die manuelle Handhabung dauert jeweils etwa 10 Sekunden, was bedeutet, dass Sie 3600/10 = 360 pro Stunde ausführen können. 4000 sollte also ungefähr 11-12 Stunden dauern. Dies gibt Ihnen eine hohe Genauigkeit.
Für die Automatisierung benötigen Sie eine aktuelle US-Adressdatenbank und passen Ihre Regeln daran an. Ich schlage vor, sich nicht auf den regulären Ausdruck einzulassen (langfristig schwer zu pflegen, so viele Ausnahmen). Gehen Sie für 90% Übereinstimmung mit der Datenbank, erledigen Sie den Rest manuell.
Eine Kopie der Postal Addressing Standards (USPS) erhalten Sie unter http://pe.usps.gov/cpim/ftp/pubs/Pub28/pub28.pdf. Beachten Sie, dass diese mehr als 130 Seiten umfasst. Regexes zu implementieren, das wäre verrückt.
Bei internationalen Adressen sind alle Wetten ungültig. In den USA ansässige Arbeitnehmer könnten nicht validieren.
Alternativ können Sie einen Datendienst verwenden. Ich habe jedoch keine Empfehlungen.
Außerdem: Wenn Sie das Material per Post versenden (dafür ist es das, oder?), Stellen Sie sicher, dass Sie "Adresskorrektur angefordert" auf den Umschlag (an der richtigen Stelle) setzen und die Datenbank aktualisieren . (Wir haben eine einfache Anleitung für die Person an der Rezeption erstellt, um dies zu tun; die Person, die tatsächlich die Post sortiert)
Wenn Sie Daten gesäubert haben, suchen Sie nach Duplikaten.
quelle
Nach dem Rat hier habe ich die folgende Funktion in VB entwickelt, die passable, wenn auch nicht immer perfekte (wenn ein Firmenname und eine Suite-Linie angegeben werden, kombiniert sie Suite und Stadt) nutzbare Daten erstellt. Bitte zögern Sie nicht, mich zu kommentieren / umzugestalten / anzuschreien, weil ich gegen eine meiner eigenen Regeln verstoßen habe usw.:
Wenn Sie die
parseAddress
Funktion "AP Croll & Son 2299 Lewes-Georgetown Highway, Georgetown, DE 19947" übergeben, wird Folgendes zurückgegeben:quelle
Ich arbeite jetzt seit ungefähr 5 Jahren in der Adressverarbeitungsdomäne, und es gibt wirklich keine Silberkugel. Die richtige Lösung hängt vom Wert der Daten ab. Wenn es nicht sehr wertvoll ist, werfen Sie es durch einen Parser, wie die anderen Antworten vermuten lassen. Wenn es sogar etwas wertvoll ist, muss auf jeden Fall ein Mensch alle Ergebnisse des Parsers bewerten / korrigieren. Wenn Sie nach einer vollautomatischen, wiederholbaren Lösung suchen, möchten Sie wahrscheinlich mit einem Anbieter für Adresskorrekturen wie Group1 oder Trillium sprechen.
quelle
Guter Vorschlag, alternativ können Sie für jede Adresse eine CURL-Anfrage an Google Maps ausführen, die die ordnungsgemäß formatierte Adresse zurückgibt. Von hier aus können Sie nach Herzenslust neu formulieren.
quelle
+1 auf James A. Rosens Lösungsvorschlag, da er für mich gut funktioniert hat. Für Komplettisten ist diese Website jedoch eine faszinierende Lektüre und der beste Versuch, Adressen weltweit zu dokumentieren: http://www.columbia.edu/kermit /postal.html
quelle
Gibt es überhaupt Standards für die Art und Weise, wie die Adressen aufgezeichnet werden? Beispielsweise:
Meine allgemeine Antwort ist eine Reihe von regulären Ausdrücken, deren Komplexität jedoch von der Antwort abhängt. Und wenn es überhaupt keine Konsistenz gibt, können Sie möglicherweise nur einen Teilerfolg mit einem Regex erzielen (dh Postleitzahl und Status herausfiltern) und müssen den Rest von Hand erledigen (oder zumindest den Rest sehr gut durchgehen) sorgfältig, um sicherzustellen, dass Sie die Fehler erkennen).
quelle
Eine weitere Anfrage für Beispieldaten.
Wie bereits erwähnt, würde ich vom Reißverschluss aus rückwärts arbeiten.
Sobald Sie eine Zip haben, würde ich eine Zip-Datenbank abfragen, die Ergebnisse speichern und sie und die Zip aus der Zeichenfolge entfernen.
Das wird Sie mit dem Adress-Chaos verlassen. Die meisten (alle?) Adressen beginnen mit einer Nummer. Suchen Sie also das erste Vorkommen einer Nummer in der verbleibenden Zeichenfolge und greifen Sie alles bis zum (neuen) Ende der Zeichenfolge ab. Das wird deine Adresse sein. Alles links von dieser Nummer ist wahrscheinlich ein Adressat.
Sie sollten jetzt Stadt, Bundesland und Postleitzahl in einer Tabelle und möglicherweise zwei Zeichenfolgen, Adressat und Adresse, speichern. Überprüfen Sie für die Adresse, ob "Suite" oder "Apt" vorhanden ist. usw. und teilen Sie diese in zwei Werte (Adresszeilen 1 & 2).
Für den Adressaten würde ich das letzte Wort dieser Zeichenfolge als Nachnamen stechen und nehmen und den Rest in das Feld für den Vornamen einfügen. Wenn Sie dies nicht tun möchten, müssen Sie zu Beginn nach Anreden suchen (Herr, Frau, Dr. usw.) und einige Annahmen treffen, die auf der Anzahl der Leerzeichen basieren, wie der Name lautet erfunden.
Ich glaube nicht, dass Sie mit 100% iger Genauigkeit analysieren können.
quelle
Versuchen Sie es mit www.address-parser.com . Wir nutzen ihren Webservice, den Sie online testen können
quelle
Basierend auf den Beispieldaten:
Ich würde am Ende der Zeichenfolge beginnen. Analysieren Sie eine Postleitzahl (beide Formate). Lesen Sie das Ende bis zum ersten Leerzeichen. Wenn keine Postleitzahl gefunden wurde Fehler.
Schneiden Sie das Ende dann für Leerzeichen und Sonderzeichen (Kommas)
Fahren Sie dann mit Status fort und verwenden Sie erneut das Leerzeichen als Trennzeichen. Verwenden Sie möglicherweise eine Suchliste, um 2-Buchstaben-Statuscodes und vollständige Statusnamen zu überprüfen. Wenn kein gültiger Status gefunden wurde, Fehler.
Schneiden Sie Leerzeichen und Kommas vom Ende wieder ab.
Stadt wird knifflig, ich würde hier tatsächlich ein Komma verwenden, auf die Gefahr hin, dass zu viele Daten in die Stadt gelangen. Suchen Sie nach dem Komma oder dem Zeilenanfang.
Wenn Sie noch Zeichen in der Zeichenfolge haben, schieben Sie all dies in ein Adressfeld.
Das ist nicht perfekt, aber es sollte ein ziemlich guter Ausgangspunkt sein.
quelle
Wenn es sich um vom Menschen eingegebene Daten handelt, verbringen Sie zu viel Zeit damit, die Ausnahmen zu codieren.
Versuchen:
Regulärer Ausdruck zum Extrahieren der Postleitzahl
Suche nach Postleitzahl (über die entsprechende Regierungsdatenbank), um die richtige Adresse zu erhalten
Lassen Sie einen Praktikanten manuell überprüfen, ob die neuen Daten mit den alten übereinstimmen
quelle
Dies wird Ihr Problem nicht lösen, aber wenn Sie nur Lat / Long-Daten für diese Adressen benötigen, analysiert die Google Maps-API nicht formatierte Adressen ziemlich gut.
quelle
RecogniContact ist ein Windows COM-Objekt, das US- und europäische Adressen analysiert. Sie können es direkt unter http://www.loquisoft.com/index.php?page=8 versuchen
quelle
Vielleicht möchten Sie dies überprüfen! http://jgeocoder.sourceforge.net/parser.html Hat für mich wie ein Zauber funktioniert.
quelle
Diese Art von Problem ist aufgrund der zugrunde liegenden Mehrdeutigkeiten in den Daten schwer zu lösen.
Hier ist eine Perl-basierte Lösung, die einen rekursiven Abstiegsgrammatikbaum basierend auf regulären Ausdrücken definiert, um viele gültige Kombinationen von Straßenadressen zu analysieren: http://search.cpan.org/~kimryan/Lingua-EN-AddressParse-1.20/lib/Lingua /DE/AddressParse.pm . Dies schließt Untereigenschaften innerhalb einer Adresse ein, wie z. B.: 12 1st Avenue N Suite Nr. 2 Irgendwo CA 12345 USA
Es ähnelt dem oben genannten http://search.cpan.org/~timb/Geo-StreetAddress-US-1.03/US.pm , funktioniert jedoch auch für Adressen, die nicht aus den USA stammen, z. B. Großbritannien, Australien und Kanada.
Hier ist die Ausgabe für eine Ihrer Beispieladressen. Beachten Sie, dass der Namensabschnitt zuerst aus "AP Croll & Son 2299 Lewes-Georgetown Highway, Georgetown, DE 19947" entfernt werden muss, um ihn auf "2299 Lewes-Georgetown Highway, Georgetown, DE 19947" zu reduzieren. Dies wird leicht erreicht, indem alle Daten bis zur ersten in der Zeichenfolge gefundenen Zahl entfernt werden.
quelle
Da die Möglichkeit eines Wortfehlers besteht, sollten Sie SOUNDEX in Kombination mit dem LCS-Algorithmus zum Vergleichen von Zeichenfolgen verwenden. Dies ist sehr hilfreich!
quelle
mit Google API
quelle
Für Ruby- oder Rails-Entwickler gibt es ein schönes Juwel namens street_address . Ich habe dies für eines meiner Projekte verwendet und es erledigt die Arbeit, die ich brauche.
Das einzige Problem, das ich hatte, war, wenn eine Adresse in diesem Format
P. O. Box 1410 Durham, NC 27702
Null zurückgab und daher "Postfach" durch '' ersetzen musste und sie danach analysieren konnte.quelle
Es gibt Datendienste, bei denen eine Postleitzahl eine Liste der Straßennamen in dieser Postleitzahl enthält.
Verwenden Sie eine Regex, um die Postleitzahl oder den Stadtstaat zu extrahieren - finden Sie die richtige oder wenn bei einem Fehler beides angezeigt wird. Ziehen Sie die Liste der Straßen aus einer Datenquelle. Korrigieren Sie die Stadt und das Bundesland und dann die Adresse. Sobald Sie eine gültige Adresszeile 1, Stadt, Bundesland und Postleitzahl erhalten haben, können Sie in der Adresszeile 2..3 Annahmen treffen
quelle
Ich weiß nicht, wie machbar das sein würde, aber ich habe dies nicht erwähnt gesehen, also dachte ich, ich würde weitermachen und Folgendes vorschlagen:
Wenn Sie ausschließlich in den USA sind, erhalten Sie eine riesige Datenbank mit allen Postleitzahlen, Bundesstaaten, Städten und Straßen. Suchen Sie diese nun in Ihren Adressen. Sie können überprüfen, was Sie gefunden haben, indem Sie testen, ob beispielsweise die gefundene Stadt in dem von Ihnen gefundenen Bundesstaat existiert, oder indem Sie überprüfen, ob die gefundene Straße in der gefundenen Stadt existiert. Wenn nicht, ist John wahrscheinlich nicht für Johns Straße, sondern der Name des Empfängers ... Holen Sie sich im Grunde die bestmöglichen Informationen und vergleichen Sie Ihre Adressen damit. Ein extremes Beispiel wäre, eine LISTE ALLER ADRESSEN IN DEN USA VON A zu erhalten und dann herauszufinden, welche für jede Ihrer Adressen am relevantesten ist ...
quelle
Es gibt einen Javascript-Port des Perl-Pakets Geo :: StreetAddress :: US: https://github.com/hassansin/parse-address . Es basiert auf Regex und funktioniert ziemlich gut.
quelle