Analysieren Sie die verwendbare Adresse, Stadt, Bundesland, Postleitzahl einer Zeichenfolge [geschlossen]

131

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:

  1. Nehmen Sie eine Adresse in den USA an (vorerst)

  2. Angenommen, die Eingabezeichenfolge enthält manchmal einen Adressaten (die angesprochene Person) und / oder eine zweite Adresse (dh Suite B).

  3. Zustände können abgekürzt werden

  4. Die Postleitzahl kann standardmäßig 5-stellig oder Postleitzahl + 4 sein

  5. 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

Rob Allen
quelle
Einige Fragen: 1. Trennzeichen? 2. Wie ist die Feldreihenfolge in der Zeichenfolge? 3. Welches Verhalten möchten Sie im Falle eines Datenfehlers (z. B. Adresse in ein einzelnes Feld in der SQL-Tabelle verschieben, andere leer lassen)
Jay Mooney
Gute Frage und sehr interessante Antworten. Das Zurückarbeiten von der Zip-Datei scheint ein häufiges Thema zu sein. Wenn Sie jedoch Rohdaten von Kunden verwenden, ist die Zip-Datei möglicherweise nicht korrekt. Ich würde vermuten, dass die meisten Websites beispielsweise in 90210 eine unverhältnismäßig große Anzahl von Adressen haben.
Kevin Williams
4
@ Kevin: Ja, weil Sie Amerikaner uns Kanadier gerne aussperren, indem Sie eine "Postleitzahl" benötigen und unsere Postleitzahlen nicht akzeptieren, was uns dazu zwingt, etwas Quatsch einzugeben, um das System zu umgehen ... leider die einzige Postleitzahl, die ich habe know is 90210 :-) Edit: Nevermind ... du lebst anscheinend ein paar Kilometer von mir entfernt in BC. Dann machst du wahrscheinlich auch das Gleiche :-P
mpen
2
In dieser SO-Frage finden Sie eine erweiterte Übersicht.
Matt

Antworten:

118

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.)

  1. Rückwärts arbeiten. Beginnen Sie mit der Postleitzahl, die sich dem Ende nähert, und in einem von zwei bekannten Formaten: XXXXX oder XXXXX-XXXX. Wenn dies nicht angezeigt wird, können Sie davon ausgehen, dass Sie sich in der Stadt, im Bundesstaat unten befinden.
  2. Das nächste, vor dem Reißverschluss, wird der Zustand sein, und es wird entweder in einem Zwei-Buchstaben-Format oder als Wörter sein. Sie wissen auch, was das sein wird - es gibt nur 50 davon. Sie können die Wörter auch soxten, um Rechtschreibfehler zu kompensieren.
  3. davor ist die Stadt, und sie ist wahrscheinlich auf der gleichen Linie wie der Staat. Sie können eine Postleitzahlendatenbank verwenden , um die Stadt und das Bundesland anhand der Postleitzahl zu überprüfen, oder sie zumindest als BS-Detektor verwenden.
  4. Die Adresse besteht in der Regel aus einer oder zwei Zeilen. Die zweite Zeile ist im Allgemeinen die Suite-Nummer, wenn es eine gibt, es kann sich aber auch um ein Postfach handeln.
  5. Es wird nahezu unmöglich sein, einen Namen in der ersten oder zweiten Zeile zu erkennen. Wenn ihm jedoch keine Nummer vorangestellt ist (oder wenn ihm ein "attn:" oder "Aufmerksamkeit auf:" vorangestellt ist, kann dies einen Hinweis geben ob es sich um einen Namen oder eine Adresszeile handelt.

Ich hoffe das hilft etwas.

Tim Sullivan
quelle
14
Zwar gibt es 50 Bundesstaaten, doch laut USPS gibt es im Bereich des United States Postal Service 59 Abkürzungen mit zwei Buchstaben, 65, wenn man die amerikanischen Streitkräfte mitzählt. usps.com/send/official-abbreviations.htm
Mike Sherrill 'Cat Recall'
17
"Nur 50" sollte anzeigen, dass es eine ziemlich kleine Zahl gibt. Es könnte "nur 65" sein, aber das ist nicht wichtig, um das vorliegende Problem zu lösen.
Tim Sullivan
4
Dieser Algorithmus ist auch in der USPS-Veröffentlichung 28
Matt
92

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

{
  "name": "1600 Amphitheatre Parkway, Mountain View, CA, USA",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [
    {
      "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "AddressDetails": {
        "Country": {
          "CountryNameCode": "US",
          "AdministrativeArea": {
            "AdministrativeAreaName": "CA",
            "SubAdministrativeArea": {
              "SubAdministrativeAreaName": "Santa Clara",
              "Locality": {
                "LocalityName": "Mountain View",
                "Thoroughfare": {
                  "ThoroughfareName": "1600 Amphitheatre Pkwy"
                },
                "PostalCode": {
                  "PostalCodeNumber": "94043"
                }
              }
            }
          }
        },
        "Accuracy": 8
      },
      "Point": {
        "coordinates": [-122.083739, 37.423021, 0]
      }
    }
  ]
}

