24

Ich versuche NLTK Toolkit zu verwenden, um Ort, Datum und Uhrzeit von Textnachrichten zu extrahieren. Ich habe gerade das Toolkit auf meinem Rechner und ich schrieb diesen schnellen Schnipsel um es zu testen:NLTK für Named Entity Recognition

sentence = "Let's meet tomorrow at 9 pm"; 
tokens = nltk.word_tokenize(sentence) 
pos_tags = nltk.pos_tag(tokens) 
print nltk.ne_chunk(pos_tags, binary=True) 

ich davon aus, dass es das Datum (morgen) und Zeit (9.00 Uhr) zu identifizieren. Aber überraschenderweise hat es das nicht erkannt. Ich erhalte das folgende Ergebnis, wenn ich meine obigen Code auszuführen:

(S (GPE Let/NNP) 's/POS meet/NN tomorrow/NN at/IN 9/CD pm/NN) 

Kann mir jemand helfen, zu verstehen, wenn ich etwas fehlt oder NLTK ist einfach nicht reif genug, richtig Zeit und Datum zu markieren. Vielen Dank!

Antwort

5

Die Erkennung von benannten Entitäten ist kein einfaches Problem, tun Sie nicht erwarten Sie, dass jede Bibliothek 100% genau ist. Sie sollten keine Rückschlüsse auf die Leistung von NLTK anhand eines Satzes ziehen. Hier ein weiteres Beispiel:

sentence = "I went to New York to meet John Smith"; 

ich

(S 
    I/PRP 
    went/VBD 
    to/TO 
    (NE New/NNP York/NNP) 
    to/TO 
    meet/VB 
    (NE John/NNP Smith/NNP)) 

Wie Sie sehen können, NLTK tut sehr gut hier. Jedoch konnte ich NLTK nicht erkennen, today oder tomorrow als zeitliche Ausdrücke zu erkennen. Sie können versuchen, Stanford SUTime, es ist ein Teil von Stanford CoreNLP - Ich habe es verwendet, bevor ich es ganz gut funktioniert (es ist in Java obwohl).

+0

Eigentlich NLTK bietet Bindungen für Stanfords NERTagger ('von nltk.tag.stanford Import StanfordNERTagger'). Immer noch müssen Sie die Java-Quelle herunterladen, aber es gibt eine Menge Hilfe von dort. – Pithikos

25

Der Standard-NE-Chunker in nltk ist ein maximaler Entropie-Chunker, der auf dem ACE-Corpus trainiert wurde (http://catalog.ldc.upenn.edu/LDC2005T09). Es wurde nicht trainiert, um Daten und Zeiten zu erkennen, also müssen Sie Ihren eigenen Klassifikator trainieren, wenn Sie das tun wollen.

Werfen Sie einen Blick auf http://mattshomepage.com/articles/2016/May/23/nltk_nec/, der gesamte Prozess ist sehr gut erklärt.

Außerdem gibt es ein Modul namens timex in nltk_contrib, das Ihnen bei Ihren Anforderungen helfen kann. https://code.google.com/p/nltk/source/browse/trunk/nltk_contrib/nltk_contrib/timex.py

+0

Danke !! Links sind sehr hilfreich !! –

1

Wenn Sie möchten, um die korrekte Datum oder Zeit von den Textnachrichten identifizieren können Sie NER Stanford verwenden.

Es verwendet den CRF (bedingte Random Fields) Klassifikator. CRF ist ein sequentieller Klassifikator. Es berücksichtigt also die Wortfolgen.

Wie Sie einen Satz einrahmen oder entwerfen, erhalten Sie entsprechend die klassifizierten Daten.

Wenn Ihr Eingabesatz Let's meet on wednesday at 9am. wäre, dann hätte Stanford NER wednesday als Datum und 9am als Zeit korrekt identifiziert.

NLTK unterstützt Stanford NER. Versuchen Sie es zu benutzen.