Wir sind hauptsächlich in den USA tätig und versuchen, die Benutzererfahrung zu verbessern, indem wir alle Adressfelder in einem einzigen Textbereich kombinieren. Es gibt jedoch einige Probleme:
- Die vom Benutzer eingegebene Adresse ist möglicherweise nicht korrekt oder hat ein Standardformat
- Die Adresse muss in Teile (Straße, Stadt, Bundesland usw.) unterteilt werden, um Kreditkartenzahlungen verarbeiten zu können
- Benutzer können mehr als nur ihre Adresse eingeben (wie ihren Namen oder ihre Firma damit)
- Google kann dies tun, aber die Nutzungsbedingungen und Abfragegrenzen sind unerschwinglich, insbesondere bei einem knappen Budget
Anscheinend ist dies eine häufige Frage:
- PHP-Skript zum Analysieren der Adresse?
- Wie analysiere ich die Adresse im freien Format, um sie in der Datenbank zu speichern?
- Java Postanschrift Parser
- Effizientere Methode zum Extrahieren von Adresskomponenten
- Wie kann ich eine vorab ausgefüllte Postanschrift im Kontaktbildschirm mit Straße, Stadt, Postleitzahl auf Android anzeigen?
- PHP regexp US-Adresse
Gibt es eine Möglichkeit, eine Adresse vom Text zu isolieren und in Teile zu zerlegen? Gibt es einen regulären Ausdruck zum Analysieren von Adressen?
api
parsing
street-address
Matt
quelle
quelle
Antworten:
Ich habe diese Frage oft gesehen, als ich für eine Adressüberprüfungsfirma gearbeitet habe. Ich poste die Antwort hier, um sie Programmierern zugänglicher zu machen, die mit derselben Frage suchen. Die Firma, in der ich tätig war, hat Milliarden von Adressen verarbeitet, und wir haben dabei viel gelernt.
Zunächst müssen wir einige Dinge über Adressen verstehen.
Adressen sind nicht regelmäßig
Dies bedeutet, dass reguläre Ausdrücke nicht vorhanden sind. Ich habe alles gesehen, von einfachen regulären Ausdrücken, die Adressen in einem ganz bestimmten Format entsprechen, bis zu diesem:
... auf diese , wo eine 900+ Line-Klasse - Datei auf der Fliege einen super regulären Ausdruck erzeugt noch mehr entsprechen. Ich empfehle diese nicht (zum Beispiel hier eine Geige der obigen Regex, die viele Fehler macht ). Es gibt keine einfache Zauberformel, um dies zum Laufen zu bringen. In der Theorie und von der Theorie ist es nicht möglich , Adressen mit einem regulären Ausdruck übereinstimmen.
Die USPS-Publikation 28 dokumentiert die vielen möglichen Adressformate mit all ihren Schlüsselwörtern und Variationen. Am schlimmsten ist, dass Adressen oft nicht eindeutig sind. Wörter können mehr als eine Sache bedeuten ("St" kann "Saint" oder "Street" sein) und es gibt Wörter, von denen ich mir ziemlich sicher bin, dass sie erfunden wurden. (Wer wusste, dass "Stravenue" ein Straßensuffix ist?)
Sie benötigen einen Code, der Adressen wirklich versteht, und wenn dieser Code vorhanden ist, ist er ein Geschäftsgeheimnis. Aber Sie könnten wahrscheinlich Ihre eigenen rollen, wenn Sie wirklich darauf stehen.
Adressen gibt es in unerwarteten Formen und Größen
Hier sind einige erfundene (aber vollständige) Adressen:
Auch diese sind möglicherweise gültig:
Offensichtlich sind diese nicht standardisiert. Interpunktion und Zeilenumbrüche sind nicht garantiert. Folgendes ist los:
Nummer 1 ist vollständig, da sie eine Adresse sowie eine Stadt und ein Bundesland enthält. Mit diesen Informationen ist die Adresse ausreichend identifiziert und kann als "lieferbar" angesehen werden (mit einigen Standardisierungen).
Nummer 2 ist vollständig, da sie auch eine Straße (mit Sekundär- / Einheitennummer) und eine 5-stellige Postleitzahl enthält, die ausreicht, um eine Adresse zu identifizieren.
Nummer 3 ist ein vollständiges Postfachformat, da es eine Postleitzahl enthält.
Nummer 4 ist auch vollständig, da die Postleitzahl eindeutig ist , was bedeutet, dass eine private Einrichtung oder ein Unternehmen diesen Adressraum gekauft hat. Eine eindeutige Postleitzahl gilt für großvolumige oder konzentrierte Lieferräume. Alles, was an die Postleitzahl 12345 adressiert ist, geht an General Electric in Schenectady, NY. Dieses Beispiel wird niemanden besonders erreichen, aber der USPS könnte es trotzdem liefern.
Nummer 5 ist auch vollständig, ob Sie es glauben oder nicht. Mit nur diesen Nummern kann die vollständige Adresse ermittelt werden, wenn sie anhand einer Datenbank aller möglichen Adressen analysiert wird. Das Ausfüllen der fehlenden Anweisungen, des sekundären Bezeichners und der Postleitzahl + 4 ist trivial, wenn Sie jede Nummer als Komponente sehen. So sieht es aus, vollständig erweitert und standardisiert:
Adressdaten sind nicht Ihre eigenen
In den meisten Ländern, die lizenzierten Anbietern offizielle Adressdaten zur Verfügung stellen, gehören die Adressdaten selbst der zuständigen Behörde. In den USA besitzt der USPS die Adressen. Gleiches gilt für Canada Post, Royal Mail und andere, obwohl jedes Land das Eigentum ein wenig anders erzwingt oder definiert. Dies zu wissen ist wichtig, da es normalerweise das Reverse Engineering der Adressdatenbank verbietet. Sie müssen vorsichtig sein, wie Sie die Daten erfassen, speichern und verwenden.
Google Maps ist eine häufige Anlaufstelle für schnelle Adresskorrekturen, aber die Nutzungsbedingungen sind eher unerschwinglich. Beispielsweise können Sie ihre Daten oder APIs nicht ohne Anzeige einer Google Map und nur für nichtkommerzielle Zwecke verwenden (es sei denn, Sie zahlen), und Sie können die Daten nicht speichern (außer für temporäres Caching). Macht Sinn. Die Daten von Google gehören zu den besten der Welt. Google Maps überprüft die Adresse jedoch nicht . Wenn eine Adresse nicht existiert, wird es noch zeigen Ihnen , wo die Adresse wäre , wenn es tat exist (versuchen Sie es auf Ihrem eigenen Straße, verwenden Sie eine Hausnummer , dass Sie wissen , ist nicht vorhanden). Dies ist manchmal nützlich, aber seien Sie sich dessen bewusst.
Die Nutzungsrichtlinien von Nominatim sind ähnlich einschränkend, insbesondere für großvolumige und kommerzielle Zwecke. Die Daten stammen größtenteils aus freien Quellen und sind daher nicht so gut gepflegt (wie dies bei offenen Projekten der Fall ist). Dies kann jedoch weiterhin zutreffen Deine Bedürfnisse. Es wird von einer großartigen Community unterstützt.
Der USPS selbst verfügt über eine API, die jedoch stark abnimmt und weder Garantien noch Unterstützung bietet . Es könnte auch schwer zu bedienen sein. Einige Leute verwenden es sparsam und ohne Probleme. Es ist jedoch leicht zu übersehen, dass der USPS verlangt, dass Sie seine API nur zur Bestätigung von Adressen verwenden, um sie zu versenden.
Die Leute erwarten, dass Adressen schwierig sind
Leider haben wir unsere Gesellschaft darauf konditioniert, dass Adressen kompliziert sein werden. Es gibt Dutzende guter UX-Artikel im Internet darüber. Wenn Sie jedoch ein Adressformular mit einzelnen Feldern haben, erwarten die Benutzer dies, auch wenn es für Edge-Case-Adressen, die nicht zu den Adressen passen, schwieriger ist Format, das das Formular erwartet, oder möglicherweise erfordert das Formular ein Feld, das es nicht sollte. Oder Benutzer wissen nicht, wo sie einen bestimmten Teil ihrer Adresse ablegen sollen.
Ich könnte heutzutage immer wieder über die schlechte UX von Checkout-Formularen sprechen, aber stattdessen möchte ich nur sagen, dass das Kombinieren der Adressen in einem einzigen Feld eine willkommene Änderung ist - die Leute können ihre Adresse so eingeben, wie sie es für richtig halten , anstatt zu versuchen, Ihre lange Form herauszufinden. Diese Änderung ist jedoch unerwartet und kann für Benutzer zunächst etwas unangenehm sein. Sei dir dessen einfach bewusst.
Ein Teil dieser Schmerzen kann gelindert werden, indem das Feld vor die Adresse gestellt wird. Wenn sie zuerst das Länderfeld ausfüllen, wissen Sie, wie Sie Ihr Formular anzeigen können. Vielleicht haben Sie eine gute Möglichkeit, mit US-Adressen mit einem Feld umzugehen. Wenn sie also USA auswählen, können Sie Ihr Formular auf ein einzelnes Feld reduzieren, andernfalls werden die Komponentenfelder angezeigt. Nur Dinge zum Nachdenken!
Jetzt wissen wir, warum es schwer ist; Was können Sie dagegen tun?
Der USPS lizenziert Anbieter über einen Prozess namens CASS ™ -Zertifizierung, um Kunden verifizierte Adressen bereitzustellen. Diese Anbieter haben Zugriff auf die USPS-Datenbank, die monatlich aktualisiert wird. Ihre Software muss strengen Standards entsprechen, um zertifiziert zu werden, und sie erfordern nicht oft die Zustimmung zu den oben beschriebenen einschränkenden Bedingungen.
Es gibt viele CASS-zertifizierte Unternehmen, die Listen verarbeiten können oder über APIs verfügen: Melissa Data, Experian QAS und SmartyStreets, um nur einige zu nennen.
(Da ich wegen "Werbung" Flak bekomme, habe ich meine Antwort an dieser Stelle abgeschnitten. Es liegt an Ihnen, eine Lösung zu finden, die für Sie funktioniert.)
Die Wahrheit: Wirklich, Leute, ich arbeite in keiner dieser Firmen. Es ist keine Werbung.
quelle
libpostal: Eine Open-Source-Bibliothek zum Analysieren von Adressen, Training mit Daten aus OpenStreetMap, OpenAddresses und OpenCage.
https://github.com/openvenues/libpostal ( weitere Informationen dazu )
Andere Tools / Dienstleistungen:
http://www.gisgraphy.com Kostenlose, Open Source und einsatzbereite Geocoder- und Geolokalisierungs-Webservices, die OpenStreetMap, GeoNames und Quattroshapes integrieren.
https://github.com/kodapan/osm-common Bibliothek für den Zugriff auf OpenStreetMap-Dienste, das Parsen und Verarbeiten von Daten.
http://wiki.openstreetmap.org/wiki/Nominatim
http://address-parser.net/
http://geoservices.tamu.edu/Services/AddressNormalization/
quelle
Es gibt viele Parser für Straßenadressen. Sie gibt es in zwei Grundvarianten: solche mit Datenbanken mit Orts- und Straßennamen und solche ohne.
Ein Straßenadress-Parser mit regulären Ausdrücken kann ohne große Probleme eine Erfolgsrate von bis zu 95% erreichen. Dann fangen Sie an, die ungewöhnlichen Fälle zu treffen. Das Perl in CPAN, "Geo :: StreetAddress :: US", ist ungefähr so gut. Es gibt Python- und Javascript-Ports, alle Open Source. Ich habe eine verbesserte Version in Python, die die Erfolgsrate leicht erhöht, indem mehr Fälle behandelt werden. Um die letzten 3% richtig zu machen, benötigen Sie Datenbanken, um bei der Disambiguierung zu helfen.
Eine Datenbank mit dreistelligen Postleitzahlen und Namen und Abkürzungen von US-Bundesstaaten ist eine große Hilfe. Wenn ein Parser eine konsistente Postleitzahl und einen einheitlichen Statusnamen sieht, kann er beginnen, sich an das Format zu binden. Dies funktioniert sehr gut für die USA und Großbritannien.
Die richtige Analyse der Straßenadressen beginnt am Ende und funktioniert rückwärts. So machen es die USPS-Systeme. Adressen sind am Ende am wenigsten mehrdeutig, da Ländernamen, Städtenamen und Postleitzahlen relativ leicht zu erkennen sind. Straßennamen können normalerweise isoliert werden. Orte auf Straßen sind am komplexesten zu analysieren. Dort begegnet man Dingen wie "Fifth Floor" und "Staples Pavillion". Dann ist eine Datenbank eine große Hilfe.
quelle
UPDATE: Geocode.xyz funktioniert jetzt weltweit. Beispiele finden Sie unter https://geocode.xyz
Für USA, Mexiko und Kanada siehe geocoder.ca .
Beispielsweise:
Sie können die Ergebnisse auch in der Weboberfläche überprüfen oder als Json oder Jsonp ausgeben. z.B. Ich suche nach Restaurants in der 123 Main Street, New York
quelle
geocode.xyz
diescantext
Methode die meiste Zeit fehl. Es wählte immer "Genf, USA" gegenüber "Genf, Schweiz" und war im Allgemeinen US-voreingenommen.Kein Code? Zum Schämen!
Hier ist ein einfacher JavaScript-Adressparser. Es ist ziemlich schrecklich für jeden einzelnen Grund, den Matt in seiner obigen Dissertation angibt (dem ich fast zu 100% zustimme: Adressen sind komplexe Typen, und Menschen machen Fehler; besser auszulagern und zu automatisieren - wenn Sie es sich leisten können).
Aber anstatt zu weinen, beschloss ich zu versuchen:
Dieser Code funktioniert zum Parsen der meisten Esri-Ergebnisse für
findAddressCandidate
und auch mit einigen anderen (umgekehrten) Geocodierern, die eine einzeilige Adresse zurückgeben, bei der Straße / Stadt / Bundesland durch Kommas getrennt sind. Sie können erweitern, wenn Sie länderspezifische Parser möchten oder schreiben. Oder verwenden Sie dies einfach als Fallstudie, wie herausfordernd diese Übung sein kann oder wie mies ich bei JavaScript bin. Ich gebe zu, dass ich nur etwa 30 Minuten damit verbracht habe (zukünftige Iterationen könnten Caches, Zip-Validierung und Status-Lookups sowie den Kontext des Benutzerstandorts hinzufügen), aber es hat für meinen Anwendungsfall funktioniert: Der Endbenutzer sieht ein Formular, das die Geocode-Suchantwort in 4 analysiert Textfelder. Wenn die Adressanalyse falsch ist (was selten vorkommt, es sei denn, die Quelldaten waren schlecht), ist dies keine große Sache - der Benutzer kann sie überprüfen und beheben! (Bei automatisierten Lösungen kann dies jedoch entweder verworfen / ignoriert oder als Fehler gekennzeichnet werden, sodass Entwickler entweder das neue Format unterstützen oder Quelldaten korrigieren können.)quelle
Wenn Sie sich auf OSM-Daten verlassen möchten, ist libpostal sehr leistungsfähig und behandelt viele der häufigsten Einschränkungen bei Adresseneingaben.
quelle
Eine weitere Option für Adressen in den USA ist YAddress (erstellt von der Firma, für die ich arbeite).
Viele Antworten auf diese Frage schlagen Geokodierungswerkzeuge als Lösung vor. Es ist wichtig, das Parsen und Geokodieren von Adressen nicht zu verwechseln. Sie sind nicht gleich. Während Geocodierer eine Adresse als Nebeneffekt in Komponenten aufteilen können, stützen sie sich normalerweise auf nicht standardmäßige Adressensätze. Dies bedeutet, dass eine vom Geocoder analysierte Adresse möglicherweise nicht mit der offiziellen Adresse übereinstimmt. Was die Google-Geokodierungs-API beispielsweise in Manhattan "6th Ave" nennt, nennt USPS "Avenue of the Americas".
quelle
Für das Parsen von US-Adressen
Ich bevorzuge die Verwendung eines Usaddress-Pakets, das in Pip nur für Usaddress verfügbar ist
Dokumentation
PyPi
Dies funktionierte gut für mich für US-Adresse.
Ausführen der Datei address_parser.py
quelle
In einem unserer Projekte haben wir den folgenden Adressparser verwendet. Es analysiert Adressen für die meisten Länder der Welt mit guter Genauigkeit.
http://address-parser.net/
Es ist als eigenständige Bibliothek oder als Live-API verfügbar.
quelle
Ich bin zu spät zur Party, hier ist ein Excel VBA-Skript, das ich vor Jahren für Australien geschrieben habe. Es kann leicht geändert werden, um andere Länder zu unterstützen. Ich habe hier ein GitHub-Repository des C # -Codes erstellt. Ich habe es auf meiner Website gehostet und Sie können es hier herunterladen: http://jeremythompson.net/rocks/ParseAddress.xlsm
Strategie
Für jedes Land mit einem Postleitzahl, der numerisch ist oder mit einem RegEx abgeglichen werden kann, funktioniert meine Strategie sehr gut:
Zuerst erkennen wir den Vor- und Nachnamen, von denen angenommen wird, dass sie die oberste Zeile sind. Es ist einfach, den Namen zu überspringen und mit der Adresse zu beginnen, indem Sie das Kontrollkästchen deaktivieren (wie unten gezeigt "Name ist oberste Zeile" genannt).
Als nächstes ist es sicher zu erwarten, dass die Adresse, bestehend aus Straße und Hausnummer, vor dem Vorort steht und die St, Pde, Ave, Av, Rd, Cres, Schleife usw. ein Trennzeichen ist.
Das Erkennen des Vorortes gegenüber dem Staat und sogar dem Land kann die anspruchsvollsten Parser austricksen, da es zu Konflikten kommen kann. Um dies zu überwinden verwende ich einen PLZ Look basierte auf der Tatsache , dass nach der Strippe Straße und Wohnung / Einheit Zahlen sowie das PoBox, Ph, Fax , Handy usw., nur die Postleitzahl Zahl bleiben wird. Dies ist einfach mit einem regEx abzugleichen, um dann die Vororte und das Land nachzuschlagen.
Beispiel
VBA-Code
HAFTUNGSAUSSCHLUSS, ich weiß, dass dieser Code nicht perfekt oder sogar gut geschrieben ist, aber es ist sehr einfach, ihn in eine beliebige Programmiersprache zu konvertieren und in jeder Art von Anwendung auszuführen. Die Strategie ist die Antwort, abhängig von Ihrem Land und den Regeln. Nehmen Sie diesen Code als Beispiel ::
quelle