Reconocimiento de entidad nombrada para NLTK en Python. Identificando el NE
nlp named-entity-recognition (5)
Necesito clasificar las palabras en sus partes del habla. Como un verbo, un sustantivo, un adverbio, etc. Usé el
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.
El resultado de esto es un árbol. P.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 en este árbol, lo hice de la siguiente manera:
>>> sent3[0]
(''I'', ''PRP'')
>>> sent3[0][0]
''I''
>>> sent3[0][1]
''PRP''
Pero al acceder a una entidad nombrada:
>>> 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
Tengo el error anterior.
Lo que quiero es obtener la salida como ''NE'' similar a la ''PRP'' anterior, por lo que no puedo identificar qué palabra es una Entidad con nombre. ¿Hay alguna forma de hacer esto con NLTK en python? Si es así, por favor envíe el comando. ¿O hay una función en la biblioteca de árbol para hacer esto? Necesito el valor de nodo ''NE''
A continuación se muestra mi código:
chunks = ne_chunk(postags, binary=True)
for c in chunks:
if hasattr(c, ''node''):
myNE.append('' ''.join(i[0] for i in c.leaves()))
Ahora sent3 [2] .node está desactualizado.
usa sent3 [2] .label () en su lugar
Esta respuesta puede estar fuera de la base, y en ese caso la eliminaré, ya que no tengo NLTK instalado aquí para intentarlo, pero creo que puedes hacerlo:
>>> sent3[2].node
''NE''
sent3[2][0]
devuelve el primer elemento secundario del árbol, no el nodo en sí
Edit: intenté esto cuando llegué a casa, y de hecho funciona.
Esto funcionara
for sent in chunked_sentences:
for chunk in sent:
if hasattr(chunk, "label"):
print(chunk.label())
Estoy de acuerdo con bdk
sent3[2].node
O / P - ''NE''
Creo que no hay ninguna función en nltk para hacerlo. La solución anterior funcionará, pero como referencia puede consultar here
para problemas de bucle puede hacer: -
for i in range(len(sent3)):
if "NE" in str(sent3[i]):
print sent3[i].node
He ejecutado esto en nltk y funciona bien ..