Verarbeiten von fehlerhaften Textdaten mit maschinellem Lernen oder NLP

8

Ich versuche, Daten aus einigen großen Textdateien zu extrahieren, die Einträge über Personen enthalten. Das Problem ist jedoch, dass ich nicht kontrollieren kann, wie die Daten zu mir kommen.

Es ist normalerweise in einem Format wie folgt:

  

NACHNAME, Vorname Nachname (Vielleicht ein Spitzname) Warum ist dieser Text hierJanuar, 25, 2012

     

Vorname Nachname 2001 Einige Texte, die mich nicht interessieren

     

Nachname, Vorname blah blah ... 25. Januar 2012 ...

Momentan verwende ich einen großen Regex, der alle kindaCamelcase Wörter, alle Wörter, die einen Monatsnamen angeheftet haben, und viele Sonderfälle für Namen aufteilt. Dann verwende ich mehr Regex, um viele Kombinationen für den Namen und das Datum zu extrahieren.

Das scheint suboptimal.

Gibt es Machine-Learning-Bibliotheken für Python, die fehlerhafte Daten analysieren können, die etwas strukturiert sind?

Ich habe versucht NLTK, aber es konnte nicht mit meinen schmutzigen Daten umgehen. Ich bastle gerade mit Orange herum und ich mag es, dass es OOP-Stil ist, aber ich bin mir nicht sicher, ob ich meine Zeit verschwenden werde.

Idealerweise würde ich gerne so etwas tun, um einen Parser zu trainieren (mit vielen Input / Output-Paaren):

%Vor%

Ist so etwas möglich oder überschätze ich maschinelles Lernen? Irgendwelche Vorschläge werden geschätzt, da ich mehr über dieses Thema erfahren möchte.

    
Blender 25.01.2012, 21:49
quelle

5 Antworten

3

Am Ende habe ich eine etwas komplizierte Reihe von erschöpfenden Regexes implementiert, die jeden möglichen Anwendungsfall mit textbasierten "Filtern" umfassten, die beim Laden des Parsers durch die passenden Regex ersetzt wurden.

Wenn jemand an dem Code interessiert ist, werde ich ihn in dieser Antwort bearbeiten.

Hier ist im Grunde, was ich benutzt habe. Um die regulären Ausdrücke aus meiner "Sprache" zu konstruieren, musste ich Ersatzklassen erstellen:

%Vor%

Dann habe ich eine generische Klasse Matcher erstellt, die eine Regex für ein bestimmtes Muster mit dem Musternamen erstellt:

%Vor%

Schließlich gibt es das generische Objekt Pattern :

%Vor%

Es wurde ziemlich kompliziert, aber es hat funktioniert. Ich werde nicht den gesamten Quellcode posten, aber dies sollte jemanden dazu bringen, zu beginnen. Am Ende hat es eine Datei wie folgt konvertiert:

%Vor%

In eine kompilierte Regex mit benannten Erfassungsgruppen.

    
Blender 09.03.2012, 06:47
quelle
0

Ich habe ein ähnliches Problem, hauptsächlich wegen des Problems mit dem Export von Daten aus Microsoft Office 2010 und das Ergebnis ist eine Verbindung zwischen zwei aufeinander folgenden Wörtern in etwas regelmäßigen Abständen. Der Domainbereich ist morhologischer Betrieb wie ein Rechtschreibprüfer. Sie können zur maschinellen Lernlösung springen oder eine heuristische Lösung wie ich erstellen.

Die einfache Lösung besteht darin, anzunehmen, dass das neu gebildete Wort eine Kombination von Eigennamen ist (wobei das erste Zeichen großgeschrieben wird).

Die zweite zusätzliche Lösung besteht darin, ein Wörterbuch gültiger Wörter zu haben und eine Reihe von Partitionsorten zu versuchen, die zwei (oder mindestens ein) gültige Wörter erzeugen. Ein anderes Problem kann auftreten, wenn einer von ihnen ein richtiger Name ist, der definitionsgemäß außerhalb des Vokabulars in dem vorherigen Wörterbuch ist. Vielleicht können wir eine Wortlängenstatistik verwenden, die verwendet werden kann, um zu identifizieren, ob ein Wort ein fälschlicherweise gebildetes Wort oder tatsächlich ein legitimes Wort ist.

In meinem Fall ist dies ein Teil der manuellen Korrektur großer Korpora von Text (eine Mensch-in-der-Schleife-Verifikation), aber das einzige, was automatisiert werden kann, ist die Auswahl von wahrscheinlich missgebildeten Wörtern und deren korrigierte Empfehlung.

    
Peb 25.01.2012 22:53
quelle
0

Was die verketteten Wörter betrifft, können Sie sie mit einem Tokenizer teilen:

  

Die OpenNLP Tokenizer segmentieren eine Eingabe-Zeichenfolge in Token. Token sind normalerweise Wörter, Interpunktionszeichen, Zahlen usw.

Zum Beispiel:

  

Pierre Vinken, 61 Jahre alt, wird am 29. November als Non-Executive Director dem Vorstand beitreten.

wird in

geschrieben
  

Pierre Vinken, 61 Jahre alt, wird am 29. November als nicht exekutiver Direktor in den Vorstand eintreten.

OpenNLP hat einen "lernbaren Tokenizer", den Sie trainieren können. Wenn das nicht funktioniert, können Sie die Antworten versuchen: Erkennen Sie höchstwahrscheinlich Wörter aus Text ohne Leerzeichen / kombinierte Wörter .

Wenn die Aufteilung abgeschlossen ist, können Sie die Interpunktion ausschließen und an ein NER-System wie CoreNLP übergeben:

  

Johnson John Doe Vielleicht ein Spitzname Warum ist dieser Text hier 25. Januar 2012

welche Ausgaben:

%Vor%     
cyborg 26.01.2012 00:33
quelle
0

Ein Teil Ihres Problems: "alle Wörter, die einen Monatsnamen am Ende angeheftet haben",

Wenn es so aussieht, als hätten Sie ein Datum im Format Monthname 1-or-2-digit-day-number, yyyy am Ende der Zeichenkette, sollten Sie eine Regex verwenden, um diese zuerst abzumachen. Dann haben Sie einen viel einfacheren Job für den Rest der Eingabezeichenfolge.

Hinweis: Sonst könnte es zu Problemen mit Vornamen kommen, die auch Monatsnamen sind, z. April, Mai, Juni, August. Auch der März ist ein Nachname, der als ein "zweiter Vorname" verwendet werden könnte, z. SMITH, John March .

Ihre Verwendung der "letzten / ersten / mittleren" Terminologie ist "interessant". Es gibt mögliche Probleme, wenn Ihre Daten nicht Anglo-Namen wie diese enthalten:

Mao Zedong aka Mao Ze Dong aka Mao Tse Tung
Sima Qian aka Ssu-ma Ch'ien
Saddam Hussein Abd al-Majid al-Tikriti
Noda Yoshihiko
Kossuth Lajos
José Luis Rodríguez Zapatero
Pedro Manuel Mamede Passos Coelho
Sukarno

    
John Machin 26.01.2012 01:02
quelle
0

Ein paar Hinweise, um loszulegen:

Wenn Sie selbst ein maschinelles Lernmodell trainieren, ist das nicht so einfach, insbesondere in Bezug auf Trainingsdaten (Arbeitsaufwand) ...

    
Renaud 07.02.2012 15:06
quelle