{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "-4azOYi8KSoC" }, "source": [ "# Laboratorio de Introducción al Procesamiento de Lenguaje Natural\n", "\n", "# Tarea 2\n", "\n", "El objetivo de este laboratorio es realizar diferentes experimentos para representar y clasificar textos. Para esto se trabajará con un corpus para análisis de sentimiento, creado para la competencia [TASS 2020](http://www.sepln.org/workshops/tass/) (IberLEF - SEPLN).\n", "\n", "### Entrega\n", "Deberán entregar un archivo *.ipynb* con su solución, que incluya código, comentarios y respuestas a las preguntas que se incluyen al final de este notebook. \n", "\n", "El plazo de entrega de la tarea 2 cierra el **20 de junio a las 23:59 horas**.\n", "\n", "### Plataforma sugerida\n", "Sugerimos que utilicen la plataforma [Google colab](https://colab.research.google.com/), que permite trabajar colaborativamente con un *notebook* de python. Al finalizar pueden descargar ese *notebook* en un archivo .ipynb, incluyendo las salidas ya ejecutadas, con la opción ```File -> Download -> Download .ipynb```.\n", "\n", "### Aprobación del laboratorio\n", "Para aprobar el laboratorio se exige como mínimo: \n", "* Probar dos enfoques diferentes para la representación de tweets (uno basado en BoW y otro en word embeddings)\n", "* Probar al menos dos modelos de aprendizaje automático con cada representación\n", "* Comparar los resultados con los obtenidos por el modelo de pysentimiento. \n", "El preprocesamiento, las pruebas con otras formas de representación de los tweets, los experimentos con otros modelos de aprendizaje automático, incluyendo aprendizaje profundo, entre otros posibles experimentos, no son requisito para aprobar el laboratorio, aunque aportan a la nota final.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "sAumcYFLP0f8" }, "source": [ "## Parte 1 - Carga y preprocesamiento del corpus\n", "\n", "Para trabajar en este notebook deben cargar los tres archivos disponbiles en eva: train.csv, devel.csv y test.csv.\n", "\n", "La aplicación de una etapa de preprocesamiento similar a la implementada en la tarea 1 es opcional. Es interesante hacer experimentos con y sin la etapa de preprocesamiento, de modo de comparar resultados (sobre el corpus de desarrollo, devel.csv) y definir si se incluye o no en la solución final.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "nnBJGtH5QLcA" }, "outputs": [], "source": [ "# Carga de los datasets\n", "\n" ] }, { "cell_type": "code", "source": [ "# Preprocesamiento de los tweets\n", "\n" ], "metadata": { "id": "T2kOeMA_ly_b" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "YZMlbsw2uFLm" }, "source": [ "## Parte 2 - Representación de los tweets\n", "\n", "Para representar los tweets se pide que experimenten con modelos basados en Bag of Words (BoW) y con Word Embeddings.\n", "\n", "Para los dos enfoques podrán elegir entre diferentes opciones:\n", "\n", "**Bag of Words**\n", "\n", "* BOW estándar: se recomienda trabajar con la clase [CountVectorizer](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html) de sklearn, en particular, fit_transform y transform.\n", "* BOW filtrando stop-words: tienen disponible en eva una lista de stop-words para el español, adaptada para análisis de sentimiento (no se filtran palabras relevantes para determinar la polaridad, como \"no\", \"pero\", etc.).\n", "* BoW usando lemas: pueden usar herramientas de spacy.\n", "* BOW seleccionando las features más relevantes: se recomienda usar la clase [SelectKBest](https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html?highlight=select%20k%20best#sklearn.feature_selection.SelectKBest) y probar con diferentes valores de k (por ejemplo, 10, 50, 200, 1000).\n", "* BOW combinado con TF-IDF: se recomienda usar la clase [TfidfVectorizer](https://https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)\n", "\n", "**Word Embeddings**\n", "\n", "* A partir de los word embeddings, representar cada tweet como el vector promedio (mean vector) de los vectores de las palabras que lo componen.\n", "* A partir de los word embeddings, representar cada tweet como la concatenación de los vectores de las palabras que lo componen (llevando el vector total a un largo fijo).\n", "\n", "Se recomienda trabajar con alguna de las colecciones de word embeddings disponibles en https://github.com/dccuchile/spanish-word-embeddings. El repositorio incluye links a ejemplos y tutoriales.\n", "\n", "\n", "Se pide que prueben al menos una opción basada en BoW y una basada en word embeddings." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "G9BNltLduHqB" }, "outputs": [], "source": [ "# Representación de los tweets usando BoW\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ZFyYXHmUWHr2" }, "outputs": [], "source": [ " # Representación de los tweets usando word embeddings\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "pxAcPhqgWHr2" }, "source": [ "## Parte 3 - Clasificación de los tweets\n", "\n", "Para la clasificación de los tweets es posible trabajar con dos enfoques diferentes:\n", "\n", "* Aprendizaje Automático basado en atributos: se pide probar al menos dos modelos diferentes, por ejemplo, Multi Layer Perceptron ([MLP](https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier)) y Support Vector Machines ([SVM](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC)), y usar al menos dos formas de representación de tweets (una basada en BoW y otra basada en word embeddings). Se publicó en eva un léxico de palabras positivas y negativas que puede ser utilizado para generar atributos.\n", "\n", "* Aprendizaje Profundo: se recomienda experimentar con alguna red recurrente como LSTM. En este caso deben representar los tweets an base a word embeddings.\n", "\n", "Deberán usar el corpus de desarrollo (devel.csv) para comparar resultados de diferentes experimentos, variando los valores de los hiperparámetros, la forma de representación de los tweets, el preprocesamiento, los modelos de AA, etc. \n", "\n", "Tanto para la evaluación sobre desarrollo como para la evaluación final sobre test se usará la medida [Macro-F1](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html) (promedio de la medida F1 de cada clase)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "W9FFTkuWWHr3" }, "outputs": [], "source": [ "# Experimentos con Aprendizaje Atuomático y BoW\n", "\n" ] }, { "cell_type": "code", "source": [ "# Experimentos con Aprendizaje Atuomático y word embeddings\n", "\n" ], "metadata": { "id": "o-pZ4VjXpWr_" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# Experimentos con Aprendizaje Profundo\n", "\n" ], "metadata": { "id": "FUKG7sqppaYl" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "e6VGFrEoWHr3" }, "source": [ "## Parte 4: Evaluación sobre test\n", "\n", "Deben probar los mejores modelos obtenidos en la parte anterior sobre el corpus de test.\n", "\n", "También deben comparar sus resultados con un modelo pre-entrenado para análisis de sentimientos de la biblioteca [pysentimiento](https://github.com/pysentimiento/pysentimiento) (deben aplicarlo sobre el corpus de test).\n", "\n" ] }, { "cell_type": "code", "source": [ "# Evaluación sobre test\n", "\n" ], "metadata": { "id": "8OzTMYHtsq5S" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Preguntas finales\n", "\n", "Responda las siguientes preguntas:\n", "\n", "1) ¿Qué modelos probaron para la representación de los tweets?\n", "\n", "2) ¿Aplicaron algún tipo de preprocesamiento de los textos?\n", "\n", "3) ¿Qué modelos de aprendizaje automático probaron?\n", "\n", "4) ¿Qué atributos utilizaron para estos modelos?\n", "\n", "5) ¿Probaron algún enfoque de aprendizaje profundo?\n", "\n", "6) ¿Probaron diferentes configuraciones de hiperparámetros?\n", "\n", "7) ¿Qué enfoque (preprocesamiento + representación de tweets + modelo + atributos/parámetros) obtuvo la mejor Macro-F1?\n", "\n", "8) ¿Qué clase es la mejor clasificada por este enfoque? ¿Cuál es la peor? ¿Por qué piensan que sucede esto?\n", "\n", "9) ¿Cómo son sus resultados en comparación con los de pysentimiento? ¿Por qué piensan que sucede esto?\n", "\n", "\n" ], "metadata": { "id": "rn-TGtvvst3T" } } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 0 }