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'
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.
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()))
for sent in chunked_sentences:
for chunk in sent:
if hasattr(chunk, "label"):
print(chunk.label())
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..
maintenant sent3 [2].le nœud est obsolète.
utiliser sent3 [2].label () au lieu de