Herramientas de usuario

Herramientas del sitio


materias:pln:2019:practico2_draft

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
materias:pln:2019:practico2_draft [2019/03/08 02:44] – created francolqmaterias:pln:2019:practico2_draft [2019/04/01 19:00] (actual) francolq
Línea 1: Línea 1:
-====== Trabajo Práctico 2 - Etiquetado de Secuencias ======+====== Trabajo Práctico 2 - Análisis de Sentimiento ======
  
 [[materias:pln:2019|(volver a la página principal)]] [[materias:pln:2019|(volver a la página principal)]]
  
-En este trabajo práctico implementaremos varios modelos de etiquetado de +En este trabajo práctico implementaremos modelos de análisis de sentimiento haremos algunos experimentos con ellos.
-secuencias realizaremos algunos experimentos con ellos.+
  
   * Repositorio: https://github.com/PLN-FaMAF/PLN-2019.   * Repositorio: https://github.com/PLN-FaMAF/PLN-2019.
-  * Fecha de entrega: **TBA**.+  * Fecha de entrega: 25/04 a las 23:59.
  
  
Línea 27: Línea 26:
  
  
-===== Ejercicio 1: Corpus AnCora: Estadísticas de etiquetas POS =====+===== Ejercicio 1: Corpus de Tweets: Estadísticas Básicas =====
  
-Programar un script ''stats.py'' que muestre la siguiente información del corpus:+Los corpus InterTASS 2018 se componen de conjuntos de tweets en español, cada uno anotado con su polaridad generalLos valores posibles para la polaridad son los siguientes:
  
