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