Reconocimiento de entidad nombrada para NLTK en Python. Identificando el NE

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 "", line 1, in  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 de arriba

    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’

    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.

    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())) 

    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 aquí

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

    Ahora sent3 [2] .node está desactualizado.

    usa sent3 [2] .label () en su lugar