Necesito clasificar palabras en sus partes del discurso. Como un verbo, un sustantivo, un adverbio, etc .. he utilizado laReconocimiento de entidad con nombre para NLTK en Python. Identificación del NE
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 salida de este puesto es un árbol. Ej
>>> 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')])])
Al acceder al elemento de este árbol, lo hice de la siguiente manera:
>>> sent3[0]
('I', 'PRP')
>>> sent3[0][0]
'I'
>>> sent3[0][1]
'PRP'
Pero cuando se accede a una entidad designada:
>>> 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:\Python26\lib\site-packages\nltk\tree.py", line 139, in __getitem__
return list.__getitem__(self, index)
IndexError: list index out of range
que tiene el error anterior.
Lo que quiero es obtener la salida como 'NE' similar a la anterior 'PRP', así que no puedo identificar qué palabra es una Entidad Nombrada. ¿Hay alguna forma de hacer esto con NLTK en python? Si es así, publique el comando. ¿O hay una función en la biblioteca de árbol para hacer esto? Necesito el valor del nodo 'NE'
Antes de mirar el atributo de nodo, tendrá que comprobar si isinstance (sent3 [2], Árbol) (después de hacer desde nltk.tree árbol de importación). – Jacob
@Jacob Gracias amigo, realmente útil. El siguiente problema al que me enfrenté fue cómo saber si un elemento es un árbol o no. Como necesitaba iterar a través de los elementos usando un ciclo for. El ** if isinstance (sent3 [2], Tree) ** es lo que he estado buscando durante todo este tiempo. Gracias de nuevo. – Asl506
en la versión actual (3.1) 'node' se reemplaza por' label() ' – Vladimir