materias:pln:uba2018:practico3_draft
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
materias:pln:uba2018:practico3_draft [2018/02/18 22:13] – creado francolq | materias:pln:uba2018:practico3_draft [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Trabajo Práctico 3 - Análisis de Sentimientos ====== | ====== Trabajo Práctico 3 - Análisis de Sentimientos ====== | ||
- | [[materias: | + | [[materias: |
- | En este trabajo práctico | + | En este trabajo práctico |
* Repositorio: | * Repositorio: | ||
- | * Fecha de entrega: | + | * Fecha de entrega: |
Línea 26: | Línea 26: | ||
- | ===== Ejercicio 1: Corpus | + | ===== Ejercicio 1: Corpus |
- | Programar | + | El corpus InterTASS se compone de un conjunto de tweets en español, cada uno anotado con su polaridad general. Los valores posibles para la polaridad son los siguientes: |
- | * 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. | + | |
- | Uso del script: | + | Puede encontrar una descripción más detallada |
- | $ python tagging/ | + | Programar un script '' |
+ | |||
+ | * Cantidad total de tweets. | ||
+ | * Cantidad de tweets por cada valor de polaridad ('' | ||
Documentación: | Documentación: | ||
- | * [[http://clic.ub.edu/corpus/|Corpus AnCora]] | + | * [[http://www.sepln.org/ |
- | * [[https://web.archive.org/ | + | * [[https://cs.famaf.unc.edu.ar/~francolq/criterios_polaridad.pdf|Etiquetado de polaridad]] |
- | * [[https://nlp.stanford.edu/software/spanish-faq.shtml# | + | * [[http://nbviewer.ipython.org/ |
- | ===== Ejercicio 2: Baseline Tagger | + | ===== Ejercicio 2: Mejoras al Clasificador Básico de Polaridad |
- | * Programar un etiquetador baseline, que elija para cada palabra su etiqueta más frecuente observada | + | Implementar, en el clasificador de sentimientos, **cuatro** de las seis posibles mejoras descriptas en las siguientes subsecciones. Para cada mejora, reportar: |
- | * Para las palabras desconocidas, devolver la etiqueta ' | + | |
- | | + | |
- | | + | |
- | Interfaz | + | * Curvas |
+ | * Resultado de la evaluación sobre el corpus de development de InterTASS. Usar el script | ||
- | <code python> | + | Para **una sola de las mejoras**, usando maxent, reportar además: |
- | class BaselineTagger: | + | |
- | def __init__(self, | + | * Features más relevantes para cada sentimiento. Usar '' |
- | """ | + | * Tweet de ejemplo, con todos los features que intervienen y sus respectivos pesos para cada clase. Usar '' |
- | tagged_sents -- training sentences, each one being a list of pairs. | + | |
- | """ | + | |
- | def tag(self, sent): | ||
- | """ | ||
- | sent -- the sentence. | + | ==== Mejor Tokenizer ==== |
- | """ | + | |
- | def tag_word(self, w): | + | El tokenizer por defecto del '' |
- | | + | |
- | w -- the word. | ||
- | """ | ||
- | def unknown(self, | + | ==== Binarización de Conteos ==== |
- | """ | + | |
- | w -- the word. | + | Modificar la configuración del '' |
- | """ | + | |
- | </ | + | |
- | Tests: | ||
- | $ nosetests tagging/ | + | ==== Normalización Básica de Tweets ==== |
- | Ejemplo de uso de los scripts: | + | Preprocesar los textos |
- | | + | |
- | | + | |
+ | * Contraer repeticiones de 3 o más vocales. | ||
- | Documentación: | ||
- | * http:// | + | ==== Filtrado de stopwords ==== |
+ | Modificar el '' | ||
- | ===== Ejercicio 3: Features para Etiquetado de Secuencias ===== | ||
- | * Implementar en '' | + | ==== Lematización o Stemming ==== |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | * '' | + | |
- | * También implementar los siguientes features paramétricos: | + | |
- | * '' | + | |
- | * '' | + | |
- | Interfaz de los features paramétricos en '' | + | Modificar el tokenizador del '' |
- | <code python> | + | * http:// |
- | class NPrevTags(Feature): | + | * http:// |
- | def __init__(self, | ||
- | """ | ||
- | n -- number of previous tags to consider. | + | ==== Manejo de Negaciones ==== |
- | """ | + | |
- | def _evaluate(self, h): | + | Modificar el tokenizador del '' |
- | """ | + | Al encontrar una negación |
- | h -- a history. | + | Ejemplo: |
- | """ | + | |
+ | este verano tampoco ha llegado a hacer calor, sobre todo si lo comparamos con el pasado | ||
- | class PrevWord(Feature): | + | debe ser reemplazado por: |
- | def __init__(self, f): | + | este verano tampoco NOT_ha NOT_llegado NOT_hacer NOT_calor |
- | """ | + | |
- | f -- the feature. | ||
- | """ | ||
- | def _evaluate(self, | + | ===== Ejercicio 3: Evaluación Final ===== |
- | """ | + | |
- | h -- the history. | + | * Seleccionar, |
- | """ | + | * Calcular y reportar los resultados de la evaluación con el corpus de test final de InterTASS. Usar el script '' |
- | </ | + | |
- | Tests: | ||
- | $ nosetests tagging/ | + | ===== Ejercicio 4 (punto bonus): Exploración de Parámetros ("Grid Search" |
- | Documentación: | + | Para los tres tipos de clasificadores, |
- | * [[http://nbviewer.ipython.org/url/cs.famaf.unc.edu.ar/~francolq/Etiquetado%20de%20Secuencias%20con%20Feature%20Forge.ipynb|Etiquetado de Secuencias con Feature Forge]] | + | * [[http://scikit-learn.org/stable/modules/ |
+ | * [[http://scikit-learn.org/ | ||
+ | * ... | ||
+ | * [[http:// | ||
- | ===== Ejercicio 4: Maximum Entropy Markov Models ===== | ||
- | * Implementar un MEMM con el siguiente // | + | ===== Ejercicio 5 (punto bonus): Lexicón |
- | * Vectorizador | + | |
- | * Clasificador de máxima entropía ('' | + | |
- | * Implementar un algoritmo de tagging en el método '' | + | |
- | * Agregar al script de entrenamiento (train.py) una opción de línea de comandos que permita utilizar el MEMM con distintos valores de '' | + | |
- | * Entrenar y evaluar para varios valores de '' | + | |
- | * Probar también los siguientes clasificadores: | + | |
- | * '' | + | |
- | * '' | + | |
- | * Reportar los resultados en el README. Reportar también tiempo | + | |
- | * **Bonus**: Inventar y agregar features que mejoren la calidad del tagger. | + | |
- | Interfaz | + | * Obtener o elaborar un lexicón |
+ | * Programar dos features que calculen la cantidad de ocurrencias de palabras positivas y negativas | ||
+ | * Agregar estos nuevos features al pipeline (se puede usar FeatureUnion). | ||
+ | * Entrenar, evaluar y analizar los resultados. | ||
- | <code python> | ||
- | class MEMM: | ||
- | |||
- | def __init__(self, | ||
- | """ | ||
- | n -- order of the model. | ||
- | tagged_sents -- list of sentences, each one being a list of pairs. | ||
- | """ | ||
- | |||
- | 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: | Documentación: | ||
- | * Introducción a scikit-learn para clasificación | + | * Posibles fuentes |
- | * http://scikit-learn.org/stable/tutorial/ | + | * [[http://habla.dc.uba.ar/gravano/sdal.php? |
- | * [[http://nbviewer.ipython.org/ | + | * [[http://web.eecs.umich.edu/~mihalcea/downloads.html#SPANISH_SENT_LEXICONS|Sentiment Lexicons in Spanish (Veronica Perez Rosas et al.)]] |
- | | + | * [[http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.FeatureUnion.html|FeatureUnion (scikit-learn)]] |
- | | + | |
- | * [[https://d396qusza40orc.cloudfront.net/ | + | |
- | + | ||
- | + | ||
- | ===== 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 ('' | ||
+ | /* | ||
+ | ===== Ejercicio 5 (punto bonus): Ensamble de Clasificadores ===== | ||
+ | */ |
materias/pln/uba2018/practico3_draft.1518991983.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)