2015-11-19 11 views
5

W języku NLTK, w jaki sposób przechodzę analizowane zdanie, aby zwrócić listę łańcuchów zdań rzeczownikowych?NLTK: Jak przejść przez frazę rzeczownika, aby zwrócić listę ciągów znaków?

Mam dwa cele:
(1) Utwórz listę fraz rzeczowników zamiast drukować je za pomocą metody "traverse()". Obecnie używam StringIO do zapisywania danych wyjściowych istniejącej metody traverse(). To nie jest akceptowalne rozwiązanie.
(2) Odinstaluj łańcuch frazy rzeczownikowej, aby: "(NP Michael/NNP Jackson/NNP)" staje się "Michael Jackson". Czy istnieje metoda w NLTK do de-parsowania?

Dokumentacja NLTK zaleca użycie funkcji traverse() w celu wyświetlenia frazy rzeczownikowej, ale w jaki sposób przechwycić "t" w tej metodzie rekursywnej, aby wygenerować listę wyrażenia rzeczownika string?

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) 

to obecnie drukuje:
(NP Michael/NNP Jackson/NNP)
(NP McDonalds/NNP)
i sklepach 'brak' do NP

+0

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

Odpowiedz

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

Dziękuję, twój kod bardzo pomógł. Czy możesz mi powiedzieć, dlaczego zdecydowałeś się użyć "yield" zamiast "return" w czwartej linii? – MyopicVisage

+0

zobacz http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python – alvas

+2

Nice! Dzięki. Zmieniłem subtree.node na subtree.label() i wydrukowałem npstr, aby wydrukować (npstr) i działało w python 3. – Sol

Powiązane problemy