Nun , das ist parseable!

James A. Rosen
quelle
4
Da dies ein Batch-Prozess ist, würde ich auch empfehlen, einen Thread-Pool für die Geokodierung zu verwenden, damit Sie mehrere Adressen gleichzeitig senden können (unterstützt Google eine Batch-Schnittstelle jeglicher Art?)
David
Dies würde nicht wirklich helfen mit der Adresszeile zwei (Pint 5 in der Frage)
Christopher Mahan
71
Die Nutzungsbedingungen sind hier häufig ein begrenzender Faktor für kommerzielle und / oder nicht öffentliche Zwecke.
Jay
Dies ist eine gute Lösung, aber es gibt Randfälle, für die Google / Yahoo keine Ergebnisse zurückgibt, z. B. neue Adressen und Adressen, die einfach in ihrer Datenbank fehlen.
Peter DeWeese
Dies wäre eine gute Lösung. "WENN" Google Batch-Anrufe nicht auf die MAPS-APIs beschränkt hat
Hector
25

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.

Nicholas Piasecki
quelle
17

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:Geben Sie hier die Bildbeschreibung ein

Und hier ist die CSV-formatierte Ausgabe derselben Anfrage:

ID,Start,End,Segment,Verified,Candidate,Firm,FirstLine,SecondLine,LastLine,City,State,ZIPCode,County,DpvFootnotes,DeliveryPointBarcode,Active,Vacant,CMRA,MatchCode,Latitude,Longitude,Precision,RDI,RecordType,BuildingDefaultIndicator,CongressionalDistrict,Footnotes
1,32,79,"2299 Lewes-Georgetown Hwy, Georgetown, DE 19947",N,,,,,,,,,,,,,,,,,,,,,,
2,81,119,"11522 Shawnee Road, Greenwood DE 19950",Y,0,,11522 Shawnee Rd,,Greenwood DE 19950-5209,Greenwood,DE,19950,Sussex,AABB,199505209226,Y,N,N,Y,38.82865,-75.54907,Zip9,Residential,S,,AL,N#
3,121,160,"144 Kings Highway, S.W. Dover, DE 19901",Y,0,,144 Kings Hwy,,Dover DE 19901-7308,Dover,DE,19901,Kent,AABB,199017308444,Y,N,N,Y,39.16081,-75.52377,Zip9,Commercial,S,,AL,L#
4,190,232,"2 Penns Way Suite 405 New Castle, DE 19720",Y,0,,2 Penns Way Ste 405,,New Castle DE 19720-2407,New Castle,DE,19720,New Castle,AABB,197202407053,Y,N,N,Y,39.68332,-75.61043,Zip9,Commercial,H,,AL,N#
5,247,285,"33 Bridle Ridge Court, Lewes, DE 19958",Y,0,,33 Bridle Ridge Cir,,Lewes DE 19958-8961,Lewes,DE,19958,Sussex,AABB,199588961338,Y,N,N,Y,38.72749,-75.17055,Zip7,Residential,S,,AL,L#
6,306,339,"2742 Pulaski Hwy Newark, DE 19711",Y,0,,2742 Pulaski Hwy,,Newark DE 19702-3911,Newark,DE,19702,New Castle,AABB,197023911421,Y,N,N,Y,39.60328,-75.75869,Zip9,Commercial,S,,AL,A#
7,341,378,"2284 Bryn Zion Road, Smyrna, DE 19904",Y,0,,2284 Bryn Zion Rd,,Smyrna DE 19977-3895,Smyrna,DE,19977,Kent,AABB,199773895840,Y,N,N,Y,39.23937,-75.64065,Zip7,Residential,S,,AL,A#N#
8,406,450,"1500 Serpentine Road, Suite 100 Baltimore MD",Y,0,,1500 Serpentine Rd Ste 100,,Baltimore MD 21209-2034,Baltimore,MD,21209,Baltimore,AABB,212092034250,Y,N,N,Y,39.38194,-76.65856,Zip9,Commercial,H,,03,N#
9,455,495,"580 North Dupont Highway Dover, DE 19901",Y,0,,580 N DuPont Hwy,,Dover DE 19901-3961,Dover,DE,19901,Kent,AABB,199013961803,Y,N,N,Y,39.17576,-75.5241,Zip9,Commercial,S,,AL,N#
10,497,525,"P.O. Box 778 Dover, DE 19903",Y,0,,PO Box 778,,Dover DE 19903-0778,Dover,DE,19903,Kent,AABB,199030778781,Y,N,N,Y,39.20946,-75.57012,Zip5,Residential,P,,AL,

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.

