2015-11-19 5 views
5

Wie durchlaufe ich in NLTK einen analysierten Satz, um eine Liste von Nominalphrasenfolgen zurückzugeben?NLTK: Wie durchlaufe ich eine Nominalphrase, um eine Liste von Strings zurückzugeben?

Ich habe zwei Ziele:
(1) Erstellen Sie die Liste der Substantivsätze, anstatt sie mit der 'traverse()' Methode zu drucken. Ich verwende derzeit StringIO, um die Ausgabe der vorhandenen Methode traverse() aufzuzeichnen. Das ist keine akzeptable Lösung.
(2) Zerlege die Substantiv-Zeichenfolge so: '(NP Michael/NNP Jackson/NNP) wird' Michael Jackson '. Gibt es eine Methode in NLTK zu de-parsen?

Die NLTK-Dokumentation empfiehlt die Verwendung von traverse(), um die Substantiv-Phrase anzuzeigen, aber wie kann ich das 't' in dieser rekursiven Methode erfassen, damit ich eine Liste von String-Substantiv-Phrasen erzeuge?

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: {<DT|PP\$>?<JJ>*<NN>} # chunk determiner/possessive, adjectives and noun 
     {<NNP>+}    # chunk sequences of proper nouns 
     {<NN>+}     # 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) 

Das gegenwärtig druckt:
(NP Michael/NNP Jackson/NNP)
(NP McDonalds/NNP)
und speichert 'Keine' zu NP

+0

https Siehe: // github.com/lukewrites/NP_chunking_with_nltk/blob/master/NP_chunking_with_the_NLTK.ipynb – alvas

Antwort

7
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) 
+0

Vielen Dank, Ihr Code hat mir sehr geholfen. Können Sie mir sagen, warum Sie in der vierten Zeile "Rendite" statt "Rückgabe" gewählt haben? – MyopicVisage

+0

werfen Sie einen Blick auf http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python – alvas

+2

Nizza! Vielen Dank. Ich habe subtree.node in subtree.label() geändert und npstr zum Drucken ausgedruckt (npstr) und es funktionierte in Python 3. – Sol

Verwandte Themen