{ "cells": [ { "cell_type": "markdown", "id": "2d01c1fb", "metadata": {}, "source": [ "# Ciencia de Datos y Lenguaje Natural - **Notebook 3** \n", "## Redes Neuronales y Word Embeddings" ] }, { "cell_type": "markdown", "id": "ae579df6", "metadata": {}, "source": [ "En este notebook se trabajará con redes neuronales y word embeddings. El objetivo es indicar si una oración expresa un juicio positivo o negativo, al igual que en el notebook anterior, pero en este caso utilizando word embeddings y clasificadores basados redes neuronales. \n", "\n", "Al igual que en el notebook 2 se trabajará con el corpus CDLN-Senti formado por oraciones simples anotadas según su orientación semántica (positiva, 0; negativa, 1). El corpus se generó a partir de comentarios de usuarios en los sitios de Amazon, IMDB y Yelp. Se encontraba disponible en inglés y fue traducido al español por Google translate. \n", "\n", "Se resolverá el problema propuesto por 3 estrategias distintas según el tratamiento de secuencias y el tipo de la red utilizado. En el primero se debe utilizar una red completamente conectada *feed forward* y la entrada debe representarse como un vector mediante una operación de los vectores de las palabras (ej. centroide). En el segundo enfoque se debe utilizar una red recurrente para la entrada. Finalmente, en el tercer enfoque se debe utilizar una red de tipo transformer. Se deben reportar los resultados obtenidos. \n", "\n", "\n", "#### Indique nombre, número de cédula y que carrera está cursando" ] }, { "cell_type": "code", "execution_count": null, "id": "c469b9d8", "metadata": {}, "outputs": [], "source": [ "__author__ = \"Nombre Apellido\"\n", "__cedula__ = \"1.234.567-8\"\n", "__origen__ = \"Grado. Ing. Computación\"" ] }, { "cell_type": "markdown", "id": "20b39a60", "metadata": {}, "source": [ "## Lectura de datos (corpus y léxicos)\n", "\n", "Se dispone de dos léxicos para el español, uno de palabras positivas (palabras-pos.txt) y otro de palabras negativas (palabras-neg.txt). Descarguelos del eva del curso. (Los léxicos fueron extraídos de: https://www.kaggle.com/datasets/rtatman/sentiment-lexicons-for-81-languages?resource=download)\n", "\n", "Se dispone además de un corpus con los datos de las opiniones en el formato \"frase|valor\", donde \"frase\" es la frase a analizar (Ej. \"Me encantó. Volveré.\") y \"valor\" es 0 o 1. Este coprpus se encuentra fraccionado en entrenamiento (senti-train.csv), validación (senti-val.csv) y test (senti-test.csv). \n", "\n", "En el siguiente bloque de código se leen y cargan en memoria los léxicos y el corpus de análisis de sentimiento. Estos recursos serán utilizados a lo largo de todo el notebook. " ] }, { "cell_type": "code", "execution_count": null, "id": "327e0631", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import os\n", "import csv\n", "import sklearn\n", "\n", "def read_data(path):\n", " import csv\n", " rows=[]\n", " with open(path, encoding='utf-8') as doc:\n", " csvreader = csv.reader(doc, delimiter ='|', quoting=csv.QUOTE_NONE)\n", " for i,row in enumerate(csvreader):\n", " rows.append(row)\n", " if len(rows)>0 and len(rows[0])==1:\n", " rows = [r[0] for r in rows]\n", " return rows\n", "\n", "\n", "dtrain = read_data('./senti-train.csv')\n", "dval = read_data('./senti-val.csv')\n", "dtest = read_data('./senti-test.csv')\n", "lexpos = read_data('./palabras-pos.txt')\n", "lexneg = read_data('./palabras-neg.txt')" ] }, { "cell_type": "markdown", "id": "5da57cff", "metadata": {}, "source": [ "**Cantidad de elementos de corpus y léxicos**\n", "\n", "En el siguiente bloque de código se despliega la cantidad de entradas positivas y negativas en cada partición (train, val, test) del corpus; y la cantidad de elementos de los léxicos (positivo y negativo)." ] }, { "cell_type": "code", "execution_count": null, "id": "24c53497", "metadata": {}, "outputs": [], "source": [ "lenx = lambda x: (len(x), len([d for d in x if d[1]=='0']), len([d for d in x if d[1]=='1']))\n", "print('Train (tot,neg,pos):', lenx(dtrain))\n", "print('Val (tot,neg,pos):', lenx(dval))\n", "print('Test (tot,neg,pos):', lenx(dtest))\n", "print('Lex Pos:', len(lexpos))\n", "print('Lex Neg:', len(lexneg))" ] }, { "cell_type": "markdown", "id": "bb8ce59b", "metadata": {}, "source": [ "# Word Embeddings\n", "\n", "Un *word embedding* es una representación vectorial del significado de las palabras obtenida a partir del uso del lenguaje. Los métodos para obtener *word embeddings* principalmente usan dos tipos de información:\n", "- el contexto de uso de las palabras (coocurrencia de palabras)\n", "- composición de la palabra (*subword*)\n", "\n", "Una palabra puede tener varios significados (homonímia y polisemia). Al usar el lenguaje, inferimos el significados adecuado de cada palabra a partir del contexto. En cuanto refiere a los *word embeddings*, existen dos tipos:\n", "- Estáticos: se tiene un único vector que representa todos los significados de la palabra.\n", "- Dinámicos o contextualizados: se tiene un vector por cada ocurrencia de la palabra, distintos usos de las palabras son representados por vectores distintos. \n", "\n", "En esta parte experimentaremos con *word embeddings* estáticos. " ] }, { "cell_type": "markdown", "id": "820e5184", "metadata": {}, "source": [ "##### Instalar librería y cargar modelo preentrenado\n", "\n", "Escoja un modelo de *word embeddings* preentrenado que esté disponible públicamente (Ej. https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.es.300.bin.gz) y una librería para su manipulación (Ej. https://fasttext.cc/docs/en/python-module.html). Además, puede implementar rutinas auxiliares que considere necesarias.\n", "\n", "A continuación escriba los comandos necesarios para instalar la librería y descargar el modelo. En caso de implementar alguna funcionalidad también escribila a continuación. " ] }, { "cell_type": "code", "execution_count": null, "id": "9dc9cb74", "metadata": {}, "outputs": [], "source": [ "# ESCRIBA AQUI SU CODIGO\n", "\n", "#Ejemplo: \n", "#!wget https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.es.300.bin.gz\n", "#pip install fasttext" ] }, { "cell_type": "markdown", "id": "94b20699", "metadata": {}, "source": [ "##### Cargar modelo\n", "\n", "A continuación escriba el código para cargar el modelo en memoria. Utilice el nombre de variable 'wemb' para este modelo, será utilizado en las siguientes secciones. \n" ] }, { "cell_type": "code", "execution_count": null, "id": "2f0299f6", "metadata": {}, "outputs": [], "source": [ "# ESCRIBA AQUI SU CODIGO\n", "\n", "#Ejemplo:\n", "#import fasttext\n", "#wemb = fasttext.load_model(\"./cc.es.300.bin\")" ] }, { "cell_type": "markdown", "id": "a5b2deaf", "metadata": {}, "source": [ "##### Caclcular la similitud coseno entre \n", "\n", "Con un modelo de *word embeddings* es posible obtener la similitud semántica entre palabras utilizando funciones distancia o similitud entre vectores. Un tipo de similitud entre vectores habitual es la similitud coseno: \n", "\n", "