{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "Redes Neuronales para Lenguaje Natural, 2023\n", "\n", "---\n", "# Laboratorio 1\n", "\n", "En este laboratorio construiremos detectores de humor (chistes), con el objetivo de comparar distintas técnicas de representación de los textos.\n", "\n", "El mínimo requerido para la aprobación de este laboratorio es completar las partes 1, 2 y 4. La parte 3 es opcional, y puede realizarse para obtener mayor puntaje en el laboratorio.\n", "\n", "Versión 2 del notebook: Se modifica la forma en que se carga el dataset, ahora los obtiene de eva. Hay que estar logueado a eva cuando se descargan los datos.\n", "\n", "**Entrega: miércoles 11 de octubre**\n", "\n", "**Formato: notebook de Python (.ipynb)**\n", "\n", "**No olvidar mantener todas las salidas de cada región de código en el notebook!**\n", "\n", "---\n", "\n" ], "metadata": { "id": "t9ZNGOygrFsT" } }, { "cell_type": "markdown", "source": [ "Comenzamos con algunos imports." ], "metadata": { "id": "jGKhZr0-Yx9O" } }, { "cell_type": "code", "source": [ "import torch\n", "import gensim\n", "import numpy as np\n", "import pandas as pd\n", "from sklearn.metrics import precision_recall_fscore_support, accuracy_score" ], "metadata": { "id": "sdk0m1WfYoeW" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Descargamos los datos de la competencia HAHA 2021" ], "metadata": { "id": "-wlcQnjW3PqL" } }, { "cell_type": "code", "source": [ "! wget https://eva.fing.edu.uy/mod/resource/view.php?id=196661 -O haha_2021.zip\n", "! unzip haha_2021.zip" ], "metadata": { "id": "u34lygcpDC1m" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Cargamos las tres particiones de datos de la competencia, e imprimimos algunas muestras de los datos.\n", "\n", "Este dataset está compuesto por tweets, y para cada tweet se cuenta con información de si es humor o no (si es un chiste), y otros datos acerca de qué tan gracioso es, cuál es el mecanismo por el que transmite humor, y sobre qué clases de cosas está haciendo humor." ], "metadata": { "id": "EY1akF6ON9UF" } }, { "cell_type": "code", "source": [ "train_df = pd.read_csv('./haha_2021_train.csv')\n", "dev_df = pd.read_csv('./haha_2021_dev_gold.csv')\n", "test_df = pd.read_csv('./haha_2021_test_gold.csv')\n", "train_df.sample(5)" ], "metadata": { "id": "Lgs3RHq1gARr" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "En este laboratorio utilizaremos solamente el texto como entrada (columna \"text\"), y el valor a predecir será si el tweet es un chiste o no (columna \"is_humor\"). Por lo tanto, nos quedamos solamente con esas dos columnas.\n", "\n", "Imprimimos dos textos de ejemplo y sus categorías, y luego imprimimos la cantidad de ejemplos de la clase negativa y positiva en las tres particiones. Notar que las particiones de **train** y **dev** están un poco desbalanceadas hacia la categoría negativa, mientras que la partición de **test** está completamente balanceada." ], "metadata": { "id": "kFox_v-5P9UM" } }, { "cell_type": "code", "source": [ "train_text = train_df.loc[:,'text']\n", "dev_text = dev_df.loc[:,'text']\n", "test_text = test_df.loc[:,'text']\n", "\n", "train_labels = train_df.loc[:,'is_humor']\n", "dev_labels = dev_df.loc[:,'is_humor']\n", "test_labels = test_df.loc[:,'is_humor']\n", "\n", "print(train_text[181])\n", "print(train_labels[181])\n", "\n", "print(train_text[207])\n", "print(train_labels[207])\n", "\n", "print(np.bincount(train_labels))\n", "print(np.bincount(dev_labels))\n", "print(np.bincount(test_labels))\n" ], "metadata": { "id": "pSGVn-fjNwNe" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Parte 1:\n", "Utilizando pytorch, construir un clasificador tipo Multi-Layered Perceptron (MLP) que clasifique los tweets según si son humorísticos o no.\n", "\n", "En esta parte, se debe realizar una representación tipo bag-of-words (BOW) para los tweets, la cual se utilizará como entrada de la red.\n", "\n", "Puede probar realizar diferentes alternativas dentro de la representación BOW, por ejemplo considerar o no mayúsculas y minúsculas, descartar palabras con listas de stop words, o usar N-gramas de orden mayor en vez de palabras simples.\n", "\n", "**Sugerencias:**\n", "* Utilizar la clase CountVectorizer de sklearn\n", "* Limitar el número máximo de features para no quedarse sin memoria" ], "metadata": { "id": "aUVQ4dkXQYtf" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "xNDj27T5RrTV" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Evalúe el mejor clasificador encontrado en esta parte sobre el corpus de **dev**, imprimiendo la métrica accuracy, y las métricas precision, recall y F1 para la clase humor (valor 1)." ], "metadata": { "id": "krhvVHLeUqo5" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "TgT4CAdSU5j9" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Parte 2:\n", "Utilizando pytorch, construir un clasificador tipo Multi-Layered Perceptron (MLP) que clasifique los tweets según si son humorísticos o no.\n", "\n", "En esta parte, se debe realizar una representación tipo centroide de word embeddings para los tweets, la cual se utilizará como entrada de la red.\n", "\n", "Puede probar realizar diferentes alternativas dentro de la representación con word embedddings, por ejemplo considerar o no mayúsculas y minúsculas, o descartar palabras con listas de stop words.\n", "\n", "**Sugerencias:**\n", "* Puede utilizar los vectores de SBWC que ya utilizamos en el ejercicio de embeddings\n", "* O puede bajar alguna otra colección de embeddings, pero no entrene sus propios embeddings!\n" ], "metadata": { "id": "5klZ-zH3RuSx" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "6TKrfFb8T6LX" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Evalúe el mejor clasificador encontrado en esta parte sobre el corpus de **dev**, imprimiendo la métrica accuracy, y las métricas precision, recall y F1 para la clase humor (valor 1)." ], "metadata": { "id": "cy10PcMRU8Qq" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "igl-xpy4U9pV" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Parte 3 (opcional):\n", "Elija uno de los clasificadores anteriores y realice una búsqueda automatizada de hiperparámetros del modelo. Por ejemplo, puede utilizar una búsqueda en grilla completa o una búsqueda aleatoria, eligiendo diferente cantidad de capas, número unidades por capa, funciones de activación, y valores de learning rate. Intente encontrar el mejor clasificador posible, comparándolos sobre el corpus de **dev**." ], "metadata": { "id": "pK_cPTC1T79O" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "kdL72afBVAbG" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Evalúe el mejor clasificador encontrado en esta parte sobre el corpus de **dev**, imprimiendo la métrica accuracy, y las métricas precision, recall y F1 para la clase humor (valor 1)." ], "metadata": { "id": "TSWMIx_tVDzo" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "d-pblGJkVH3_" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## Parte 4:\n", "Elija el mejor clasificador de todos los construidos en las partes anteriores, comparándolos utilizando la medida F1 sobre la clase humor, y evalúelo sobre el corpus de **test**, imprimiendo la métrica accuracy, y las métricas precision, recall y F1 para la clase humor." ], "metadata": { "id": "GOYqBdbKVJfh" } }, { "cell_type": "code", "source": [ "# su código aquí\n" ], "metadata": { "id": "GgJFRXTsVe8G" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "Ahora conteste las siguientes preguntas sobre el mejor clasificador encontrado:\n", "\n", "1. ¿Cómo es la entrada de la red (BOW, embeddings, y con qué características)?\n", "2. ¿Cuál es la forma del modelo? Indique cantidad de capas, unidades, y funciones de activación. Puede usar el método print() sobre el modelo para imprimir la forma del modelo.\n", "3. ¿De qué manera lo encontró los parámetros para su mejor clasificador?" ], "metadata": { "id": "L1D9IB7gVgmG" } }, { "cell_type": "markdown", "source": [ "*( sus respuestas aquí)*\n" ], "metadata": { "id": "peHQat3XWzX2" } } ] }