-  * Estadísticas básicas: +  * ''P''Polaridad positiva
-    * Cantidad de oraciones. +  * ''N''Polaridad negativa
-    * Cantidad de ocurrencias de palabras. +  * ''NEU''Polaridad neutra
-    * Cantidad de palabras (vocabulario). +  * ''NONE'': Sin polaridad.
-    * Cantidad de etiquetas (vocabulario de tags)+
-  * Etiquetas más frecuentesUna 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 palabrasUna 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 del significado de cada etiqueta en [[https://cs.famaf.unc.edu.ar/~francolq/criterios_polaridad.pdf|este documento]].
  
-  $ python tagging/scripts/stats.py+En InterTASS 2018 se proveen corpus de entrenamiento, desarrollo y evaluación para tweets de tres países: España, Costa Rica y Perú.
  
-Documentación: +Programar un script ''stats.py'' que muestre las siguientes estadísticas básicas de la sección de entrenamiento del corpus InterTASS:
- +
-  * [[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]] +
-  * [[http://nbviewer.ipython.org/url/cs.famaf.unc.edu.ar/~francolq/Etiquetado%20de%20Secuencias.ipynb|Jupyter notebook: Etiquetado de Secuencias]] +
- +
- +
-===== 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'': +
- +
-<code python> +
-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. +
-        """ +
-</code> +
- +
-Tests: +
- +
-  $ nosetests tagging/tests/test_baseline.py +
  
-Ejemplo de uso de los scripts:+  * Cantidad total de tweets. 
 +  * Cantidad de tweets por cada valor de polaridad (''P'', ''N'', ''NEG'' y ''NONE'').
  
-  $ python tagging/scripts/train.py -o baseline +Imprimir estas estadísticas para los tres corpus de InterTASS 2018.
-  $ python tagging/scripts/eval.py -i baseline+
  
 Documentación: Documentación:
  
-  * http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html+  * TASS: 
 +    * [[http://www.sepln.org/workshops/tass/2018/task-1|TASS 2018 Task 1]] 
 +      * [[http://www.sepln.org/workshops/tass/2018/task-1/private/evaluation/evaluate.php|Resultados]] 
 +    * [[https://competitions.codalab.org/competitions/21957|TASS 2019]] 
 +  * [[https://cs.famaf.unc.edu.ar/~francolq/criterios_polaridad.pdf|Etiquetado de polaridad]] 
 +  * [[https://github.com/PLN-FaMAF/PLN-2019/blob/master/notebooks/04%20An%C3%A1lisis%20de%20Sentimiento.ipynb|Jupyter notebook: Análisis de Sentimiento (ejemplo visto en clase)]] 
 +  * [[https://github.com/DiploDatos/AprendizajeSupervisado/tree/master/sentiment|Caso de Estudio: Sentiment Analysis (Diplomatura Ciencias de Datos)]]
  
  
-===== Ejercicio 3Features para Etiquetado de Secuencias =====+===== Ejercicio 2Mejoras al Clasificador Básico de Polaridad =====
  
-  * Implementar en ''features.py'' los siguientes features básicos: +Implementaren el clasificador de sentimientos, **cuatro** de las seis posibles mejoras descriptas en las siguientes subseccionesPara cada mejora, reportar:
-    ''word_lower'': la palabra actual en minúsculas. +
-    ''word_istitle'': la palabra actual empieza en mayúsculas. +
-    ''word_isupper'': la palabra actual está en mayúsculas. +
-    * ''word_isdigit'': la palabra actual es un número. +
-  * También implementar los siguientes features paramétricos: +
-    * ''NPrevTags(n)'': la tupla de los últimos ''n'' tags. +
-    * ''PrevWord(f)''Dado un feature ''f'', aplicarlo sobre la palabra anterior en lugar de la actual.+
  
-Interfaz de los features paramétricos en ''features.py'':+  * Curvas de aprendizaje para los tres clasificadores (mnb, maxent y svm). Usar el script ''curve.py''
 +  * Resultado de la evaluación sobre el corpus de development de InterTASS. Usar el script ''eval.py''.
  
-<code python> +Para **una sola de las mejoras**, usando maxent, reportar además:
-class NPrevTags(Feature):+
  
-    def __init__(self, n): +  * Features más relevantes para cada sentimiento. Usar ''print_maxent_features'' del módulo ''sentiment.analysis''. 
-        """Feature: n previous tags tuple.+  * Tweet de ejemplo, con todos los features que intervienen y sus respectivos pesos para cada clase. Usar ''pprint_feature_weights_for_item''  del módulo ''sentiment.analysis''.
  
-        n -- number of previous tags to consider. 
-        """ 
  
-    def _evaluate(self, h): +==== Mejor Tokenizer ====
-        """n previous tags tuple.+
  
-        h -- a history. +El tokenizer por defecto del ''CountVectorizer'' filtra toda la puntuación y los emojis. Sin embargo los emojis y algunas puntuaciones son indicadoras de sentimiento (e.g. "!"?"). Cambiar el tokenizer por uno que no elimine emojis y puntuación. Una opción posible es el tokenizador de NLTK.
-        """+
  
  
-class PrevWord(Feature):+==== Binarización de Conteos ====
  
-    def __init__(self, f): +Modificar la configuración del ''CountVectorizer'' para que ignore las repeticiones de palabras.
-        """Feature: the feature f applied to the previous word.+
  
-        f -- the feature. 
-        """ 
  
-    def _evaluate(self, h): +==== Normalización Básica de Tweets ====
-        """Apply the feature to the previous word in the history.+
  
-        h -- the history. +Preprocesar los textos de los tweets de la siguiente manera:
-        """ +
-</code>+
  
-Tests:+  * Eliminar menciones de usuarios. 
 +  * Eliminar URLs. 
 +  * Contraer repeticiones de 3 o más vocales.
  
-  $ nosetests tagging/tests/test_features.py  
  
-Documentación:+==== Filtrado de stopwords ====
  
-  * [[http://nbviewer.ipython.org/url/cs.famaf.unc.edu.ar/~francolq/Etiquetado%20de%20Secuencias%20Parte%203.ipynb|Jupyter notebook: Etiquetado de Secuencias Parte 3]]+Modificar el ''CountVectorizer'' para que ignore stopwords del castellano (palabras sin carga semántica como artículos, preposiciones, etc.)Una posible fuente de stopwords es NLTK.
  
  
-===== Ejercicio 4: Maximum Entropy Markov Models =====+==== Lematización o Stemming ====
  
-  * Implementar un MEMM con el siguiente //pipeline// de scikit-learn: +Modificar el tokenizador del ''CountVectorizer'' para que además haga stemming o lematización de las palabrasUna posibilidad es usar el Snowball stemmer que viene con NLTK.
-    * Vectorizador (''featureforge.vectorizer.Vectorizer'') con los features definidos en el ejercicio anterior. +
-    * Clasificador de máxima entropía (''sklearn.linear_model.LogisticRegression''). +
-  * Implementar el algoritmo de tagging secuencial en el método ''tag''+
-  * Entrenar y evaluar para varios valores de ''n'' (1, 2, 3 y 4). +
-  * Probar también los siguientes clasificadores: +
-    * ''sklearn.naive_bayes.MultinomialNB'' +
-    * ''sklearn.svm.LinearSVC'' +
-  * 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 ''MEMM'' en ''memm.py'':+  * http://scikit-learn.org/stable/modules/feature_extraction.html#customizing-the-vectorizer-classes 
 +  * http://www.nltk.org/api/nltk.stem.html#module-nltk.stem.snowball
  
-<code python> 
-class MEMM: 
  
-    def __init__(self, n, tagged_sents, clf='svm'): +==== Manejo de Negaciones ====
-        """ +
-        n -- order of the model. +
-        tagged_sents -- list of sentences, each one being a list of pairs. +
-        clf -- classifying model, one of 'svm', 'maxent', 'mnb' (default: 'svm'). +
-        """+
  
-    def sents_histories(selftagged_sents)+Modificar el tokenizador del ''CountVectorizer'' para que además maneje negaciones. 
-        """ +Al encontrar una negación ('no''tampoco', etc.), deben modificarse todas las palabras hasta el siguiente signo de puntuación, agregándoles el prefijo ''NOT_''.
-        Iterator over the histories of a corpus.+
  
-        tagged_sents -- the corpus (a list of sentences) +Ejemplo:
-        """+
  
-    def sent_histories(self, tagged_sent): +  este verano tampoco ha llegado hacer calor, sobre todo si lo comparamos con el pasado
-        """ +
-        Iterator over the histories of tagged sentence.+
  
-        tagged_sent -- the tagged sentence (a list of pairs (word, tag)). +debe ser reemplazado por:
-        """+
  
-    def sents_tags(selftagged_sents): +  este verano tampoco NOT_ha NOT_llegado NOT_hacer NOT_calor sobre todo si lo comparamos con el pasado
-        """ +
-        Iterator over the tags of a corpus.+
  
-        tagged_sents -- the corpus (a list of sentences) 
-        """ 
  
-    def sent_tags(self, tagged_sent): +===== Ejercicio 3Evaluación Final =====
-        """ +
-        Iterator over the tags of a tagged sentence.+
  
-        tagged_sent -- the tagged sentence (a list of pairs (wordtag))+  * Seleccionardel ejercicio anterior, el clasificador que haya dado mejores resultados
-        """+  * Calcular y reportar los resultados de la evaluación con el corpus de test final de InterTASS. Usar el script ''eval.py'' con la opción ''-f''.
  
-    def tag(self, sent): 
-        """Tag a sentence. 
  
-        sent -- the sentence. +===== Ejercicio 4 (punto bonus): Lexicón de Sentimientos =====
-        """+
  
-    def tag_history(self, h): +  * Obtener o elaborar un lexicón de palabras con polaridad positiva y negativa del castellano. 
-        """Tag a history.+  * Programar dos features que calculen la cantidad de ocurrencias de palabras positivas y negativas en cada tweet. 
 +  * Agregar estos nuevos features al pipeline (se puede usar FeatureUnion). 
 +  * Entrenar, evaluar y analizar los resultados.
  
-        h -- the history. 
-        """ 
  
-    def unknown(self, w): +Documentación:
-        """Check if a word is unknown for the model.+
  
-        w -- the word+  * Posibles fuentes de lexicones: 
-        """ +    * [[http://habla.dc.uba.ar/gravano/sdal.php?lang=esp|Spanish DAL: Diccionario de Afectos en Español (Agustín Gravano et al.)]] 
-</code>+    * [[http://web.eecs.umich.edu/~mihalcea/downloads.html#SPANISH_SENT_LEXICONS|Sentiment Lexicons in Spanish (Veronica Perez Rosas et al.)]] 
 +    * [[https://github.com/JoseCardonaFigueroa/sentiment-analysis-spanish/blob/master/data/subjectivity.csv]] 
 +    * [[http://www.lsi.us.es/~fermin/ML-SentiCon.zip|ML-SentiCon: A Layered, Multilingual Sentiment Lexicon (English, Spanish, Catalan, Galician, Basque)]] 
 +  * [[http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.FeatureUnion.html|FeatureUnion (scikit-learn)]]
  
-Tests: 
  
-  $ nosetests tagging/tests/test_memm.py +/
 +===== Ejercicio 4 (punto bonus): Exploración de Parámetros ("Grid Search") =====
  
-Documentación:+Para los tres tipos de clasificadores, pruebe diferentes combinaciones de parámetros y evalúe sobre el corpus de development. Reporte mejor resultado y configuración para cada clasificador.
  
-  * [[http://nbviewer.ipython.org/url/cs.famaf.unc.edu.ar/~francolq/Etiquetado%20de%20Secuencias%20Parte%202.ipynb|Jupyter notebookEtiquetado de Secuencias Parte 2]] +  * [[http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html|maxent:]] Probar distintos valores para ''penalty'' y ''C''. 
-  * [[http://nbviewer.ipython.org/url/cs.famaf.unc.edu.ar/~francolq/Etiquetado%20de%20Secuencias%20Parte%203.ipynb|Jupyter notebookEtiquetado de Secuencias Parte 3]] +  * [[http://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html|svm:]]  Probar distintos valores para ''penalty'' y ''C''. 
-  * [[http://www.cs.columbia.edu/~mcollins/fall2014-loglineartaggers.pdf|Notas de Michael Collins sobre MEMMs]]+  * 
  
- +  [[http://scikit-learn.org/stable/modules/grid_search.html|Tuning the hyper-parameters of an estimator (scikit-learn)]]
-/ +
-===== Ejercicio 5 (punto bonus): Análisis de Error y Nuevos Features  =====+
 */ */
  
  
-===== Ejercicio 5 (punto bonus): Algoritmo de Viterbi para MEMMs (con Beam)  ===== +/* 
- +===== Ejercicio 5 (punto bonus): Ensamble de Clasificadores ===== 
-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 ''predict_proba'' si el clasificador lo tiene (e.g. ''LogisticRegression'' y ''MultinomialNB''). Si no, usar la exponenciación (base 2) del método ''decision_function'' (e.g. ''LinearSVC''). +
-  * Beam: En cada paso del Viterbi, guardar sólo los ''k'' taggings más probables, a donde ''k'' es un parámetro de la clase. +
-  * Evaluar para varios clasificadores (''LogisticRegression'' y ''LinearSVC''), para varios valores de ''n'' (1, 2, 3 y 4), y para varios valores de ''k'' (1, 2 y 3). Reportar los resultados en el README. Reportar también tiempo de evaluación. +
- +
- +
-Documentación:+
  
-  * [[http://www.cs.columbia.edu/~mcollins/fall2014-loglineartaggers.pdf|Notas de Michael Collins sobre MEMMs]] (Viterbi en sección 8.5) 
-  * Beam inference: 
-    * [[https://www.youtube.com/watch?v=M1BpelGGeMk&index=47&list=PL6397E4B26D00A269|Maximum Entropy Sequence Models]] (ir al minuto 07:10) 
-    * [[https://d396qusza40orc.cloudfront.net/nlp/slides/04-02-Maximum_Entropy_Sequence_Models-v2.pdf|slides]] 
  
materias/pln/2019/practico2_draft.1552013046.txt.gz · Última modificación: 2019/03/08 02:44 por francolq