2011-04-18 78 views
19

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'

Respuesta

13

Esta respuesta puede estar fuera de base, y en cuyo caso la eliminaré, ya que no tengo instalado NLTK aquí para probarlo, pero creo que puede hacerlo:

>>> sent3[2].node 
    'NE' 

sent3[2][0] devuelve el primer hijo del árbol, no el propio nodo

Editar: he intentado esto cuando llegué a casa, y que en realidad funciona.

+0

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

+0

@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

+6

en la versión actual (3.1) 'node' se reemplaza por' label() ' – Vladimir

3

A continuación es 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())) 
0

Estoy de acuerdo con bdk

sent3[2].node

O/P - 'NE'

Creo que no hay ninguna función en NLTK hacer it.Above solución funcionará, pero para referencia puede marcar here

para recorrer un problema que puede hacer: -

for i in range(len(sent3)): 
    if "NE" in str(sent3[i]): 
      print sent3[i].node 

yo haga esto en NLTK y funciona bien ..

0

Ahora sent3 [2] .node es obsoleta.

sent3 uso [2] .label() en lugar

0

Esto funcionará

for sent in chunked_sentences: 
    for chunk in sent: 
    if hasattr(chunk, "label"): 
     print(chunk.label()) 
Cuestiones relacionadas