23 · Proyecto: clasificador de sentimientos RNN (IMDB)
Construye un clasificador de sentimientos RNN end-to-end sobre un dataset sintético estilo IMDB: vocabulario, búsqueda de embedding, celda RNN, cabeza de clasificación — todo en NumPy.
Construye un clasificador de sentimientos RNN end-to-end en un pequeño dataset sintético estilo IMDB — uniendo embeddings, RNN y una cabeza de clasificación.
Sin esto:
Sin el proyecto, los conceptos de RNN permanecen abstractos — conoces las ecuaciones pero no las has ensamblado en un pipeline funcional.
Esta lección es un proyecto de síntesis: construiremos cada pieza de un pipeline real de NLP desde cero, en NumPy, comenzando desde texto crudo y terminando con etiquetas de sentimiento predichas.
El pipeline tiene cuatro etapas que reflejan cada modelo de NLP pre-transformer jamás construido:
- Tokenización + vocabulario — mapear palabras a índices enteros.
- Búsqueda de embedding — convertir índices enteros en vectores flotantes densos (la matriz de embedding es solo una tabla de búsqueda; en la práctica se aprende durante el entrenamiento, como GloVe o Word2Vec).
- Codificador RNN — procesar la secuencia de vectores de embedding con la celda RNN; el estado oculto final
h_Tes el "vector de oración." - Cabeza de clasificación — una única capa lineal + sigmoide mapea el vector de oración a una probabilidad positivo/negativo.
Usaremos un dataset sintético estilo IMDB de 40 reseñas para mantener los tiempos de cómputo rápidos dentro de Pyodide. El vocabulario es pequeño (~50 palabras), por lo que el modelo no alcanzará precisión de producción — pero cada línea de código se mapea directamente a un módulo real SentimentRNN de PyTorch mostrado al final.
Esta es la misma arquitectura que Socher et al. (2013) usaron en el Stanford Sentiment Treebank, y que Google SmartReply usó (con LSTMs) en producción hasta 2019.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Read-along de PyTorch: SentimentRNN completo con Embedding, RNN y cabeza de clasificación (~30 líneas)
La versión 'real': en qué se diferencian los clasificadores de sentimiento de NLP de producción de nuestro modelo hecho a mano
¿Por qué la capa de embedding es esencial en un clasificador de sentimientos RNN?
- El pipeline Embedding → RNN → cabeza lineal es la base de todos los modelos de NLP pre-transformer.
- Los embeddings convierten índices one-hot dispersos en vectores semánticos densos; los embeddings pre-entrenados (GloVe) son esenciales para datasets pequeños.
- El estado oculto final h_T es el 'vector de oración' en una configuración de clasificación muchos-a-uno.
Todos los modelos de NLP pre-transformer (traducción, NER, clasificación de intenciones, detección de intenciones de chatbot) siguieron exactamente esta plantilla Embedding → RNN → Salida. Los modelos encoder de Hugging Face simplemente reemplazaron la RNN con un encoder transformer — la búsqueda de embedding y la cabeza de salida permanecen casi idénticas.
Si lo quitas: Usarías una receta de fine-tuning de transformer sin entender la búsqueda de embedding que cada LLM todavía usa internamente, o el patrón de vector de oración que potencia la búsqueda semántica bi-encoder (p. ej. FAISS + Sentence-BERT).