====== Trabajo Práctico 3 - Análisis Sintáctico ====== [[materias:pln:2017|(volver a la página principal)]] En este trabajo práctico implementaremos varios modelos de análisis sintáctico y realizaremos algunos experimentos con ellos. * Repositorio: https://github.com/PLN-FaMAF/PLN-2017/tree/master/parsing. * Fecha de entrega: 8/06 a las 23:59. ===== Instrucciones ===== El código base para el proyecto se encuentra en el [[https://github.com/PLN-FaMAF/PLN-2017/tree/master/parsing|repositorio del a materia]]. La entrega del proyecto es a través de github. Por lo tanto, deben **hacer un "fork" del repositorio** dentro de sus cuentas de github. Además del código fuente, **deben elaborar un README** con una breve explicación de lo que hicieron en cada ejercicio. El README puede estar en texto plano (txt), markdown (md) o restrucured text (rst), y debe estar incluído dentro de la carpeta ''tagging''. Criterios de Evaluación: * Estilo de codificación (chequeado con flake8 y a ojo). * Diseño del código: uso de clases, herencia, etc. * Uso y aprobación de tests (provistos y definidos por uds.). * Uso apropiado de git (commits granulares, logs informativos). * Resultados. * README. ===== Ejercicio 1: Evaluación de Parsers ===== Programar un script ''eval.py'' que permita evaluar los parsers. * Calcular: * Labeled precision, recall y F1. * Unlabeled precision, recall y F1. * Dar las siguientes opciones: * ''-m '': evaluar sólo oraciones de largo menor o igual a ''m''. * ''-n '': evaluar sólo las primeras ''n'' oraciones. * Entrenar y evaluar los modelos "baseline" para todas las oraciones de largo menor o igual a 20. Interfaz de ''eval.py'': $ python parsing/scripts/eval.py --help Evaulate a parser. Usage: eval.py -i [-m ] [-n ] eval.py -h | --help Options: -i Parsing model file. -m Parse only sentences of length <= . -n Parse only sentences (useful for profiling). -h --help Show this screen. ===== Ejercicio 2: Algoritmo CKY ===== * Implementar el algoritmo CKY en un módulo ''cky_parser.py''. * Agregar a los tests un test con una gramática y una oración tal que la oración tenga más de un análisis posible (sintácticamente ambigua). Interfaz del parser: class CKYParser: def __init__(self, grammar): """ grammar -- a binarised NLTK PCFG. """ def parse(self, sent): """Parse a sequence of terminals. sent -- the sequence of terminals. """ Tests: $ nosetests parsing/tests/test_cky_parser.py Documentación: * http://www.nltk.org/_modules/nltk/tree.html ===== Ejercicio 3: PCFGs No Lexicalizadas ===== * Implementar una UPCFG, una PCFG cuyas reglas y probabilidades se obtienen a partir de un corpus de entrenamiento. * Deslexicalizar completamente la PCFG: en las reglas, reemplazar todas las entradas léxicas por su POS tag. Luego, el parser también debe ignorar las entradas léxicas y usar la oración de POS tags para parsear. * Entrenar y evaluar la UPCFG para todas las oraciones de largo menor o igual a 20. Reportar resultados y tiempos de evaluación en el README. Interfaz de ''UPCFG'' en ''upcfg.py'': class UPCFG: """Unlexicalized PCFG. """ def __init__(self, parsed_sents, start='sentence'): """ parsed_sents -- list of training trees. """ def productions(self): """Returns the list of UPCFG probabilistic productions. """ def parse(self, tagged_sent): """Parse a tagged sentence. tagged_sent -- the tagged sentence (a list of pairs (word, tag)). """ Tests: $ nosetests parsing/tests/test_upcfg.py Documentación: * http://www.nltk.org/_modules/nltk/grammar.html ===== Ejercicio 4: Markovización Horizontal ===== * Modificar la UPCFG para admitir el uso de Markovización Horizontal de orden ''n'' para un ''n'' dado (con el parámetro opcional ''horzMarkov''). * Agregar al script de entrenamiento (''train.py'') una opción de línea de comandos que habilite esta funcionalidad. * Entrenar y evaluar para varios valores de ''n'' (0, 1, 2 y 3), para las oraciones de largo menor o igual a 20. Reportar resultados y tiempos de evaluación en el README. Documentación: * [[https://www.youtube.com/watch?v=a9qw0IFjojA&index=70&list=PL6397E4B26D00A269&t=452s|The Return of Unlexicalized PCFGs]], minuto 4:40. ===== Ejercicio 5 (punto bonus): CKY con Producciones Unarias ===== * Agregar el algoritmo CKY soporte para producciones unarias. * Modificar la UPCFG para admitir el uso de producciones unarias (con el parámetro ''unary=True''). * Agregar al script de entrenamiento (''train.py'') una opción de línea de comandos que habilite esta funcionalidad. Documentación: * [[https://www.youtube.com/watch?v=hq80J8kBg-Y&index=64&list=PL6397E4B26D00A269|CKY Parsing]], minuto 13:25.