materias:pln:uba2018:practico2
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
materias:pln:uba2018:practico2 [2018/02/18 22:00] – francolq | materias:pln:uba2018:practico2 [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Trabajo Práctico 2 - Etiquetado de Secuencias ====== | ====== Trabajo Práctico 2 - Etiquetado de Secuencias ====== | ||
- | [[materias: | + | [[materias: |
En este trabajo práctico implementaremos varios modelos de etiquetado de | En este trabajo práctico implementaremos varios modelos de etiquetado de | ||
Línea 7: | Línea 7: | ||
* Repositorio: | * Repositorio: | ||
- | * Fecha de entrega: | + | * Fecha de entrega: |
Línea 27: | Línea 27: | ||
- | ===== Ejercicio 1: Corpus de Sentimientos | + | ===== Ejercicio 1: Corpus |
+ | Programar un script '' | ||
+ | * 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), | ||
+ | * 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. | ||
- | ===== Ejercicio 2: ===== | + | Uso del script: |
+ | $ python tagging/ | ||
+ | |||
+ | Documentación: | ||
+ | |||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== 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, | ||
+ | * 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 '' | ||
+ | |||
+ | <code python> | ||
+ | class BaselineTagger: | ||
+ | |||
+ | def __init__(self, | ||
+ | """ | ||
+ | tagged_sents -- training sentences, each one being a list of pairs. | ||
+ | default_tag -- tag for unknown words. | ||
+ | """ | ||
+ | |||
+ | def tag(self, sent): | ||
+ | """ | ||
+ | |||
+ | sent -- the sentence. | ||
+ | """ | ||
+ | |||
+ | def tag_word(self, | ||
+ | """ | ||
+ | |||
+ | w -- the word. | ||
+ | """ | ||
+ | |||
+ | def unknown(self, | ||
+ | """ | ||
+ | |||
+ | w -- the word. | ||
+ | """ | ||
+ | </ | ||
+ | |||
+ | Tests: | ||
+ | |||
+ | $ nosetests tagging/ | ||
+ | |||
+ | Ejemplo de uso de los scripts: | ||
+ | |||
+ | $ python tagging/ | ||
+ | $ python tagging/ | ||
+ | |||
+ | Documentación: | ||
+ | |||
+ | * http:// | ||
+ | |||
+ | |||
+ | ===== Ejercicio 3: Features para Etiquetado de Secuencias ===== | ||
+ | |||
+ | * Implementar en '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * También implementar los siguientes features paramétricos: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Interfaz de los features paramétricos en '' | ||
+ | |||
+ | <code python> | ||
+ | class NPrevTags(Feature): | ||
+ | |||
+ | def __init__(self, | ||
+ | """ | ||
+ | |||
+ | n -- number of previous tags to consider. | ||
+ | """ | ||
+ | |||
+ | def _evaluate(self, | ||
+ | """ | ||
+ | |||
+ | h -- a history. | ||
+ | """ | ||
+ | |||
+ | |||
+ | class PrevWord(Feature): | ||
+ | |||
+ | def __init__(self, | ||
+ | """ | ||
+ | |||
+ | f -- the feature. | ||
+ | """ | ||
+ | |||
+ | def _evaluate(self, | ||
+ | """ | ||
+ | |||
+ | h -- the history. | ||
+ | """ | ||
+ | </ | ||
+ | |||
+ | Tests: | ||
+ | |||
+ | $ nosetests tagging/ | ||
+ | |||
+ | Documentación: | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | ===== Ejercicio 4: Maximum Entropy Markov Models ===== | ||
+ | |||
+ | * Implementar un MEMM con el siguiente // | ||
+ | * Vectorizador ('' | ||
+ | * Clasificador de máxima entropía ('' | ||
+ | * Implementar el algoritmo de tagging secuencial en el método '' | ||
+ | * Entrenar y evaluar para varios valores de '' | ||
+ | * Probar también los siguientes clasificadores: | ||
+ | * '' | ||
+ | * '' | ||
+ | * Reportar los resultados en el README. Reportar también tiempo de evaluación. | ||
+ | * **Bonus**: Inventar y agregar features que mejoren la calidad del tagger. | ||
+ | |||
+ | Interfaz de '' | ||
+ | |||
+ | <code python> | ||
+ | class MEMM: | ||
+ | |||
+ | def __init__(self, | ||
+ | """ | ||
+ | n -- order of the model. | ||
+ | tagged_sents -- list of sentences, each one being a list of pairs. | ||
+ | clf -- classifying model, one of ' | ||
+ | """ | ||
+ | |||
+ | def sents_histories(self, | ||
+ | """ | ||
+ | Iterator over the histories of a corpus. | ||
+ | |||
+ | tagged_sents -- the corpus (a list of sentences) | ||
+ | """ | ||
+ | |||
+ | def sent_histories(self, | ||
+ | """ | ||
+ | Iterator over the histories of a tagged sentence. | ||
+ | |||
+ | tagged_sent -- the tagged sentence (a list of pairs (word, tag)). | ||
+ | """ | ||
+ | |||
+ | def sents_tags(self, | ||
+ | """ | ||
+ | Iterator over the tags of a corpus. | ||
+ | |||
+ | tagged_sents -- the corpus (a list of sentences) | ||
+ | """ | ||
+ | |||
+ | def sent_tags(self, | ||
+ | """ | ||
+ | Iterator over the tags of a tagged sentence. | ||
+ | |||
+ | tagged_sent -- the tagged sentence (a list of pairs (word, tag)). | ||
+ | """ | ||
+ | |||
+ | def tag(self, sent): | ||
+ | """ | ||
+ | |||
+ | sent -- the sentence. | ||
+ | """ | ||
+ | |||
+ | def tag_history(self, | ||
+ | """ | ||
+ | |||
+ | h -- the history. | ||
+ | """ | ||
+ | |||
+ | def unknown(self, | ||
+ | """ | ||
+ | |||
+ | w -- the word. | ||
+ | """ | ||
+ | </ | ||
+ | |||
+ | Tests: | ||
+ | |||
+ | $ nosetests tagging/ | ||
+ | |||
+ | Documentación: | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | /* | ||
+ | ===== Ejercicio 5 (punto bonus): Análisis de Error y Nuevos Features | ||
+ | */ | ||
+ | |||
+ | |||
+ | ===== Ejercicio 5 (punto bonus): Algoritmo de Viterbi para MEMMs (con Beam) ===== | ||
+ | |||
+ | Implementar el algoritmo de Viterbi para obtener la secuencia de tags de máxima probabilidad de acuerdo a un MEMM: | ||
+ | |||
+ | * Para obtener las probabilidades de los tags, usar el método '' | ||
+ | * Beam: En cada paso del Viterbi, guardar sólo los '' | ||
+ | * Evaluar para varios clasificadores ('' | ||
+ | |||
+ | |||
+ | Documentación: | ||
+ | |||
+ | * [[http:// | ||
+ | * Beam inference: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
materias/pln/uba2018/practico2.1518991209.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)