Fundamentos de NLP
Del texto crudo a los vectores: técnicas clásicas de procesamiento del lenguaje natural, representación de palabras con embeddings y la revolución de Word2Vec. Las bases que necesitas antes de abordar modelos de deep learning para lenguaje.
¿Qué es el NLP?
El Procesamiento del Lenguaje Natural (NLP, Natural Language Processing) es la rama de la inteligencia artificial que se ocupa de la interacción entre computadoras y el lenguaje humano. Su objetivo es permitir que las máquinas lean, interpreten, generen y respondan en lenguaje natural —es decir, el que usamos las personas a diario.
Definición: NLP combina lingüística computacional —el modelado del lenguaje humano mediante reglas— con técnicas de estadística, aprendizaje automático y, más recientemente, deep learning, para procesar y producir texto y habla.
El NLP está en todas partes: asistentes de voz, traductores automáticos, filtros de spam, buscadores, chatbots, análisis de sentimientos en redes sociales, resúmenes automáticos… Es una de las áreas de la IA con mayor impacto directo en la vida cotidiana.
Breve historia del NLP
En este módulo cubrimos las bases clásicas y los embeddings (hasta Word2Vec). Los modelos de deep learning para NLP (LSTMs, Transformers, BERT, GPT…) se abordan en módulos posteriores, pero necesitas dominar estos fundamentos primero.
Los retos del lenguaje natural
¿Por qué es tan difícil que una máquina entienda texto? A diferencia de los datos numéricos o las imágenes (que son matrices de píxeles), el lenguaje es simbólico, ambiguo, contextual y enormemente variado. Veamos los principales retos:
Ambigüedad
Una misma palabra puede tener significados completamente diferentes según el contexto. Esto ocurre a múltiples niveles:
- Léxica: "banco" puede ser una entidad financiera, un asiento, o un banco de peces.
- Sintáctica: "Vi al hombre con el telescopio" — ¿quién tiene el telescopio?
- Semántica: "Cada niño ama a un animal" — ¿el mismo animal o uno diferente cada uno?
- Pragmática: "¿Puedes pasarme la sal?" — es una petición, no una pregunta sobre capacidad.
Variabilidad
La misma idea se puede expresar de infinitas formas: "El gato se sentó en la alfombra", "Sobre la alfombra descansaba el felino", "Michi se acomodó en el tapete"… El NLP debe aprender que todas dicen esencialmente lo mismo.
Contexto y conocimiento del mundo
Para interpretar "Hace frío, ¿puedes cerrar la ventana?", necesitas saber que cerrar la ventana impide que entre el aire frío. Este conocimiento del mundo (commonsense reasoning) es uno de los mayores desafíos abiertos en NLP.
El problema fundamental: los números
Los modelos matemáticos trabajan con números, no con palabras. El reto central del NLP es transformar texto en representaciones numéricas que capturen el significado, manteniendo las relaciones semánticas entre palabras.
Las secciones que siguen exploran las diferentes estrategias para conseguirlo: desde las más simples (one-hot, BoW) hasta las más sofisticadas (embeddings, Word2Vec).
Ontologías, vocabularios y recursos léxicos
Antes de la era del aprendizaje automático, el NLP dependía en gran medida de recursos léxicos construidos a mano: bases de datos que codifican el significado de las palabras, sus relaciones y la estructura del conocimiento. Muchos de ellos siguen siendo relevantes hoy.
¿Qué es una ontología?
En informática, una ontología es una representación formal de los conceptos dentro de un dominio y las relaciones entre ellos. Es como un mapa conceptual estructurado que una máquina puede consultar. Por ejemplo, una ontología médica sabe que la aspirina es un tipo de antiinflamatorio, que a su vez es un medicamento.
Recursos léxicos famosos
WordNet: la piedra angular del NLP léxico
WordNet merece una atención especial porque es, probablemente, el recurso léxico más utilizado en la historia del NLP. Fue desarrollado por el psicólogo George A. Miller y su equipo en la Universidad de Princeton a partir de 1985, con la primera versión pública en 1991 (Miller, 1995). La idea de Miller era crear una base de datos que reflejara cómo los humanos organizamos el léxico en la mente: no como un diccionario alfabético, sino como una red de conceptos conectados por relaciones semánticas.
La unidad fundamental de WordNet es el synset (synonym set): un grupo de palabras que comparten un significado concreto. Por ejemplo, el synset {coche, automóvil, vehículo_de_motor} agrupa tres formas de referirse al mismo concepto. Cada synset tiene una glosa (definición) y ejemplos de uso. Una misma palabra puede pertenecer a varios synsets — tantos como acepciones tenga. La palabra "bank" en inglés aparece en 18 synsets distintos.
Los synsets se organizan en una jerarquía taxonómica (un grafo acíclico dirigido) mediante relaciones semánticas. La más importante es la hiperonimia (is-a): "perro IS-A animal IS-A ser vivo IS-A entidad". Recorrer esta jerarquía permite calcular la distancia semántica entre dos conceptos cualesquiera — una métrica que se ha utilizado extensamente para evaluar modelos de NLP antes de la era de los embeddings. Métricas como la Wu-Palmer similarity y la Leacock-Chodorow similarity se basan enteramente en las longitudes de caminos en el grafo de WordNet.
Relaciones semánticas en WordNet
WordNet organiza las palabras mediante relaciones semánticas jerárquicas:
| Relación | Ejemplo | Descripción |
|---|---|---|
| Hiperonimia | animal → perro | "Es un tipo de" (generalización) |
| Hiponimia | perro → caniche | "Es un subtipo de" (especialización) |
| Meronimia | coche → rueda | "Es parte de" |
| Holonimia | rueda → coche | "Es el todo que contiene a" (inversa de meronimia) |
| Sinonimia | feliz ↔ contento | Mismo significado (mismo synset) |
| Antonimia | caliente ↔ frío | Significado opuesto |
En la práctica, WordNet se accede fácilmente desde Python mediante NLTK:
from nltk.corpus import wordnet as wn. Con una sola línea puedes explorar
los synsets de una palabra (wn.synsets('bank')), recorrer la jerarquía
(synset.hypernyms()), o calcular la similitud entre dos conceptos
(wn.wup_similarity(s1, s2)). También existe
WordNet en español
y otros idiomas como parte del proyecto
Global WordNet Association.
¿Siguen siendo útiles? Sí. Aunque los embeddings han reemplazado a las ontologías en muchas tareas, estas siguen siendo clave para: evaluación de modelos (similitud semántica basada en WordNet), data augmentation (reemplazar palabras por sinónimos), y dominios especializados (medicina, derecho) donde la estructura del conocimiento está bien definida. Además, recursos como WordNet han servido como ground truth para validar que los embeddings de Word2Vec realmente capturan relaciones semánticas.
Pipeline de preprocesamiento de texto
Antes de convertir texto en números, necesitamos limpiarlo y normalizarlo. El preprocesamiento es crucial porque la calidad de la representación depende directamente de la calidad del texto de entrada.
Pasa el ratón por cada paso para ver cómo se transforma un texto de ejemplo a lo largo del pipeline.
Tokenización
Dividir el texto en unidades mínimas (tokens). En el caso más simple, un token = una palabra, pero veremos que no siempre es así (puntuación, contracciones, idiomas sin espacios como el chino…).
Normalización
Convertir a minúsculas, eliminar o normalizar acentos, expandir abreviaturas. El objetivo es reducir variantes innecesarias: "Gato", "gato" y "GATO" deberían ser lo mismo.
Eliminación de stopwords
Las stopwords son palabras muy frecuentes que aportan poco significado semántico: artículos (el, la, un), preposiciones (de, en, por), pronombres (yo, tú, él). Eliminarlas reduce el ruido en la representación.
Stemming vs Lematización
Ambos buscan reducir las palabras a su forma base, pero de maneras diferentes:
| Técnica | Método | Ejemplo | Resultado |
|---|---|---|---|
| Stemming | Corta sufijos con reglas heurísticas | corriendo, correr, corrí | corr |
| Lematización | Usa diccionarios y análisis morfológico | corriendo, correr, corrí | correr |
El stemming es más rápido pero puede producir "raíces" que no son palabras reales (corr). La lematización es más precisa pero requiere análisis lingüístico. Algoritmos populares: Porter Stemmer, Snowball (stemming); spaCy, NLTK WordNetLemmatizer (lematización). En modelos modernos con tokenización subword (BPE, WordPiece), el stemming y la lematización suelen omitirse, ya que el modelo aprende a manejar variantes morfológicas por sí mismo.
One-Hot Encoding para palabras
La forma más sencilla de representar una palabra como un número es el one-hot encoding: asignar a cada palabra del vocabulario un vector binario donde solo una posición vale 1 y todas las demás son 0.
Si nuestro vocabulario tiene V palabras, cada palabra se representa como un vector de dimensión V. La palabra número i tiene un 1 en la posición i y ceros en todas las demás.
Problemas del one-hot encoding
✅ Ventajas
- Extremadamente simple de implementar
- No requiere entrenamiento
- Representación inequívoca: cada palabra tiene un vector único
❌ Problemas
- Muy alta dimensionalidad: vocabularios reales tienen 50.000-500.000 palabras
- Vectores dispersos: 99.99% de ceros (ineficiente)
- No captura semántica: "gato" y "perro" están tan lejos como "gato" y "avión"
- No captura orden: ignora la posición de las palabras
El problema clave: en one-hot, la distancia coseno entre cualquier par de palabras diferentes es exactamente la misma. \cos(\text{gato}, \text{perro}) = \cos(\text{gato}, \text{avión}) = 0. No hay forma de saber que "gato" y "perro" están semánticamente más cerca que "gato" y "avión".
Bag of Words (BoW)
El modelo Bag of Words (bolsa de palabras) representa un documento como un vector de frecuencias de palabras. Se llama "bolsa" porque ignora el orden de las palabras y la gramática: solo importa cuántas veces aparece cada palabra.
Construir el vocabulario: recopilar todas las palabras únicas del corpus.
Vectorizar cada documento: para cada palabra del vocabulario, contar cuántas veces aparece en el documento.
Resultado: cada documento es un vector de dimensión |V| donde cada componente es una frecuencia.
Ejemplo: con el vocabulario {el, gato, se, sienta, perro, ladra}:
Limitaciones del Bag of Words
- Ignora el orden: "El perro mordió al hombre" y "El hombre mordió al perro" tienen la misma representación.
- Alta dimensionalidad: el vector tiene el tamaño del vocabulario completo.
- Palabras frecuentes dominan: artículos y preposiciones tienen frecuencias altas sin aportar significado.
La solución al tercer problema es precisamente TF-IDF, que veremos a continuación.
TF-IDF: frecuencia ponderada por relevancia
TF-IDF (Term Frequency – Inverse Document Frequency) es una mejora sobre Bag of Words que pondera cada palabra según su importancia relativa. La intuición es sorprendentemente elegante: una palabra que aparece mucho en un documento pero poco en los demás es más informativa — y por tanto más útil para distinguir ese documento del resto.
Piensa en un buscador web: si buscas "fotosíntesis cloroplasto", esas dos palabras aparecen en muy pocos documentos de internet, así que tienen un IDF alto y son muy discriminantes. En cambio, "el" o "de" aparecen en prácticamente todos los documentos, así que su IDF es casi cero. TF-IDF captura exactamente esta idea: las palabras raras pero relevantes valen más que las palabras frecuentes pero vacías de contenido. Fue durante décadas la representación estándar en sistemas de recuperación de información (information retrieval), y motores como Apache Lucene (la base de Elasticsearch y Solr) lo usan internamente.
La fórmula
Term Frequency (TF): cuántas veces aparece el término en el documento, normalizado:
Inverse Document Frequency (IDF): penaliza las palabras que aparecen en muchos documentos:
El valor TF-IDF es simplemente el producto:
Intuición: TF-IDF da valores altos a palabras que son frecuentes en un documento pero raras en el corpus. "El" aparece en todos los documentos → IDF ≈ 0. "Fotosíntesis" aparece solo en un documento de biología → IDF alto.
Ventajas de TF-IDF sobre BoW
- Reduce la influencia de palabras comunes (stopwords implícito).
- Destaca los términos verdaderamente discriminantes de cada documento.
- Es la base de muchos motores de búsqueda clásicos (Lucene, Elasticsearch).
- Funciona sorprendentemente bien para tareas de clasificación de texto con SVM o regresión logística.
Existen variantes de la fórmula básica que mejoran su comportamiento. La más popular es usar un TF sublineal: en lugar de la frecuencia directa, se usa \(1 + \log(\text{TF})\), lo que amortigua el efecto de palabras que se repiten muchas veces en un solo documento. BM25 (Best Match 25, Robertson et al.) lleva esta idea más lejos: añade normalización por la longitud del documento y saturación del TF. Es la función de ranking por defecto en Elasticsearch y sigue siendo competitiva frente a sistemas basados en embeddings para muchas tareas de búsqueda.
En la práctica: sklearn.feature_extraction.text.TfidfVectorizer calcula
TF-IDF en una sola línea de Python. Acepta parámetros como sublinear_tf=True para la
variante logarítmica y max_features para limitar el vocabulario. Para muchas tareas
"pequeñas" (clasificación con pocas clases, datasets <100K documentos), TF-IDF + un modelo lineal
sigue siendo un baseline difícil de superar.
N-gramas y modelos de lenguaje clásicos
Hasta ahora, todas nuestras representaciones ignoran el orden de las palabras. Los n-gramas son secuencias contiguas de n elementos (palabras o caracteres) que capturan algo de contexto local.
| Tipo | n | Ejemplo ("El gato duerme") |
|---|---|---|
| Unigrama | 1 | "El", "gato", "duerme" |
| Bigrama | 2 | "El gato", "gato duerme" |
| Trigrama | 3 | "El gato duerme" |
Modelos de lenguaje con n-gramas
Un modelo de lenguaje asigna una probabilidad a una secuencia de palabras. Con n-gramas, se usa la cadena de Markov: la probabilidad de la siguiente palabra depende solo de las n-1 anteriores.
Ejemplo: si en un corpus "el gato" aparece 50 veces y "el" aparece 1000 veces, entonces P(\text{gato} \mid \text{el}) = 50/1000 = 0.05.
Problema de los n-gramas: al aumentar n, el número de n-gramas posibles crece exponencialmente (|V|^n) y la mayoría nunca aparece en el corpus → datos dispersos. Los trigramas ya son problemáticos con vocabularios grandes. Esto motivó la búsqueda de representaciones más compactas: los embeddings. De hecho, fue precisamente este problema el que llevó a Bengio et al. (2003) a proponer los primeros modelos de lenguaje neuronales con embeddings aprendidos.
Datasets y benchmarks famosos
El progreso en NLP se mide sobre benchmarks estandarizados. Estos son los datasets más influyentes que cualquier practicante de NLP debería conocer:
- AG News: 120.000 artículos de noticias en 4 categorías. Clasificación de tópicos.
- SST-2 (Stanford Sentiment Treebank): Análisis de sentimientos con anotaciones a nivel de frase.
- SNLI (Stanford NLI): 570.000 pares de oraciones para inferencia de lenguaje natural (entailment, contradicción, neutral).
- MultiNLI: Extensión de SNLI con mayor diversidad de géneros textuales.
- 20 Newsgroups: Dataset clásico de clasificación con ~20.000 documentos en 20 categorías temáticas.
- Common Crawl: Petabytes de texto web crawleado. Base para pre-entrenar modelos de lenguaje masivos.
Limitaciones del NLP clásico
Las técnicas que hemos visto (one-hot, BoW, TF-IDF, n-gramas) fueron el estado del arte durante décadas. Pero todas comparten limitaciones fundamentales que motivan la transición hacia representaciones basadas en embeddings:
Resumen de limitaciones
| Técnica | Dimensión | Semántica | Orden | Generalización |
|---|---|---|---|---|
| One-Hot | |V| (enorme) | Ninguna | No | Nula |
| BoW | |V| (enorme) | Ninguna | No | Baja |
| TF-IDF | |V| (enorme) | Indirecta | No | Baja |
| N-gramas | |V|n (explosiva) | Local | Local | Muy baja |
| Embeddings | d (compacta, e.g. 300) | Sí | Depende | Alta |
La gran pregunta: ¿Es posible representar palabras con vectores densos de baja dimensión (e.g. 300 dimensiones en lugar de 100.000) donde palabras similares tengan vectores similares? Sí. La respuesta son los embeddings, y la revolución empezó con Word2Vec en 2013.
En la siguiente sección exploramos esta idea transformadora y cómo se implementa en la práctica. Veremos que los embeddings no solo resuelven los problemas de dimensionalidad y semántica, sino que además son el puente natural hacia las redes neuronales: un embedding no es más que una capa de la red que transforma índices discretos en vectores continuos sobre los que se puede hacer descenso del gradiente.
De vectores dispersos a densos: la idea de embedding
El gran salto conceptual del NLP moderno es abandonar los vectores dispersos (one-hot, BoW, TF-IDF) y pasar a vectores densos de baja dimensión que capturan el significado semántico de las palabras. Estos vectores se llaman embeddings (literalmente, "incrustaciones").
La hipótesis distribucional
J.R. Firth (1957): "You shall know a word by the company it keeps." (Conocerás una palabra por la compañía que mantiene.)
Las palabras que aparecen en contextos similares tienen significados similares. Si "gato" y "perro" aparecen frecuentemente con "mascota", "veterinario", "comer"… entonces sus vectores deberían ser cercanos. Esta idea, conocida como la hipótesis distribucional, es la base teórica de todos los métodos de embeddings y fue formalizada por Turney & Pantel (2010) en su influyente survey.
¿Qué es exactamente un embedding?
Un embedding es una función aprendida que mapea cada palabra a un vector de números reales en un espacio de dimensión fija (típicamente entre 50 y 300 dimensiones):
Las propiedades deseadas son:
- Compacto: d = 300 en lugar de |V| = 100.000.
- Denso: todos los componentes del vector son no-nulos y significativos.
- Semántico: palabras con significados similares → vectores cercanos (coseno alto).
- Composicional: las direcciones en el espacio capturan relaciones (rey − hombre + mujer ≈ reina).
La similitud coseno
Para medir cuán "cerca" están dos embeddings usamos la similitud coseno: el coseno del ángulo entre los dos vectores. Varía entre −1 (opuestos) y 1 (idénticos).
Con embeddings bien entrenados: \cos(\text{gato}, \text{perro}) \approx 0.8 pero \cos(\text{gato}, \text{avión}) \approx 0.1. ¡El one-hot daba 0 para ambos pares!
Word2Vec: CBOW y Skip-gram
Word2Vec (Mikolov et al., 2013) es el modelo que democratizó los embeddings de palabras. Propuso dos arquitecturas simples y eficientes para aprender vectores densos a partir de grandes cantidades de texto sin etiquetar (aprendizaje no supervisado). El paper original ("Distributed Representations of Words and Phrases and their Compositionality", NeurIPS 2013) introdujo además el negative sampling, que hizo el entrenamiento viable a gran escala.
Idea central: entrenar una red neuronal poco profunda (una sola capa oculta) para predecir palabras a partir de su contexto (o viceversa). Los pesos de la capa oculta son los embeddings que buscamos.
Arquitectura 1: CBOW (Continuous Bag of Words)
CBOW predice la palabra central a partir de las palabras de su contexto (ventana de tamaño c).
CBOW: "Dadas las palabras del entorno, ¿qué palabra falta en el centro?"
Formalmente, CBOW minimiza:
Donde la distribución de probabilidad se calcula mediante:
donde \bar{\mathbf{v}} es la media de los embeddings del contexto y \mathbf{v}'_w son los pesos de la capa de salida.
Arquitectura 2: Skip-gram
Skip-gram hace lo contrario: dada la palabra central, predice las palabras del contexto.
Skip-gram: "Dada esta palabra, ¿qué palabras la rodean?"
CBOW vs Skip-gram
CBOW
- Más rápido de entrenar (suaviza el contexto)
- Mejor con palabras frecuentes
- Bueno para vocabularios pequeños/medianos
Skip-gram
- Mejor con palabras raras (más muestras de entrenamiento)
- Mejores analogías y relaciones semánticas
- Preferido en la práctica para la mayoría de tareas
Negative Sampling: entrenamiento eficiente
El softmax sobre todo el vocabulario (|V| clases) es computacionalmente prohibitivo para vocabularios grandes. Negative sampling simplifica el problema: en lugar de calcular la probabilidad sobre todas las palabras, solo comparamos la palabra correcta con k palabras "negativas" elegidas al azar.
Donde \sigma es la función sigmoide, w_O es la palabra objetivo (positivo), w_I es la palabra de entrada, y P_n(w) es la distribución de muestreo negativo (típicamente P_n(w) \propto f(w)^{3/4}).
Valores típicos: k = 5{-}20 para datasets pequeños, k = 2{-}5 para datasets grandes. Dimensión del embedding: d = 100{-}300. Ventana de contexto: c = 5{-}10.
La magia de las analogías
El resultado más asombroso de Word2Vec es que los embeddings aprendidos capturan relaciones analógicas como operaciones algebraicas sobre vectores:
Las analogías funcionan porque el entrenamiento con contextos fuerza a que las direcciones en el espacio de embeddings capturen relaciones semánticas consistentes. Por ejemplo, la dirección "masculino → femenino" es aproximadamente la misma para todos los pares (hombre→mujer, rey→reina, actor→actriz). Esto se debe a que estas palabras aparecen en contextos lingüísticos paralelos.
Matemáticamente, si \vec{b} - \vec{a} \approx \vec{d} - \vec{c}, entonces \vec{a} - \vec{b} + \vec{c} \approx \vec{d}. Es una consecuencia directa de la estructura lineal del espacio de embeddings aprendido.
GloVe y FastText
Tras el éxito de Word2Vec, surgieron modelos alternativos que mejoraron ciertos aspectos de los embeddings de palabras. Los dos más relevantes son GloVe y FastText.
GloVe (Global Vectors)
GloVe (Pennington et al., Stanford, 2014) combina lo mejor de dos mundos:
- Métodos de factorización de matrices (como LSA): capturan estadísticas globales del corpus.
- Métodos de ventana local (como Word2Vec): capturan patrones contextuales.
GloVe construye una matriz de co-ocurrencia X_{ij} = nº de veces que la palabra j aparece en el contexto de la palabra i. Luego optimiza:
donde f(x) es una función de peso que limita la influencia de co-ocurrencias muy frecuentes. El resultado: embeddings con las mismas propiedades que Word2Vec, pero entrenados de forma diferente.
FastText
FastText (Bojanowski et al., Facebook AI Research, 2017) extiende Word2Vec con una idea brillante: en lugar de aprender un embedding por palabra, aprende embeddings para n-gramas de caracteres y representa cada palabra como la suma de sus subpartes. Facebook publicó embeddings pre-entrenados para 157 idiomas, lo que hizo de FastText una de las herramientas más accesibles del NLP.
Por ejemplo, "where" con trigramas de caracteres se descompone en:
✅ Ventajas de FastText
- Genera embeddings para palabras desconocidas (OOV) basándose en sus n-gramas de caracteres
- Mejor rendimiento en idiomas morfológicamente ricos (español, turco, finés…)
- Captura similitud entre palabras con raíces comunes (correr, corredor, corriendo)
❌ Desventajas
- Modelos más grandes (más parámetros que Word2Vec)
- Más lento de entrenar
- Menor beneficio en idiomas con poca morfología (como el chino)
Comparativa rápida
| Modelo | Enfoque | Manejo OOV | Velocidad | Caso de uso ideal |
|---|---|---|---|---|
| Word2Vec | Ventana local (CBOW/SG) | No | Rápido | Embeddings generales, analogías |
| GloVe | Co-ocurrencia global | No | Medio | Tareas que necesitan estadísticas globales |
| FastText | Subword n-grams | Sí | Medio | Idiomas ricos en morfología, textos con errores |
Pre-trained embeddings: todos estos modelos ofrecen embeddings pre-entrenados en grandes corpus (Wikipedia, Common Crawl). En la práctica, raramente se entrenan desde cero: se descargan y se usan directamente, o se fine-tunean para la tarea específica. Los más populares: Word2Vec pre-trained (Google News, 300d), GloVe pre-trained (6B, 42B, 840B tokens), FastText pre-trained (157 idiomas).
Tokenización moderna: subword, BPE y WordPiece
En Word2Vec y GloVe, un token = una palabra. Esto plantea problemas con vocabularios enormes, palabras raras, errores tipográficos y nuevas palabras. La tokenización moderna propone una solución elegante: descomponer las palabras en subunidades.
La idea: en lugar de un vocabulario de 500.000 palabras completas, usar un vocabulario de ~30.000 subunidades (subwords) que pueden combinarse para formar cualquier palabra. Así, "desafortunadamente" podría tokenizarse como ["des", "##afortuna", "##da", "##mente"].
Niveles de granularidad
| Nivel | Ejemplo: "Infelizmente" | |Vocab| | Modelo típico |
|---|---|---|---|
| Palabra | Infelizmente | ~500K | Word2Vec, GloVe |
| Subword | In ##feliz ##mente | ~30K | BERT, GPT |
| Carácter | Infelizmente | ~256 | CharCNN |
BPE (Byte Pair Encoding)
BPE (Sennrich et al., 2016) es el algoritmo de tokenización subword más utilizado. Funciona de forma iterativa:
Inicializar: el vocabulario contiene todos los caracteres individuales del corpus.
Contar pares: encontrar el par de tokens adyacentes más frecuente en todo el corpus.
Merge: fusionar ese par en un nuevo token y añadirlo al vocabulario.
Repetir los pasos 2-3 hasta alcanzar el tamaño deseado de vocabulario (e.g. 30.000 tokens).
Ejemplo simplificado: si en el corpus las letras "e" y "s" aparecen juntas 500 veces, BPE crea el token "es". Luego quizás "es" y "t" se fusionan en "est", etc.
WordPiece y SentencePiece
Existen variantes de BPE optimizadas para diferentes modelos:
Token ≠ Palabra: en los modelos modernos (GPT, BERT, LLaMA…), un token puede ser una palabra completa ("gato"), parte de una palabra ("##mente"), un carácter especial ([CLS]), o incluso un byte. Esto permite representar cualquier texto con un vocabulario compacto de ~30.000-50.000 tokens.
Impacto práctico
La elección del tokenizador afecta directamente al rendimiento del modelo:
- Vocabulario pequeño (e.g. caracteres): secuencias muy largas, más difíciles de aprender, pero cubre todo.
- Vocabulario grande (e.g. palabras): secuencias cortas, pero muchas palabras OOV (fuera de vocabulario).
- Subword (BPE/WordPiece): equilibrio óptimo. Las palabras frecuentes son tokens completos; las raras se descomponen.
Hacia el deep learning para NLP
Los embeddings (Word2Vec, GloVe, FastText) fueron el primer gran puente entre el texto y las redes neuronales. Pero tienen una limitación fundamental: cada palabra tiene un único vector, independientemente del contexto.
El problema de la polisemia: en Word2Vec, la palabra "banco" tiene un solo embedding, pero puede significar cosas muy diferentes: "Me senté en el banco" vs "Deposité dinero en el banco". Los embeddings estáticos no distinguen estos usos.
El primer intento de resolver la polisemia fue ELMo (Peters et al., 2018), que utilizaba un modelo de lenguaje bidireccional basado en LSTMs para generar embeddings dependientes del contexto. Poco después, BERT (basado en Transformers) llevó los embeddings contextuales al siguiente nivel, convirtiendo el pre-training + fine-tuning en el paradigma dominante del NLP moderno.
Las siguientes generaciones de modelos resuelven esto con embeddings contextuales: vectores que cambian según la frase completa.
El camino que nos espera
Referencias y lecturas complementarias:
- Bengio et al., «A Neural Probabilistic Language Model» (2003) — primeros embeddings neuronales
- Mikolov et al., «Efficient Estimation of Word Representations in Vector Space» (2013) — Word2Vec
- Mikolov et al., «Distributed Representations of Words and Phrases» (2013) — negative sampling
- Pennington et al., «GloVe: Global Vectors for Word Representation» (2014)
- Bojanowski et al., «Enriching Word Vectors with Subword Information» (2017) — FastText
- Sennrich et al., «Neural Machine Translation of Rare Words with Subword Units» (2016) — BPE
- Peters et al., «Deep contextualized word representations» (2018) — ELMo
- Jurafsky & Martin, Speech and Language Processing (3rd ed.) — libro de referencia (gratuito)
Resumen del módulo: Has aprendido el viaje completo de la representación del texto:
- NLP clásico: ontologías, preprocesamiento, one-hot, BoW, TF-IDF, n-gramas.
- Embeddings: hipótesis distribucional, Word2Vec (CBOW/Skip-gram), GloVe, FastText.
- Tokenización moderna: subword, BPE, WordPiece, SentencePiece.
Estas bases son esenciales para entender los módulos de RNN y Transformers. Los embeddings que aquí has estudiado son literalmente la primera capa de todos esos modelos.