Albero costituente in Python (NLTK)
Ho trovato questo codice qui :
# 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)
Da quanto ho capito, questo codice definisce PP, NP e VP ... Il mio dubbio è che i tag sintattici siano già definiti qui . Questi tag composti non sono definiti in NLTK? È questo il punto? Inoltre, nell'ultima riga del chunker {<V> <NP|PP>*}, sta usando il sopra definito NP: {<DT>?<JJ>*<NN>}e PP: {<P> <NP>}?
Risposte
Nell'esempio che hai trovato l'idea è quella di usare i nomi convenzionali per gli elementi sintattici costituenti delle frasi per creare un chunker , un parser che scompone le frasi a un livello desiderato di pezzi piuttosto grossolani. Questo semplice approccio (istico?) Viene utilizzato a favore di un'analisi sintattica completa, che richiederebbe la suddivisione delle espressioni a livello di parola e l'etichettatura di ciascuna parola con la funzione appropriata nella frase.
La grammatica definita nel parametro di RegexParserdeve essere scelta arbitrariamente a seconda delle necessità (e della struttura delle espressioni a cui deve applicarsi). Queste regole possono essere ricorrenti: corrispondono a quelle della grammatica formale BNF . La tua osservazione è quindi valida: l'ultima regola per si VPriferisce alle regole definite in precedenza.