Árvore constituinte em Python (NLTK)
Encontrei este código aqui :
# 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)
Pelo que entendi, esse código define PP, NP e VP ... Minha dúvida é que as tags sintáticas já estão definidas aqui . Essas tags compostas não são definidas em NLTK? É esse o ponto? Além disso, na última linha do chunker {<V> <NP|PP>*}, ele está usando o NP: {<DT>?<JJ>*<NN>}e PP: {<P> <NP>}?
Respostas
No exemplo que você encontrou, a ideia é usar os nomes convencionais para elementos sintáticos constituintes de sentenças para criar um chunker - um analisador que divide as sentenças em um nível desejado de partes bastante granuladas. Esta abordagem simples (istica?) É usada em favor de uma análise sintática completa - que exigiria quebrar as expressões até o nível da palavra e rotular cada palavra com a função apropriada na frase.
A gramática definida no parâmetro de RegexParserdeve ser escolhida arbitrariamente dependendo da necessidade (e da estrutura dos enunciados aos quais se aplica). Essas regras podem ser recorrentes - elas correspondem às da gramática formal BNF . A sua observação é então válida - a última regra para VPrefere-se às regras previamente definidas.