{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# NLTK, spaCy y Transformers\n",
        "\n",
        "Cuaderno de apoyo al [taller sobre herramientas y modelos de PLN](https://www.maquinashablantes.com/taller/librerias-pln). Ejecuta las celdas en orden. NLTK y spaCy son la parte breve; la sección Transformers es opcional y descarga un modelo."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. NLTK: tokenizar y aplicar un stemmer\n",
        "\n",
        "Esta celda instala NLTK en el entorno temporal de Colab."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "!pip -q install nltk"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import nltk\n",
        "from nltk.stem.snowball import SnowballStemmer\n",
        "\n",
        "nltk.download(\"punkt_tab\")\n",
        "\n",
        "texto = \"La nueva ley de vivienda no convence a los inquilinos de Madrid.\"\n",
        "tokens = nltk.word_tokenize(texto, language=\"spanish\")\n",
        "stemmer = SnowballStemmer(\"spanish\")\n",
        "\n",
        "print(tokens)\n",
        "print([stemmer.stem(token) for token in tokens])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "El *stemmer* recorta formas con reglas; no devuelve necesariamente lemas. Los recursos de NLTK se descargan aparte de la biblioteca."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. spaCy: cargar un modelo de español\n",
        "\n",
        "Se instalan la biblioteca y el paquete de modelo. La descarga puede tardar un poco."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "!pip -q install spacy\n",
        "!python -m spacy download es_core_news_sm"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import spacy\n",
        "\n",
        "nlp = spacy.load(\"es_core_news_sm\")\n",
        "doc = nlp(texto)\n",
        "\n",
        "for token in doc:\n",
        "    print(token.text, token.lemma_, token.pos_, token.dep_, sep=\"\\t\")\n",
        "\n",
        "print([(ent.text, ent.label_) for ent in doc.ents])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Revisa la salida: el paquete propone lemas, categorías, dependencias y entidades. Es una predicción del modelo, no una anotación infalible."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Transformers: una clasificación con un modelo concreto\n",
        "\n",
        "Esta parte es opcional. Instala PyTorch y Transformers; después se descargarán los archivos del modelo de sentimiento. Puede tardar más y necesita memoria."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "!pip -q install transformers torch"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from transformers import pipeline\n",
        "\n",
        "clasificador = pipeline(\n",
        "    \"sentiment-analysis\",\n",
        "    model=\"nlptown/bert-base-multilingual-uncased-sentiment\",\n",
        ")\n",
        "\n",
        "clasificador(texto)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "El modelo clasifica reseñas con estrellas y acepta español, pero se entrenó con reseñas de productos. La puntuación no es una medida validada del tono de una noticia política. Consulta la ficha del modelo antes de aplicarlo a otros textos."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Al terminar\n",
        "\n",
        "Guarda una copia del notebook en Drive si quieres conservar resultados. La máquina de Colab es temporal; los paquetes se instalarán de nuevo al iniciar otra sesión."
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
