¿Cómo obtengo un conjunto de reglas gtwigticales de Penn Treebank usando python y NLTK?

Soy bastante nuevo en NLTK y Python. He estado creando análisis de oraciones utilizando las gramáticas de los juguetes que figuran en los ejemplos, pero me gustaría saber si es posible usar una gramática aprendida de una parte del Penn Treebank, por ejemplo, en lugar de solo escribir la mía o usar el juguete. gramáticas? (Estoy usando Python 2.7 en Mac) Muchas gracias

Si desea una gramática que capture con precisión la muestra de Penn Treebank que viene con NLTK, puede hacer esto, asumiendo que ha descargado los datos de Treebank para NLTK (vea el comentario a continuación):

import nltk from nltk.corpus import treebank from nltk.grammar import ContextFreeGrammar, Nonterminal tbank_productions = set(production for sent in treebank.parsed_sents() for production in sent.productions()) tbank_grammar = ContextFreeGrammar(Nonterminal('S'), list(tbank_productions)) 

Esto probablemente no te dará, sin embargo, algo útil. Dado que NLTK solo admite análisis con gramáticas con todos los terminales especificados, solo podrá analizar oraciones que contengan palabras en la muestra de Treebank.

Además, debido a la estructura plana de muchas frases en Treebank, esta gramática se generalizará muy mal a las oraciones que no se incluyeron en el entrenamiento. Esta es la razón por la que las aplicaciones de PNL que han intentado analizar el banco de árboles no han utilizado un método para aprender las reglas de CFG del sistema. La técnica más cercana a eso sería el enfoque del análisis orientado a datos de Ren Bods, pero es mucho más sofisticado.

Finalmente, esto será increíblemente lento e inútil. Entonces, si desea ver este enfoque en acción en la gramática desde una sola frase para probar que funciona, pruebe el siguiente código (después de las importaciones anteriores):

 mini_grammar = ContextFreeGrammar(Nonterminal('S'), treebank.parsed_sents()[0].productions()) parser = nltk.parse.EarleyChartParser(mini_grammar) print parser.parse(treebank.sents()[0]) 

Es posible entrenar a un Chunker en el cuerpo de treebank_chunk o conll2000. No obtienes una gramática, pero sí un objeto capaz de decaparse que puede analizar fragmentos de frases. Vea Cómo entrenar a un Chunker NLTK , Extracción de trozos con NLTK , y NLTK Clasificada según la precisión de Chunker .