0

Wir möchten die Adressfelder aus einem Dokument identifizieren. Zur Identifizierung der Adressfelder haben wir das Dokument mit Tesseract in OCR-Dateien konvertiert. Aus der Tesseract-Ausgabe möchten wir überprüfen, ob eine Zeichenfolge das Adressfeld enthält oder nicht. Welches ist die richtige Strategie, um dieses Problem zu lösen?Wie überprüft man, ob eine Eingabezeile eine Adresse enthält oder nicht?

  1. Es ist nicht möglich, dieses Problem mit der Regex zu lösen, weil Adressfelder unterschiedlich sind für verschiedene Dokumente und Länder
  2. Versuchen NLTK für die Worte, die Klassifizierung, aber nicht funktionieren perfekt für Adressfeld.

Erforderliche Ausgabe

I am staying at 234 23 Philadelphia - Contains address files <234 23 Philadelphia> 

I am looking for a place to stay - Not contains address 

Geben Sie Ihre Vorschläge, dieses Problem zu lösen.

Antwort

1

Wie bei vielen ML-Problemen gibt es mehrere mögliche Lösungen, und der wichtige Teil (und der eine häufig größere Auswirkungen hat) ist nicht, welchen Algorithmus oder Modell Sie verwenden, sondern Engineering, Datenvorverarbeitung und -standardisierung und dergleichen Das. Die erste Lösung kommt meiner Meinung nach (und es ist nur eine Idee, ich würde es testen und sehen, wie er ausführt) seine:

  1. Ihre Trainingssatz Beispiele bekommen und die „N“ am häufigsten verwendeten Wörter in allen Beispielen Liste (das ist Ihr Vokabular), diese Liste enthält jedes der "N" am häufigsten verwendeten Wörter, jedes Wort würde durch eine Nummer (den Listenindex) dargestellt.
  2. Transformieren Sie Ihre Trainingsbeispiele: Lesen Sie jedes Trainingsbeispiel und ändern Sie seine Darstellung Ersetzen jedes Wortes durch die Nummer des Wortes im Vokabular.
  3. Schließlich erstellen Sie für jedes Trainingsbeispiel einen Merkmalsvektor gleicher Größe wie das Vokabular, und für jedes Wort im Vokabular ist Ihr Merkmalsvektor 0 (das entsprechende Wort existiert in Ihrem Beispiel nicht) oder 1 (es existiert) , oder die Anzahl, wie oft das Wort erscheint (wieder, das ist Feature Engineering)
  4. Trainieren Sie mehrere Klassifikatoren, Varing-Algorithmen, Parameter, Trainingssatzgrößen, etc, und tun Sie Kreuzvalidierung, um Ihr bestes Modell zu wählen.

Und von dort hält das Standard-Workflow ML ...

0

Wenn Sie in nur Überprüfung JA oder NEIN und nicht die Extraktion der vollständigen Adresse interessiert sind, eine einfache Lösung kann NER sein.

Sie können versuchen, zu überprüfen, ob Text Standort enthält oder nicht.

Beispiel:

import nltk 
def check_location(text): 
    for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(text))): 
     if hasattr(chunk, "label"): 
      if chunk.label() == "GPE" or chunk.label() == "GSP": 
       return "True" 
    return "False" 

text="I am staying at 234 23 Philadelphia." 
print(text+" - "+check_location(text)) 

text="I am looking for a place to stay." 
print(text+" - "+check_location(text)) 

Ausgang:

# I am staying at 234 23 Philadelphia. - True 
# I am looking for a place to stay. - False 

Wenn Sie als vollständige Adresse extrahieren möchten, müssen Sie Ihr eigenes Modell trainieren.

Sie können überprüfen: NER with NLTK, CRF++.

-2

Warum sagen Sie, dass reguläre Ausdrücke nicht funktionieren?

Definieren Sie grundsätzlich alle verschiedenen Adressformen, die Ihnen in Form von regulären Ausdrücken begegnen. Passen Sie dann die Ausdrücke an.

0

Sie haben Recht. Using regex to find an address in a string is messy.

Es gibt APIs, die versuchen, Adressen für Sie zu extrahieren. Diese APIs sind nicht immer garantiert, Adressen aus Strings zu extrahieren, aber sie werden ihr Bestes geben. Ein Beispiel für eine API zum Extrahieren von Straßenadressen stammt von SmartyStreets. Documentation here und demo here.

Etwas zu beachten ist, dass sogar Ihr Beispiel (I am staying at 234 23 Philadelphia) keine vollständige Adresse enthält. Es fehlt ein Status- oder Postleitzahlenfeld. Dies macht es sehr schwierig, programmatisch zu bestimmen, ob eine Adresse vorhanden ist. Sobald dieser Beispielzeichenfolge ein Status oder eine Postleitzahl hinzugefügt wurde (I am staying at 234 23 Philadelphia PA), wird es viel einfacher, programmgesteuert festzustellen, ob eine Adresse in der Zeichenfolge enthalten ist.

Haftungsausschluss: Ich arbeite für SmartyStreets