Matt
quelle
2
Smartystreets ist unglaublich gut darin, was sie tun. Sehr erfreut zu hören, dass dies eine API ist, die sie unterstützen.
ftrotter
16

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.

Christopher Mahan
quelle
14

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.:

Public Function parseAddress(ByVal input As String) As Collection
    input = input.Replace(",", "")
    input = input.Replace("  ", " ")
    Dim splitString() As String = Split(input)
    Dim streetMarker() As String = New String() {"street", "st", "st.", "avenue", "ave", "ave.", "blvd", "blvd.", "highway", "hwy", "hwy.", "box", "road", "rd", "rd.", "lane", "ln", "ln.", "circle", "circ", "circ.", "court", "ct", "ct."}
    Dim address1 As String
    Dim address2 As String = ""
    Dim city As String
    Dim state As String
    Dim zip As String
    Dim streetMarkerIndex As Integer

    zip = splitString(splitString.Length - 1).ToString()
    state = splitString(splitString.Length - 2).ToString()
    streetMarkerIndex = getLastIndexOf(splitString, streetMarker) + 1
    Dim sb As New StringBuilder

    For counter As Integer = streetMarkerIndex To splitString.Length - 3
        sb.Append(splitString(counter) + " ")
    Next counter
    city = RTrim(sb.ToString())
    Dim addressIndex As Integer = 0

    For counter As Integer = 0 To streetMarkerIndex
        If IsNumeric(splitString(counter)) _
            Or splitString(counter).ToString.ToLower = "po" _
            Or splitString(counter).ToString().ToLower().Replace(".", "") = "po" Then
                addressIndex = counter
            Exit For
        End If
    Next counter

    sb = New StringBuilder
    For counter As Integer = addressIndex To streetMarkerIndex - 1
        sb.Append(splitString(counter) + " ")
    Next counter

    address1 = RTrim(sb.ToString())

    sb = New StringBuilder

    If addressIndex = 0 Then
        If splitString(splitString.Length - 2).ToString() <> splitString(streetMarkerIndex + 1) Then
            For counter As Integer = streetMarkerIndex To splitString.Length - 2
                sb.Append(splitString(counter) + " ")
            Next counter
        End If
    Else
        For counter As Integer = 0 To addressIndex - 1
            sb.Append(splitString(counter) + " ")
        Next counter
    End If
    address2 = RTrim(sb.ToString())

    Dim output As New Collection
    output.Add(address1, "Address1")
    output.Add(address2, "Address2")
    output.Add(city, "City")
    output.Add(state, "State")
    output.Add(zip, "Zip")
    Return output
End Function

Private Function getLastIndexOf(ByVal sArray As String(), ByVal checkArray As String()) As Integer
    Dim sourceIndex As Integer = 0
    Dim outputIndex As Integer = 0
    For Each item As String In checkArray
        For Each source As String In sArray
            If source.ToLower = item.ToLower Then
                outputIndex = sourceIndex
                If item.ToLower = "box" Then
                    outputIndex = outputIndex + 1
                End If
            End If
            sourceIndex = sourceIndex + 1
        Next
        sourceIndex = 0
    Next
    Return outputIndex
