NLTK: ¿Cómo atravieso una frase nominal para devolver la lista de cadenas?

En NLTK, ¿cómo atravieso una oración analizada para devolver una lista de cadenas de frases nominales?

Tengo dos objectives:
(1) Cree la lista de frases de nombre en lugar de imprimirlas usando el método ‘traverse ()’. Actualmente utilizo StringIO para grabar la salida del método traverse () existente. Esa no es una solución aceptable.
(2) De-parse la cadena de la Fórmula Noun para que: ‘(NP Michael / NNP Jackson / NNP)’ se convierta en ‘Michael Jackson’. ¿Hay un método en NLTK para des-parse?

La documentación de NLTK recomienda usar traverse () para ver la Frase del Nombre, pero ¿cómo capturo la ‘t’ en este método recursivo para generar una lista de Frases del Nombre de la cadena?

from nltk.tag import pos_tag def traverse(t): try: t.label() except AttributeError: return else: if t.label() == 'NP': print(t) # or do something else else: for child in t: traverse(child) def nounPhrase(tagged_sent): # Tag sentence for part of speech tagged_sent = pos_tag(sentence.split()) # List of tuples with [(Word, PartOfSpeech)] # Define several tag patterns grammar = r""" NP: {
?*} # chunk determiner/possessive, adjectives and noun {+} # chunk sequences of proper nouns {+} # chunk consecutive nouns """ cp = nltk.RegexpParser(grammar) # Define Parser SentenceTree = cp.parse(tagged_sent) NounPhrases = traverse(SentenceTree) # collect Noun Phrase return(NounPhrases) sentence = "Michael Jackson likes to eat at McDonalds" tagged_sent = pos_tag(sentence.split()) NP = nounPhrase(tagged_sent) print(NP)

Esto imprime actualmente:
(NP Michael / NNP Jackson / NNP)
(NP McDonalds / NNP)
y almacena ‘Ninguno’ a NP

     def extract_np(psent): for subtree in psent.subtrees(): if subtree.label() == 'NP': yield ' '.join(word for word, tag in subtree.leaves()) cp = nltk.RegexpParser(grammar) parsed_sent = cp.parse(tagged_sent) for npstr in extract_np(parsed_sent): print (npstr)