Árbol constituyente en Python (NLTK)
He encontrado este código aquí :
# 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)
Según tengo entendido, este código define PP, NP y VP ... Mi duda es que las etiquetas sintácticas ya están definidas aquí . ¿No están definidas estas etiquetas compuestas en NLTK? ¿Ese es el punto? Además, en la última fila de la chunker {<V> <NP|PP>*}, está usando el se ha definido anteriormente NP: {<DT>?<JJ>*<NN>}y PP: {<P> <NP>}?
Respuestas
En el ejemplo que encontró, la idea es usar los nombres convencionales para los elementos constitutivos sintácticos de las oraciones para crear un fragmento , un analizador que descompone las oraciones en un nivel deseado de piezas bastante generales. Este enfoque simple (¿istico?) Se usa a favor de un análisis sintáctico completo, lo que requeriría dividir las expresiones a nivel de palabra y etiquetar cada palabra con la función adecuada en la oración.
La gramática definida en el parámetro de RegexParserdebe elegirse arbitrariamente según la necesidad (y la estructura de las expresiones a las que se aplicará). Estas reglas pueden ser recurrentes, corresponden a las de la gramática formal BNF . Su observación es entonces válida: la última regla para se VPrefiere a las reglas definidas previamente.