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
Zobacz https: // github.com/lukewrites/NP_chunking_with_nltk/blob/master/NP_chunking_with_the_NLTK.ipynb – alvas