ne_chunk sin pos_tag en NLTK

Estoy tratando de fragmentar una oración usando ne_chunk y pos_tag en nltk.

from nltk import tag from nltk.tag import pos_tag from nltk.tree import Tree from nltk.chunk import ne_chunk sentence = "Michael and John is reading a booklet in a library of Jakarta" tagged_sent = pos_tag(sentence.split()) print_chunk = [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)] print print_chunk 

Y este es el resultado:

 [Tree('GPE', [('Michael', 'NNP')]), Tree('PERSON', [('John', 'NNP')]), Tree('GPE', [('Jakarta', 'NNP')])] 

mi pregunta, ¿es posible no incluir pos_tag (como NNP arriba) y solo incluir Árbol ‘GPE’, ‘PERSONA’? y que significa ‘GPE’?

Gracias por adelantado

    La entidad nombrada Chunker le dará un árbol que contiene tanto trozos como tags. No puedes cambiar eso, pero puedes quitar las tags. A partir de su tagged_sent :

     chunks = nltk.ne_chunk(tagged_sent) simple = [] for elt in chunks: if isinstance(elt, Tree): simple.append(Tree(elt.label(), [ word for word, tag in elt ])) else: simple.append( elt[0] ) 

    Si solo desea los fragmentos, omita la cláusula else: en lo anterior. Puede adaptar el código para envolver los trozos de la forma que desee. Usé un Tree nltk para mantener los cambios al mínimo. Tenga en cuenta que algunos fragmentos constan de varias palabras (intente agregar “Nueva York” a su ejemplo), por lo que el contenido del fragmento debe ser una lista, no un solo elemento.

    PD. “GPE” significa “entidad geopolítica” (obviamente un error de chunker). Puede ver una lista de las “tags de uso común” en el libro nltk, aquí .

    Lo más probable es que necesite una pequeña modificación del código en https://stackoverflow.com/a/31838373/610569 con las tags.

    ¿es posible no incluir pos_tag (como NNP arriba) y solo incluir Árbol ‘GPE’, ‘PERSONA’?

    Sí, simplemente atravesar el objeto Árbol =) ¿ Ver cómo recorrer un objeto del árbol NLTK?

     >>> from nltk import Tree, pos_tag, ne_chunk >>> sentence = "Michael and John is reading a booklet in a library of Jakarta" >>> tagged_sent = ne_chunk(pos_tag(sentence.split())) >>> tagged_sent Tree('S', [Tree('GPE', [('Michael', 'NNP')]), ('and', 'CC'), Tree('PERSON', [('John', 'NNP')]), ('is', 'VBZ'), ('reading', 'VBG'), ('a', 'DT'), ('booklet', 'NN'), ('in', 'IN'), ('a', 'DT'), ('library', 'NN'), ('of', 'IN'), Tree('GPE', [('Jakarta', 'NNP')])]) >>> from nltk.sem.relextract import NE_CLASSES >>> ace_tags = NE_CLASSES['ace'] >>> for node in tagged_sent: ... if type(node) == Tree and node.label() in ace_tags: ... words, tags = zip(*node.leaves()) ... print node.label() + '\t' + ' '.join(words) ... GPE Michael PERSON John GPE Jakarta 

    ¿Qué significa ‘GPE’?

    GPE significa “Entidad geopolítica”