web-dev-qa-db-fra.com

NLTK pour la reconnaissance d'entités nommées

J'essaie d'utiliser la boîte à outils NLTK pour extraire le lieu, la date et l'heure des messages texte. Je viens d'installer la boîte à outils sur ma machine et j'ai écrit cet extrait rapide pour le tester:

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)

Je supposais qu'il identifierait la date (demain) et l'heure (21 h). Mais, étonnamment, il n'a pas reconnu cela. J'obtiens le résultat suivant lorsque j'exécute mon code ci-dessus:

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

Quelqu'un peut-il m'aider à comprendre si je manque quelque chose ou si NLTK n'est tout simplement pas assez mature pour marquer correctement l'heure et la date. Merci!

27
Darth.Vader

Le chunker NE par défaut dans nltk est un chunker d'entropie maximale formé sur le corpus ACE ( http://catalog.ldc.upenn.edu/LDC2005T09 ). Il n'a pas été formé pour reconnaître les dates et les heures, vous devez donc former votre propre classificateur si vous voulez le faire.

Jetez un oeil à http://mattshomepage.com/articles/2016/May/23/nltk_nec/ , l'ensemble du processus est très bien expliqué.

De plus, il existe un module appelé timex dans nltk_contrib qui pourrait vous aider avec vos besoins. https://github.com/nltk/nltk_contrib/blob/master/nltk_contrib/timex.py

29
Viktor Vojnovski

La reconnaissance d'entités nommées n'est pas un problème facile, ( ne vous attendez pas à ce qu'une bibliothèque soit précise à 100%. Vous ne devriez pas tirer de conclusions sur les performances de NLTK sur la base d'une seule phrase. Voici un autre exemple:

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

Je reçois

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

Comme vous pouvez le voir, NLTK se débrouille très bien ici. Cependant, je n'ai pas pu obtenir NLTK pour reconnaître today ou tomorrow comme expressions temporelles. Vous pouvez essayer Stanford SUTime, il fait partie de Stanford CoreNLP - Je l'ai utilisé avant de fonctionner assez bien (il est en Java cependant).

6
mbatchkarov

Si vous souhaitez identifier correctement le date ou time à partir des messages texte, vous pouvez utiliser Stanford's NER.

Il utilise le classificateur CRF (Champs aléatoires conditionnels). CRF est un classificateur séquentiel. Il prend donc en considération les séquences de mots.

Comment vous encadrez ou concevez une phrase, vous obtiendrez en conséquence les données classifiées.

Si votre phrase d'entrée aurait été Let's meet on wednesday at 9am., alors Stanford NER aurait correctement identifié wednesday comme date et 9am comme le temps.

NLTK prend en charge Stanford NER. Essayez de l'utiliser.

3
Rohan Amrute