====== Trabajo Práctico 1 - Etiquetado de Secuencias ====== [[materias:pln:uba2019|(volver a la página principal)]] En este trabajo práctico implementaremos modelos de etiquetado de secuencias y realizaremos experimentos con ellos. * Repositorio: https://github.com/PLN-FaMAF/pln-uba-2019. * Fecha de entrega: lunes 16/9 a las 23:59. ===== Instrucciones ===== El código base para el proyecto se encuentra en el [[https://github.com/PLN-FaMAF/pln-uba-2019/tree/master/tagging|repositorio de la 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: Corpus AnCora: Estadísticas de etiquetas POS ===== Programar un script ''stats.py'' que muestre la siguiente información del corpus: * Estadísticas básicas: * Cantidad de oraciones. * Cantidad de ocurrencias de palabras. * Cantidad de palabras (vocabulario). * Cantidad de etiquetas (vocabulario de tags). * Etiquetas más frecuentes: Una tabla con las 10 etiquetas más frecuentes y la siguiente información para cada una: * Cantidad de veces que aparece (frecuencia), y porcentaje del total. * Cinco palabras más frecuentes con esa etiqueta. * **En el README, agregar a mano una breve descripción del significado de la etiqueta.** * Niveles de ambigüedad de las palabras: Una figura similar a la Figura 5.10 de Jurafsky & Martin (2008). Para cada nivel de ambigüedad (de 1 a 9) mostrar: * Cantidad de palabras y porcentaje del total. * Cinco palabras más frecuentes. * Incluir todas las estadísticas en el README. Uso del script: $ python tagging/scripts/stats.py -c ancora-3.0.1es Documentación: * [[https://github.com/PLN-FaMAF/pln-uba-2019/tree/master/notebooks/tagging/01%20Etiquetado%20de%20Secuencias%20Parte%201.ipynb|Notebook: 1. Etiquetado de Secuencias: Parte 1]] * [[http://clic.ub.edu/corpus/|Corpus AnCora]] * [[https://web.archive.org/web/20160325024315/http://nlp.lsi.upc.edu/freeling/doc/tagsets/tagset-es.html|Etiquetas EAGLES]] * [[https://nlp.stanford.edu/software/spanish-faq.shtml#tagset|Stanford CoreNLP simplified tagset]] ===== Ejercicio 2: Baseline Tagger ===== * Programar un etiquetador baseline, que elija para cada palabra su etiqueta más frecuente observada en entrenamiento. * Para las palabras desconocidas, devolver la etiqueta 'nc0s000' (nombre común singular). * Entrenar y evaluar el modelo baseline del ejercicio anterior. Reportar los resultados en el README. * **Bonus**: Graficar la matriz de confusión como un mapa de calor (ver documentación abajo). Interfaz de ''BaselineTagger'' en ''baseline.py'': class BaselineTagger: def __init__(self, tagged_sents, default_tag='nc0s000'): """ tagged_sents -- training sentences, each one being a list of pairs. default_tag -- tag for unknown words. """ def tag(self, sent): """Tag a sentence. sent -- the sentence. """ def tag_word(self, w): """Tag a word. w -- the word. """ def unknown(self, w): """Check if a word is unknown for the model. w -- the word. """ Tests: $ nosetests tagging/tests/test_baseline.py Ejemplo de uso de los scripts: $ python tagging/scripts/train.py -c ancora-3.0.1es -m base -o baseline $ python tagging/scripts/eval.py -c ancora-3.0.1es -i baseline Documentación: * [[https://github.com/PLN-FaMAF/pln-uba-2019/tree/master/notebooks/tagging/02%20Etiquetado%20de%20Secuencias%20Parte%202.ipynb|Notebook: 2. Etiquetado de Secuencias: Parte 2]] * http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html ===== Ejercicio 3: Clasificador "three words" ===== * Implementar en ''classifier.py'' un tagger que utilice un clasificador para etiquetar cada palabra en base a la información disponible en una ventana alrededor de la palabra. * Definir el vectorizador con los siguientes features: * la palabra actual en minúsculas. * si la palabra actual empieza en mayúsculas. * si la palabra actual está en mayúsculas. * si la palabra actual es un número. * mismos features para la palabra anterior y para la siguiente. * Probar los siguientes clasificadores: * ''sklearn.linear_model.LogisticRegression'' * ''sklearn.naive_bayes.MultinomialNB'' * ''sklearn.svm.LinearSVC'' * Agregar al script de entrenamiento (train.py) una opción de línea de comandos que permita utilizar estos clasificadores. * Entrenar y evaluar. Reportar los resultados en el README. Reportar también tiempos de entrenamiento y evaluación. /* * Usar el siguiente //pipeline// de scikit-learn: * Vectorizador ''DictVectorizer''. * Clasificador de máxima entropía (''sklearn.linear_model.LogisticRegression''). */ Interfaz de ''ClassifierTagger'' en ''classifier.py'': class ClassifierTagger: """Simple and fast classifier based tagger. """ def __init__(self, tagged_sents, clf='lr'): """ clf -- classifying model, one of 'svm', 'lr' (default: 'lr'). """ def fit(self, tagged_sents): """ Train. tagged_sents -- list of sentences, each one being a list of pairs. """ def tag_sents(self, sents): """Tag sentences. sent -- the sentences. """ def tag(self, sent): """Tag a sentence. sent -- the sentence. """ def unknown(self, w): """Check if a word is unknown for the model. w -- the word. """ Tests: $ nosetests tagging/tests/test_classifier.py Documentación: * [[https://github.com/PLN-FaMAF/pln-uba-2019/tree/master/notebooks/tagging/03%20Etiquetado%20de%20Secuencias%20Parte%202.ipynb|Notebook: 3. Etiquetado de Secuencias: Parte 3]] ===== Ejercicio 4: Análisis de Errores y Nuevos Features ===== * En una notebook, hacer análisis de errores del clasificador anterior. * Proponer e implementar nuevos features a partir de este análisis. * Entrenar y evaluar. Verificar la utilidad de los nuevos features propuestos. * Reportar los resultados en el README. Documentación: * [[https://github.com/PLN-FaMAF/pln-uba-2019/tree/master/notebooks/tagging/02%20Etiquetado%20de%20Secuencias%20Parte%202.ipynb|Notebook: 2. Etiquetado de Secuencias: Parte 2]] ===== Ejercicio 5: Clasificador con Word Embeddings fastText ===== * Agregar word embeddings fastText a los features clasificador del ejercicio anterior. * Usar el vectorizador provisto en ''fasttext.py''. * Usar los modelos pre-entrenados para el idioma castellano ofrecidos por fastText. * Entrenar, evaluar y reportar resultados y tiempos en el README. Documentación: * [[https://fasttext.cc/|fastText]] * [[https://github.com/facebookresearch/fastText/tree/master/python#building-fasttext-for-python|Instalación]] * [[https://fasttext.cc/docs/en/crawl-vectors.html|Modelos pre-entrenados]] /* ===== Ejercicio 9: Red Neuronal Recurrente ===== **TBA** ===== Ejercicio 9: Red Neuronal ===== ===== Ejercicio 10: Red Neuronal Recurrente ===== * https://allennlp.org/tutorials * https://pytorch.org/tutorials/beginner/nlp/sequence_models_tutorial.html#example-an-lstm-for-part-of-speech-tagging https://nlpforhackers.io/lstm-pos-tagger-keras/ * Probe LSTM cells: recuerda consistencia de comillas?| */