{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "-4azOYi8KSoC" }, "source": [ "# Laboratorio de Introducción al Procesamiento de Lenguaje Natural\n", "\n", "## Tarea 1\n", "\n", "El objetivo de este laboratorio es probar diferentes herramientas de PLN sobre un corpus de tweets, que se utilizará en la segunda tarea para entrenar un clasificador para Análisis de Sentimiento.\n", "\n", "### Entrega\n", "Deberán entregar un archivo *.ipynb* con su solución, que incluya código, discusiones y conclusiones del trabajo. \n", "\n", "El plazo de entrega de la tarea 1 cierra el **8 de mayo 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", "### Instalación de bibliotecas\n", "Antes de empezar, ejecutamos la siguiente celda para instalar una biblioteca que vamos a necesitar." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_7FpsJWGszpa", "outputId": "d7f2e052-f966-4682-f499-58cbeb1a2db7", "scrolled": true }, "outputs": [], "source": [ "!pip install spacy" ] }, { "cell_type": "markdown", "metadata": { "id": "sAumcYFLP0f8" }, "source": [ "# Parte 1 - Carga y preprocesamiento del corpus\n", "\n", "Hay muchas formas de trabajar con conjuntos de datos (por ejemplo con [Pandas](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html)), en esta tarea vamos a utilizar la biblioteca [csv](https://docs.python.org/3/library/csv.html). El resultado será una lista de n-uplas, cada una de las cuales correponde a una fila del .csv (incluso el cabezal, la primera línea).\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 235 }, "id": "nnBJGtH5QLcA", "outputId": "83894c61-9bd0-41c3-af6e-4873de2e3cff" }, "outputs": [], "source": [ "import csv\n", "import random\n", "\n", "# Carga del archivo train.csv\n", "\n", "with open('train.csv', newline='', encoding=\"utf-8\") as corpus_csv:\n", " reader = csv.reader(corpus_csv)\n", " next(reader) # Saltea el cabezal del archivo\n", " train_set = [x for x in reader]\n", "\n", "# Elegir un tweet aleatorio e imprimirlo junto a su categoría\n", "\n", "random_tweet = random.choice(train_set)\n", "print(f\"El tweet es: {random_tweet[1]}\")\n", "print(f\"y su categoría: {random_tweet[2]}\")" ] }, { "cell_type": "markdown", "metadata": { "id": "3HFf4BwD36uZ" }, "source": [ "Una vez cargado el corpus, que por tratarse de un cnjunto de tweets tiene características particulares, deben analizar varios ejemplos para definir qué preprocesamiento consideran necesario. Algunos ejemplos de limpieza de los datos que puede ser interesante aplciar:\n", "\n", "* Eliminar url o remplazarlas por algo genérico, como el texto \"(URL)\" (*La juez envía a prisión al exdirector de Trabajo andaluz imputado por el caso de los ERE falsos http://t.co/OadFKKj2) -> La juez envía a prisión al exdirector de Trabajo andaluz imputado por el caso de los ERE falsos **(URL)** )*\n", "\n", "* Remplazar menciones a usuarios por algo genérico, como \"USUARIO\" (*@earthlymama15 ahi voy , cambiando hábitos y haciendo un nuevo estilo de vida -> **USUARIO** ahi voy , cambiando hábitos y haciendo un nuevo estilo de vida*)\n", "\n", "* Remplazar abreviaturas comunes por el término original (*A los okupas no les gusta el edificio de Concepcion Jeronima xq esta en obras. -> A los okupas no les gusta el edificio de Concepcion Jeronima **porque** esta en obras.*)\n", "\n", "* Homogeneizar algunas expresiones frencuentes en este tipo de texto, como risas (*@LaMachaCR Ve que sos de las pocas positivas en mi TL, no me decepciones jajaja. -> @LaMachaCR Ve que sos de las pocas positivas en mi TL, no me decepciones **jaja**. // @ViKo_LH mira hijo de puta me cago en tu puta madre JAJAJAJAJAJAJJAAJAJA ya podré ir en 2018, ya... -> @ViKo_LH mira hijo de puta me cago en tu puta madre **jaja** ya podré ir en 2018, ya...*) \n", "\n", "A continuación mostramos algunos ejemplos de uso de la biblioteca [re](https://docs.python.org/3/library/re.html) para trabajar con expresiones regulares (no es obligatorio usarla)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "RNBy_qybD_oY" }, "outputs": [], "source": [ "# ejemplos de sustituciones usando expresiones regulares\n", "import re\n", "\n", "oracion = 'Si mañana vengo voy a ver si consigo que #mañana sea hoy'\n", "oracion = re.sub('mañana', 'hoy', oracion)\n", "print(oracion)\n", "oracion = re.sub('#\\w+', 'HASHTAG', oracion)\n", "print(oracion)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Código de los estudiantes para resolver la parte 1\n", "# Incluir comentarios que documenten el código\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YZMlbsw2uFLm" }, "source": [ "## Parte 2 - Herramientas de análisis lingüístico\n", "\n", "Vamos a usar la biblioteca [Spacy](https://spacy.io/) (en particular, funciones para [análisis lingüístico](https://spacy.io/usage/linguistic-features)) para obtener informaicón lingüística de las palabras y oraciones de un texto.\n", "Existen diferentes modelos disponibles para trabajar con textos en [español](https://spacy.io/models/es), incluimos un ejemplo de uso del modelo es_dep_news_trf.\n", "\n", "En esta parte deben desplegar para cada palabra de un texto:\n", "\n", "* lema\n", "* POS-tag\n", "\n", "y para cada oración:\n", "\n", "* raíz\n", "* sintagmas nominales y preposicionales mayores (constituyentes de la oración)\n", "* función sintáctica de cada constituyente identificado\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "G9BNltLduHqB" }, "outputs": [], "source": [ "# Carga del modelo para español es_dep_news_trf\n", "\n", "!pip install https://huggingface.co/spacy/es_dep_news_trf/resolve/main/es_dep_news_trf-any-py3-none-any.whl\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " # Ejemplo de análisis lingüístico con spacy\n", "\n", "import spacy\n", "from spacy import displacy\n", "\n", "analisisLing = spacy.load(\"es_dep_news_trf\")\n", "\n", "ejemplo = analisisLing(\"El director del liceo fue sumariado con separación del cargo por “insubordinación”, lo que provocó que el conflicto se agudizara.\")\n", " \n", "for token in ejemplo:\n", " print(token.text, token.pos_, token.dep_, token.head)\n", " \n", "displacy.render(ejemplo, style=\"dep\", jupyter=True) \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Código de los estudiantes para resolver la parte 2\n", "# Incluir comentarios que documenten el código\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parte 3 - Análisis de tweets\n", "\n", "Analice los siguiente tweets y comente qué problemas encuentra en las salidas del procesamiento lingüístico de la parte 2, habiendo previamente preprocesado los textos en base a la parte 1.\n", "\n", "* *Un gran acierto d @jorgefdezpp el nombramiento d @Ignacos como nuevo Director Gral. de la Policía: un puesto central en democracia*\n", "\n", "* *Les personas no somos eternas Lo más importante es el legado que dejamos, la enseñanza para toda una familia y una generación^*\n", "\n", "* *@FanClubMASes: Éstas Navidades regala solidaridad:#positivegeneration (cont) http://t.co/BksU1DZv*\n", "\n", "* *@DavidSummersHG: @Edurnity Oyeee...! A Madrid si quiero ir eh? Un besazo guapa! Vamossss ya contaba contigo si o si!!! Un besote enorme!!*\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Análisis de tweets seleccionados\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Comentarios**\n", "\n", "...\n", "\n", "...\n", "\n", "...\n", "\n" ] } ], "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": 1 }