Nommé reconnaissance D'entité pour NLTK en Python. Identification de La NE

je dois classer les mots dans leurs parties de la parole. Comme un verbe, un nom, un adverbe, etc.. J'ai utilisé le

nltk.word_tokenize() #to identify word in a sentence 
nltk.pos_tag()       #to identify the parts of speech
nltk.ne_chunk()      #to identify Named entities. 

La sortie de cet arbre. Par exemple

>>> sentence = "I am Jhon from America"
>>> sent1 = nltk.word_tokenize(sentence )
>>> sent2 = nltk.pos_tag(sent1)
>>> sent3 =  nltk.ne_chunk(sent2, binary=True)
>>> sent3
Tree('S', [('I', 'PRP'), ('am', 'VBP'), Tree('NE', [('Jhon', 'NNP')]), ('from', 'IN'), Tree('NE', [('America', 'NNP')])])

en accédant à l'élément de cet arbre, je l'ai fait comme suit:

>>> sent3[0]
('I', 'PRP')
>>> sent3[0][0]
'I'
>>> sent3[0][1]
'PRP'

mais lors de l'accès à une entité nommée:

>>> sent3[2]
Tree('NE', [('Jhon', 'NNP')])
>>> sent3[2][0]
('Jhon', 'NNP')
>>> sent3[2][1]    
Traceback (most recent call last):
  File "<pyshell#121>", line 1, in <module>
    sent3[2][1]
  File "C:Python26libsite-packagesnltktree.py", line 139, in __getitem__
    return list.__getitem__(self, index)
IndexError: list index out of range

j'ai l'erreur ci-dessus.

ce que je veux c'est obtenir la sortie comme 'NE' similaire à la précédente 'PRP' donc je ne peux pas identifier quel mot est une entité nommée. Y a-t-il un moyen de faire ça avec NLTK en python?? Si oui, veuillez envoyer la commande. Ou est-il une fonction dans l'arborescence de la bibliothèque pour ce faire? J'ai besoin de la valeur du nœud 'NE'

19
demandé sur Asl506 2011-04-19 00:14:16

5 réponses

cette réponse peut être hors de la base, et dans ce cas je l'effacerai, car je n'ai pas NLTK installé ici pour l'essayer, mais je pense que vous pouvez juste faire:

   >>> sent3[2].node
   'NE'

sent3[2][0] retourne le premier enfant de l'arbre, pas le nœud lui-même

Edit: j'ai essayé cela quand je suis rentré à la maison, et cela fonctionne en effet.

13
répondu bdk 2011-04-19 13:05:20

ci-dessous est mon code:

chunks = ne_chunk(postags, binary=True)
for c in chunks:
  if hasattr(c, 'node'):
    myNE.append(' '.join(i[0] for i in c.leaves()))
3
répondu Raullen Chai 2013-02-15 05:11:49

for sent in chunked_sentences:
  for chunk in sent:
    if hasattr(chunk, "label"):
        print(chunk.label())
1
répondu sai harish 2017-08-28 19:11:09

je suis d'accord avec bdk

sent3[2].node

O / P - 'NE'

je pense qu'il n'y a pas de fonction dans nltk de le faire.La solution ci-dessus fonctionnera mais pour référence vous pouvez vérifier ici

 for i in range(len(sent3)):
     if "NE" in str(sent3[i]):
          print sent3[i].node

j'ai exécuté ceci à nltk et cela fonctionne très bien..

0
répondu Pritpal Singh 2013-10-11 09:31:12

maintenant sent3 [2].le nœud est obsolète.

utiliser sent3 [2].label () au lieu de

0
répondu sanju 2017-04-12 10:46:34