End Function

Wenn Sie die parseAddressFunktion "AP Croll & Son 2299 Lewes-Georgetown Highway, Georgetown, DE 19947" übergeben, wird Folgendes zurückgegeben:

2299 Lewes-Georgetown Hwy
A. P. Croll & Son  
Georgetown
DE
19947
Rob Allen
quelle
13

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.

Nicholas Trandem
quelle
8

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.

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.

Kevin
quelle
7

+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

Weston
quelle
6

Gibt es überhaupt Standards für die Art und Weise, wie die Adressen aufgezeichnet werden? Beispielsweise:

  1. Gibt es immer Kommas oder neue Zeilen, die Straße1 von Straße2 von Stadt von Staat von Postleitzahl trennen?
  2. Sind die Adresstypen (Straße, Straße, Boulevard usw.) immer angegeben? immer abgekürzt? Einige von jedem?
  3. Definieren Sie "Fehler".

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).

Yaakov Ellis
quelle
6

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.

Futter
quelle
6

Versuchen Sie es mit www.address-parser.com . Wir nutzen ihren Webservice, den Sie online testen können

Wir wissen
quelle
1
Dies eignet sich gut, um beispielsweise eine Adresse in einem großen HTML-Dokument zu finden. Ich wünschte nur, sie hätten eine REST-Schnittstelle und keine SOAP. Vielen Dank für das Teilen dieses Links.
Jspooner
1
Wenn Sie mit ihnen verbunden sind, müssen Sie dies offenlegen.
Matt
1
Es wäre schön, wenn sie eine Preisschätzung abgeben würden, anstatt zu verlangen, dass ich ihnen sage, wie wertvoll ihr Service ist, bevor sie einen Preis angeben.
Toaster
5

Basierend auf den Beispieldaten:

  1. 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.

  2. Schneiden Sie das Ende dann für Leerzeichen und Sonderzeichen (Kommas)

  3. 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.

  4. Schneiden Sie Leerzeichen und Kommas vom Ende wieder ab.

  5. 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.

  6. 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.

Jay Mooney
quelle
4

Wenn es sich um vom Menschen eingegebene Daten handelt, verbringen Sie zu viel Zeit damit, die Ausnahmen zu codieren.

Versuchen:

  1. Regulärer Ausdruck zum Extrahieren der Postleitzahl

  2. Suche nach Postleitzahl (über die entsprechende Regierungsdatenbank), um die richtige Adresse zu erhalten

  3. Lassen Sie einen Praktikanten manuell überprüfen, ob die neuen Daten mit den alten übereinstimmen

engtech
quelle
3

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.

pix0r
quelle
3

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
RecogniContact scheint für die Öffentlichkeit geschlossen zu sein. Für den Zugriff muss ein Kontaktformular gesendet werden, es erfolgt jedoch keine Antwort. Vielleicht weiß jemand anderes, wie er mit ihnen in Kontakt treten kann.
Luke Van Am
3

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.

Non matching part       ''
Error                   '0'
Error descriptions      ''
Case all                '2299 Lewes-Georgetown Hwy Georgetown DE 19947'
COMPONENTS              ''
country                 ''
po_box_type             ''
post_box                ''
post_code               '19947'
pre_cursor              ''
property_identifier     '2299'
property_name           ''
road_box                ''
street                  'Lewes-Georgetown'
street_direction        ''
street_type             'Hwy'
sub_property_identifier ''
subcountry              'DE'
suburb                  'Georgetown'
Kim Ryan
quelle
2

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!

anand
quelle
2

mit Google API

$d=str_replace(" ", "+", $address_url);
$completeurl ="http://maps.googleapis.com/maps/api/geocode/xml?address=".$d."&sensor=true"; 
$phpobject = simplexml_load_file($completeurl);
print_r($phpobject);
komal
quelle
1
Das ist wahrscheinlich gegen den ToS, sieht aber so aus, als ob es funktionieren sollte - obwohl die Frage erneut gelesen wird, entspricht sie nicht genau den Anforderungen.
Jamie Bull
2

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.

Sachin Prasad
quelle
Der Link zum obigen Modul ist defekt. Verwenden Sie stattdessen Folgendes
Kim Ryan
1

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

AdamSane
quelle
1

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 ...

Shawn
quelle