En el tema anterior vimos qué son los embeddings de palabras y por qué representaron un cambio profundo respecto de Bag of Words y TF-IDF. Ahora toca estudiar uno de los métodos más influyentes para aprender esos embeddings: Word2Vec.
Word2Vec no fue importante solo por producir buenos vectores, sino porque mostró de forma clara y eficiente que era posible aprender representaciones densas de palabras a partir de grandes corpus textuales usando una tarea relativamente simple basada en contexto.
En este tema no nos centraremos en fórmulas detalladas, sino en la intuición conceptual detrás del método: qué intenta aprender, cómo lo hace y por qué sus embeddings resultaron tan útiles.
Word2Vec es una familia de modelos diseñada para aprender embeddings de palabras a partir de texto. La idea central es entrenar una red relativamente simple para resolver una tarea relacionada con el contexto de las palabras. Al hacerlo, el modelo aprende vectores que terminan capturando relaciones útiles entre términos.
Lo importante aquí es que Word2Vec no parte de un diccionario semántico hecho a mano. Aprende directamente desde grandes cantidades de texto observando patrones de coocurrencia y contexto.
La intuición de Word2Vec es coherente con la idea que ya vimos en embeddings: si dos palabras aparecen en contextos parecidos, probablemente tengan significados relacionados.
Por ejemplo, si en un corpus las palabras doctor y médico suelen aparecer cerca de términos como hospital, paciente o consulta, el modelo puede aprender que esas palabras deben ocupar regiones cercanas del espacio vectorial.
La gran idea de Word2Vec es convertir el aprendizaje de embeddings en un problema de predicción. En lugar de pedirle al modelo que "entienda" el lenguaje directamente, se le pide que prediga palabras de contexto o palabras objetivo dentro de una ventana local del texto.
Si el modelo aprende bien esa tarea, entonces necesita construir representaciones internas que reflejen relaciones útiles entre palabras. Esas representaciones internas son precisamente los embeddings.
Un concepto central en Word2Vec es la ventana de contexto. Cuando observamos una palabra dentro de un texto, miramos también las palabras que la rodean a cierta distancia. Esas palabras vecinas se consideran parte de su contexto local.
Por ejemplo, en la oración:
el gato negro duerme en el sillón
si tomamos como palabra central negro, las palabras cercanas como gato y duerme pueden formar parte de su contexto, dependiendo del tamaño de la ventana elegida.
La ventana de contexto define qué relaciones locales aprende el modelo.
Word2Vec suele presentarse mediante dos variantes principales:
Ambas aprenden embeddings, pero formulan la tarea predictiva de manera inversa entre sí.
En CBOW, el modelo intenta predecir una palabra a partir de su contexto. Es decir, observa las palabras vecinas y trata de inferir cuál es la palabra central faltante.
Si tenemos una frase y ocultamos una palabra, el sistema usa las palabras alrededor para intentar adivinarla. Para hacer bien esa tarea, necesita aprender representaciones coherentes del vocabulario.
Intuitivamente, CBOW responde a una pregunta como: "dadas estas palabras cercanas, ¿qué palabra encaja en el medio?".
En Skip-Gram, el proceso es inverso. El modelo toma una palabra central y trata de predecir las palabras de su contexto.
Aquí la intuición es: "si conozco esta palabra, ¿qué palabras suelen aparecer cerca de ella?".
Para responder bien esa pregunta, el modelo debe aprender qué tipos de contextos son típicos para cada palabra, y eso conduce naturalmente a embeddings útiles.
Podemos resumir la diferencia así:
Ambos enfoques aprenden vectores similares en espíritu, aunque con comportamientos y tradeoffs algo diferentes según el tamaño del corpus, la frecuencia de las palabras y el objetivo práctico.
En Word2Vec, los embeddings aparecen como parte de los parámetros internos que el modelo ajusta durante el entrenamiento. Aunque la tarea explícita es predecir contexto o palabra central, el resultado más valioso no suele ser la predicción en sí, sino los vectores aprendidos para cada palabra.
Es decir, el entrenamiento es el medio. Los embeddings aprendidos son el fin práctico que luego reutilizamos en otras tareas.
Word2Vec fue muy influyente por varias razones:
En otras palabras, no solo fue una técnica puntual, sino un cambio de dirección en la forma de pensar la representación del lenguaje.
Los embeddings aprendidos por Word2Vec mostraron que el espacio vectorial podía reflejar regularidades interesantes. Palabras relacionadas temáticamente, sintácticamente o por analogía tendían a organizarse de manera no arbitraria.
Lo importante aquí no es memorizar ejemplos famosos, sino entender la idea general: el modelo no solo agrupa palabras parecidas, sino que descubre estructuras del lenguaje a partir de uso contextual.
Aunque los resultados de Word2Vec fueron impresionantes, conviene no exagerar lo que hace. El modelo no comprende el significado del lenguaje como una persona. Aprende regularidades estadísticas de coocurrencia.
Sin embargo, esas regularidades son lo suficientemente ricas como para producir representaciones muy útiles en la práctica.
Word2Vec aportó ventajas muy importantes:
Esto lo convirtió en una herramienta muy valiosa tanto para investigación como para aplicaciones prácticas.
Word2Vec también tiene limitaciones importantes:
Estas limitaciones motivaron la aparición de métodos posteriores más sofisticados.
Un aspecto conceptualmente interesante de Word2Vec es que la tarea explícita de entrenamiento no suele ser la tarea final que nos interesa en producción. Nadie usa normalmente Word2Vec solo para predecir palabras vecinas. Lo que realmente nos interesa son los embeddings que surgen al resolver esa tarea auxiliar.
Esta idea fue muy poderosa porque mostró que se puede aprender una buena representación interna resolviendo una tarea proxy relativamente simple.
Parte del éxito de Word2Vec se debió a que permitió entrenar embeddings sobre grandes cantidades de texto de manera bastante eficiente para su época. Eso hizo posible disponer de vectores útiles entrenados sobre corpora grandes, algo que impulsó enormemente su adopción.
Una vez aprendido un conjunto de embeddings con Word2Vec, esos vectores podían reutilizarse en otras tareas como clasificación, análisis de sentimiento o etiquetado. Esto permitió que muchos sistemas comenzaran ya con una representación semánticamente razonable del vocabulario.
En este sentido, Word2Vec ayudó a instalar la idea de preentrenar representaciones y luego reutilizarlas en tareas posteriores.
TF-IDF pondera términos según su importancia relativa en documentos. Word2Vec, en cambio, aprende relaciones entre palabras a partir de contexto. No son técnicas equivalentes ni competidoras directas en todos los casos.
Podemos decir que:
Imaginemos que un modelo observa muchísimas frases donde aparecen palabras como rey, reina, príncipe, princesa, trono y palacio. Si aprende a predecir contexto o palabra central, tenderá a descubrir que estas palabras comparten cierto vecindario semántico.
Ese tipo de organización del espacio vectorial es lo que hizo tan valioso a Word2Vec.
Más allá del método en sí, Word2Vec dejó varias ideas que marcaron el rumbo del NLP moderno:
| Aspecto | CBOW | Skip-Gram |
|---|---|---|
| Objetivo | Predecir la palabra central desde el contexto. | Predecir el contexto desde la palabra central. |
| Intuición | Qué palabra encaja aquí. | Qué palabras suelen rodear a esta. |
| Resultado práctico | Aprendizaje de embeddings útiles del vocabulario. | |
Con gensim podemos entrenar un Word2Vec diminuto sobre un corpus de ejemplo y consultar palabras similares. En un entorno real se usaría un corpus mucho más grande, pero este experimento ya deja ver la idea.
Antes de ejecutar esta aplicación conviene instalar la biblioteca necesaria con:
pip install gensim
from gensim.models import Word2Vec
corpus = [
["cliente", "feliz", "compra", "producto", "excelente"],
["cliente", "enojado", "reclama", "envio", "tardio"],
["producto", "excelente", "calidad", "duradera"],
["envio", "rapido", "cliente", "feliz"],
["soporte", "rapido", "resuelve", "reclamo"],
]
modelo = Word2Vec(
sentences=corpus,
vector_size=50,
window=2,
min_count=1,
workers=1,
epochs=200
)
print(modelo.wv.most_similar("cliente", topn=3))
print(modelo.wv.most_similar("rapido", topn=3))
La aplicación puede leerse paso a paso:
from gensim.models import Word2Vec importa la clase que permite entrenar embeddings de palabras.corpus es el conjunto de frases ya tokenizadas. Cada sublista representa una oración y cada palabra aparece separada como un token.sentences=corpus indica cuál es el material de entrenamiento que el modelo recorrerá para aprender relaciones de contexto.vector_size=50 fija que cada palabra se representará con un vector de 50 números.window=2 define una ventana de contexto de 2 palabras a izquierda y derecha aproximadamente, según la posición disponible en cada oración.min_count=1 hace que no se descarte ninguna palabra del corpus, incluso si aparece una sola vez.workers=1 indica que el entrenamiento usará un único hilo.epochs=200 hace que el modelo recorra muchas veces el corpus para intentar aprender mejor, algo razonable aquí porque el conjunto es mínimo.modelo.wv.most_similar("cliente", topn=3) busca las tres palabras cuyo vector quedó más cerca del vector de cliente.Una salida como [('compra', 0.229...), ('tardio', 0.195...), ('enojado', 0.171...)] significa que, dentro del espacio vectorial aprendido por este corpus, las palabras más cercanas a cliente fueron compra, tardio y enojado. El segundo número es un puntaje de similitud coseno entre vectores: cuanto más cerca esté de 1, más parecidas resultan las palabras para el modelo; cuanto más cerca de 0, menos relación encontró.
En este ejemplo, los valores son bajos porque el corpus es muy pequeño y el entrenamiento es apenas ilustrativo. Aun así, la salida sugiere que cliente aparece en contextos relacionados con compra, reclamos y demoras, por eso esas palabras terminan relativamente cerca. No significa que sean sinónimos, sino que el modelo observó contextos parecidos.
De manera similar, una salida como [('producto', 0.137...), ('reclama', 0.094...), ('reclamo', 0.093...)] para rapido indica cuáles fueron los vecinos más próximos de esa palabra en este corpus. Otra vez, no debe interpretarse como una verdad lingüística fuerte: solo refleja asociaciones estadísticas aprendidas a partir de unas pocas frases.
Lo importante es entender la idea general: Word2Vec transforma cada palabra en un vector y luego puede comparar esos vectores. Si dos palabras terminan cerca en ese espacio, es porque el modelo detectó que suelen vivir en contextos parecidos.
Lo interesante aquí no es solo obtener vecinos parecidos, sino entender que Word2Vec aprende esas relaciones observando contexto. Si el corpus es rico, el espacio vectorial resultante empieza a reflejar regularidades semánticas útiles.
Word2Vec fue uno de los métodos más influyentes de la historia del NLP porque mostró que era posible aprender embeddings de palabras útiles a partir de una tarea simple basada en contexto. Gracias a eso, la representación del lenguaje dio un salto importante desde los conteos clásicos hacia espacios semánticos aprendidos.
Su impacto fue enorme no solo por la calidad de los vectores, sino por la forma de pensar que instaló: aprender representaciones desde datos mediante tareas auxiliares.
En el próximo tema estudiaremos GloVe y otros embeddings clásicos, para comparar Word2Vec con otros enfoques históricos que también buscaron construir buenos espacios vectoriales para palabras.