Konstituierender Baum in Python (NLTK)
Ich habe diesen Code hier gefunden :
# Import required libraries
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk import pos_tag, word_tokenize, RegexpParser
# Example text
sample_text = "The quick brown fox jumps over the lazy dog"
# Find all parts of speech in above sentence
tagged = pos_tag(word_tokenize(sample_text))
#Extract all parts of speech from any text
chunker = RegexpParser("""
NP: {<DT>?<JJ>*<NN>} #To extract Noun Phrases
P: {<IN>} #To extract Prepositions
V: {<V.*>} #To extract Verbs
PP: {<P> <NP>} #To extract Prepostional Phrases
VP: {<V> <NP|PP>*} #To extarct Verb Phrases
""")
# Print all parts of speech in above sentence
output = chunker.parse(tagged)
print("After Extracting\n", output)
Soweit ich weiß, definiert dieser Code PP, NP und VP ... Mein Zweifel ist, dass die syntaktischen Tags hier bereits definiert sind . Sind diese zusammengesetzten Tags nicht in NLTK definiert? Ist das der Punkt? Verwendet {<V> <NP|PP>*}es in der letzten Reihe des Chunkers außerdem das oben definierte NP: {<DT>?<JJ>*<NN>}und PP: {<P> <NP>}?
Antworten
In dem Beispiel, das Sie gefunden haben, besteht die Idee darin, die herkömmlichen Namen für syntaktische Bestandteile von Sätzen zu verwenden, um einen Chunker zu erstellen - einen Parser, der Sätze auf eine gewünschte Ebene von eher grobkörnigen Stücken aufteilt . Dieser einfache (istische?) Ansatz wird zugunsten einer vollständigen syntaktischen Analyse verwendet. Dazu müssten die Äußerungen auf Wortebene heruntergebrochen und jedes Wort mit der entsprechenden Funktion im Satz gekennzeichnet werden.
Die im Parameter von definierte Grammatik RegexParserist je nach Bedarf (und Struktur der Äußerungen, auf die sie angewendet werden soll) willkürlich zu wählen. Diese Regeln können wiederkehrend sein - sie entsprechen denen der formalen BNF- Grammatik. Ihre Beobachtung ist dann gültig - die letzte Regel für VPbezieht sich auf die zuvor definierten Regeln.