python nlp nltk named-entity-recognition

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 ..