UD03 · Taller 1 — Del texto al vector: análisis de sentimiento¶
Objetivo: construir un clasificador que determine si una reseña es positiva o negativa, usando un dataset anotado por ti y scikit-learn.
Rellena las celdas marcadas con # TU CÓDIGO y responde en las de texto marcadas con ✏️ Respuesta. No necesitas GPU: todo va en el contenedor de la unidad.
Fase 1 — Crea tu dataset (origen y licencia)¶
Escribe al menos 20 reseñas breves (de un restaurante, una película, un producto…), la mitad positivas y la mitad negativas.
reseñas = [
# TU CÓDIGO: al menos 20 frases, mitad positivas (1) y mitad negativas (0)
]
etiquetas = [
# TU CÓDIGO: la etiqueta de cada reseña, en el mismo orden
]
print(f"{len(reseñas)} reseñas · {sum(etiquetas)} positivas · {len(etiquetas)-sum(etiquetas)} negativas")
✏️ Respuesta: ¿de dónde has sacado las reseñas? ¿Podrías redistribuirlas? Indica origen y licencia — es el paso 2 de la metodología del §12.1, y aquí se hace primero porque sin datos no hay nada que preprocesar.
(escribe aquí)
Fase 2 — Preprocesado con nltk¶
Tokeniza cada reseña, pásala a minúsculas y quita las stopwords en español.
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
nltk.download(['punkt_tab', 'stopwords'], quiet=True)
vacias = set(stopwords.words('spanish'))
def preprocesar(texto):
# TU CÓDIGO: tokeniza, pasa a minusculas y quita las stopwords
...
reseñas_proc = [preprocesar(r) for r in reseñas]
print(reseñas_proc[0])
Fase 3 — Vectorizar y entrenar¶
Usa tf-idf y una regresión logística.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# TU CÓDIGO: vectoriza (recuerda: stop_words solo acepta 'english', para español pasa la lista)
# y entrena un LogisticRegression
X_train, X_test, y_train, y_test = ...
modelo = ...
print("Exactitud:", modelo.score(X_test, y_test))
Fase 4 — Matriz de confusión¶
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib
matplotlib.use('Agg') # en Colab o Jupyter con pantalla, quita esta linea
# TU CÓDIGO
pred = ...
ConfusionMatrixDisplay(confusion_matrix(y_test, pred)).plot()
✏️ Respuesta: ¿qué confunde más el modelo, falsos positivos o falsos negativos? ¿Tiene sentido con el tamaño de tu dataset?
(escribe aquí)
Fase 5 — Prueba con reseñas nuevas¶
Escribe tres reseñas que no estén en tu conjunto y clasifícalas.
nuevas = [
# TU CÓDIGO: tres reseñas nuevas, tuyas
]
# TU CÓDIGO: vectorizalas con el MISMO vectorizador (no entrenes uno nuevo) y predice
...
Fase 6 — Análisis de errores¶
Elige dos reseñas que el modelo clasifique mal (de la Fase 4 o inventa alguna a propósito) y analízalas.
✏️ Respuesta: para cada error, ¿qué tipo de ambigüedad lo explica —léxica, pragmática, ironía—? Es el paso 5 de la metodología: mirar los errores, no solo la exactitud.
(escribe aquí)