El pipeline de NLP y la tokenización
Un modelo no ve palabras: ve números. Todo sistema de NLP es una cadena de decisiones que transforma texto crudo en tensores. La calidad de esa cadena determina el techo del modelo mucho más de lo que suele admitirse.
Al terminar sabrás
El pipeline completo
Tokenización: la decisión fundamental
| Unidad | Ventaja | Problema |
|---|---|---|
| Palabra | Interpretable y compacta | Vocabulario enorme, palabras fuera de vocabulario (OOV) |
| Carácter | Vocabulario pequeño, sin OOV | Secuencias largas y costo alto |
| Subpalabra (BPE, WordPiece) | Equilibrio: cubre morfología y limita vocabulario | Tokens menos legibles para humanos |
La tokenización por subpalabras resuelve el problema de las palabras raras: «aprendizaje» puede dividirse en aprend + izaje. Así el modelo comparte estadística entre variantes morfológicas y puede representar palabras que nunca vio, porque están compuestas por piezas conocidas.
Por qué el vocabulario explota
Un corpus técnico en español puede contener 500 000 formas distintas si se incluyen flexiones, errores y nombres propios. Un vocabulario de palabras de ese tamaño hace que la matriz de embeddings sea enorme y que la mayoría de términos aparezca una sola vez. Con 32 000 subpalabras, cualquier texto se representa con piezas reutilizadas.
Consecuencia práctica: reutilizar el tokenizador de un modelo preentrenado no es un detalle: el modelo aprendió embeddings para esos IDs concretos. Cambiar el tokenizador invalida los pesos.
Código: tokenizar de tres formas
import re
from collections import Counter
texto = "El aprendizaje automático no es magia; es estadística bien aplicada."
# 1) Tokenización por palabras con regex (mejor que split)
palabras = re.findall(r"\b\w+\b", texto.lower())
print(palabras)
# 2) Por caracteres
print(list(texto[:30]))
# 3) Subpalabras con un tokenizador real (requiere transformers)
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("dccuchile/bert-base-spanish-wwm-cased")
ids = tok(texto)["input_ids"]
print(ids)
print(tok.convert_ids_to_tokens(ids))
# Ver el vocabulario: cuántas piezas empiezan con "##" (continuación)
vocab = tok.get_vocab()
print("tamaño del vocabulario:", len(vocab))
print("piezas de continuación:", sum(1 for k in vocab if k.startswith("##")))Limpieza: qué quitar y qué conservar
- HTML y entidades: eliminar etiquetas, conservar el texto.
- URLs y correos: sustituir por un token especial o eliminarlos según la tarea.
- Emojis: pueden ser señal fuerte de sentimiento; no los borres por defecto.
- Stopwords: rara vez conviene eliminarlas en modelos modernos; sí puede ayudar en TF-IDF.
- Duplicados: pueden inflar la evaluación si aparecen en train y test.
Ejercicio 8.1 · Diseñar el pipeline
Vas a clasificar reseñas de productos en positivas y negativas. Define el pipeline: qué limpiarías, qué tokenizador usarías, qué harías con emojis, negaciones y errores ortográficos. Justifica cada decisión con un experimento que podrías ejecutar.
Orientación: conservar emojis y negaciones (aportan sentimiento), corregir errores solo si tienes una herramienta fiable, usar un tokenizador preentrenado en español y comparar contra una versión con limpieza agresiva. La decisión debe basarse en F1 de validación, no en intuición.