La Revolución Vectorial

S1: Word2Vec — Skip-gram y CBOW

Prof. Francisco Suárez

Universidad Católica Boliviana

2026-03-03

Agenda de Hoy

Primera Parte

  1. 🔙 Repaso: Limitaciones de las representaciones dispersas
  2. 💡 La hipótesis distribucional
  3. 🧠 Representaciones densas: Word Embeddings

Segunda Parte

  1. 🎯 Word2Vec: CBOW y Skip-gram
  2. ⚡ Entrenamiento eficiente: Negative Sampling
  3. 🛠️ Implementación con Gensim

Bloque 1: De Vectores Dispersos a Densos

¿Dónde Quedamos?

En las semanas anteriores aprendimos varias formas de representar palabras:

Representaciones dispersas

Método Dimensión Tipo
One-hot \(|V|\) Binario
BoW \(|V|\) Conteos
TF-IDF \(|V|\) Pesos

Problemas

  • Dimensión enorme: \(|V| \sim 50{,}000+\)
  • Dispersos: casi todos los valores son 0
  • Sin similitud: vectores one-hot son todos ortogonales

\[\text{sim}(\vec{v}_{\text{gato}}, \vec{v}_{\text{perro}}) = 0\]

El Gran Problema

Estas representaciones no capturan relaciones semánticas entre palabras. “gato” y “perro” están tan lejos como “gato” y “constitución”. 😤

El Sueño: Vectores con Significado

¿Y si pudiéramos tener vectores donde…?

Propiedades deseadas

  • Dimensión baja: 100-300 en vez de 50,000
  • Densos: todos los valores son números reales
  • Semánticos: palabras similares → vectores cercanos

Ejemplo ideal

\[\vec{v}_{\text{gato}} = [0.23, -0.11, 0.87, \ldots]\] \[\vec{v}_{\text{perro}} = [0.25, -0.09, 0.82, \ldots]\] \[\vec{v}_{\text{constitución}} = [-0.71, 0.45, 0.12, \ldots]\]

\[\text{sim}(\vec{v}_{\text{gato}}, \vec{v}_{\text{perro}}) \approx 0.92\] \[\text{sim}(\vec{v}_{\text{gato}}, \vec{v}_{\text{constitución}}) \approx 0.05\]

¡Esto es exactamente lo que hacen los Word Embeddings! 🎉

Bloque 2: La Hipótesis Distribucional

“You Shall Know a Word by the Company It Keeps”

J.R. Firth (1957): “You shall know a word by the company it keeps.”

La hipótesis distribucional establece que:

Las palabras que aparecen en contextos similares tienden a tener significados similares.

Ejemplo

  • “El gato se subió al árbol”
  • “El perro se subió al sofá”
  • “Mi gato come pescado”
  • “Mi perro come carne”

Observación

“gato” y “perro” aparecen en contextos muy similares:

  • Después de “El”, “Mi”
  • Antes de “se subió”, “come”
  • Con palabras como “come”, “duerme”

Deben tener significados relacionados 🐱🐶

De la Intuición a los Números

¿Cómo convertimos esta idea en vectores?

Enfoque clásico: Matriz de co-ocurrencia

Construir una matriz \(M\) donde \(M_{ij}\) = cuántas veces la palabra \(i\) aparece cerca de la palabra \(j\).

gato perro come árbol
el 5 4 0 2
come 3 3 0 0
grande 1 2 0 1

Problema

  • La matriz sigue siendo enorme (\(|V| \times |V|\))
  • Muy dispersa
  • Necesitamos comprimir esta información

. . .

Solución: Aprender vectores densos

En vez de usar la matriz directamente, aprender vectores de baja dimensión que predigan los patrones de co-ocurrencia.

¡Esto es Word2Vec! 🚀

Bloque 3: Word2Vec — La Idea Central

Word2Vec (Mikolov et al., 2013)

La idea clave

En vez de contar co-ocurrencias, entrenar una red neuronal para predecir palabras a partir de su contexto (o viceversa).

Los pesos aprendidos de la red neuronal son los word embeddings.

Dos arquitecturas

  1. CBOW (Continuous Bag of Words)
    • Predice la palabra central a partir del contexto
  2. Skip-gram
    • Predice el contexto a partir de la palabra central

Dato Histórico

Tomáš Mikolov publicó Word2Vec en 2013 mientras trabajaba en Google. El paper “Efficient Estimation of Word Representations in Vector Space” revolucionó el NLP y marcó el inicio de la era de los embeddings.

Ventana de Contexto

Antes de ver las arquitecturas, necesitamos definir la ventana de contexto \(c\):

Ejemplo con \(c = 2\):

“El gato come pescado fresco”

Rol Palabras
Contexto izquierdo “El”, “gato”
Palabra central “come”
Contexto derecho “pescado”, “fresco”

La ventana se desliza por todo el corpus generando pares de entrenamiento:

Palabra central Contexto (\(c = 2\))
El gato, come
gato El, come, pescado
come El, gato, pescado, fresco
pescado gato, come, fresco
fresco come, pescado

Bloque 4: CBOW — Continuous Bag of Words

Arquitectura CBOW

Objetivo: Predecir la palabra central dado su contexto.

Code
flowchart LR
    subgraph Entrada ["Contexto (c=2)"]
        w1["El"]
        w2["gato"]
        w3["pescado"]
        w4["fresco"]
    end

    subgraph Proyección ["Capa de Proyección"]
        avg["Promedio de<br>embeddings"]
    end

    subgraph Salida ["Capa de Salida"]
        pred["Softmax<br>P(w|contexto)"]
    end

    w1 --> avg
    w2 --> avg
    w3 --> avg
    w4 --> avg
    avg --> pred
    pred --> target["come ✓"]

flowchart LR
    subgraph Entrada ["Contexto (c=2)"]
        w1["El"]
        w2["gato"]
        w3["pescado"]
        w4["fresco"]
    end

    subgraph Proyección ["Capa de Proyección"]
        avg["Promedio de<br>embeddings"]
    end

    subgraph Salida ["Capa de Salida"]
        pred["Softmax<br>P(w|contexto)"]
    end

    w1 --> avg
    w2 --> avg
    w3 --> avg
    w4 --> avg
    avg --> pred
    pred --> target["come ✓"]

CBOW: Paso a Paso

1. Buscar embeddings

Cada palabra del contexto se convierte en un vector de dimensión \(d\):

\[\vec{v}_{\text{El}}, \vec{v}_{\text{gato}}, \vec{v}_{\text{pescado}}, \vec{v}_{\text{fresco}} \in \mathbb{R}^d\]

2. Promediar

\[\vec{h} = \frac{1}{2c} \sum_{j \in \text{contexto}} \vec{v}_j\]

3. Calcular scores

Se multiplica por una segunda matriz de pesos \(W' \in \mathbb{R}^{d \times |V|}\):

\[\vec{z} = W'^T \vec{h}\]

4. Softmax

\[P(w_t \mid \text{contexto}) = \frac{e^{z_{w_t}}}{\sum_{j=1}^{|V|} e^{z_j}}\]

La Clave

La red tiene dos matrices de pesos: \(W \in \mathbb{R}^{|V| \times d}\) (embeddings de entrada) y \(W' \in \mathbb{R}^{d \times |V|}\) (embeddings de salida). Generalmente usamos \(W\) como nuestros word embeddings finales.

CBOW: Función de Pérdida

El objetivo es maximizar la probabilidad de predecir la palabra correcta:

\[\mathcal{L} = -\sum_{t=1}^{T} \log P(w_t \mid w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c})\]

En palabras simples

  • Para cada posición \(t\) en el corpus
  • El modelo ve las \(2c\) palabras alrededor
  • Intenta predecir la palabra del centro
  • Se ajustan los pesos para minimizar el error

Analogía

Es como un examen de comprensión lectora:

“El ____ come pescado fresco”

El modelo aprende que “gato”, “perro”, “niño” son buenas respuestas, pero “mesa” o “rápido” no. 📝

Bloque 5: Skip-gram

Arquitectura Skip-gram

Objetivo: Predecir las palabras del contexto dada la palabra central.

Es exactamente lo opuesto de CBOW:

Code
flowchart LR
    subgraph Entrada ["Palabra Central"]
        center["come"]
    end

    subgraph Proyección ["Embedding"]
        emb["v_come ∈ ℝ^d"]
    end

    subgraph Salida ["Predicciones de Contexto"]
        p1["P(El | come)"]
        p2["P(gato | come)"]
        p3["P(pescado | come)"]
        p4["P(fresco | come)"]
    end

    center --> emb
    emb --> p1
    emb --> p2
    emb --> p3
    emb --> p4

flowchart LR
    subgraph Entrada ["Palabra Central"]
        center["come"]
    end

    subgraph Proyección ["Embedding"]
        emb["v_come ∈ ℝ^d"]
    end

    subgraph Salida ["Predicciones de Contexto"]
        p1["P(El | come)"]
        p2["P(gato | come)"]
        p3["P(pescado | come)"]
        p4["P(fresco | come)"]
    end

    center --> emb
    emb --> p1
    emb --> p2
    emb --> p3
    emb --> p4

Skip-gram: Paso a Paso

1. Buscar embedding

La palabra central se convierte en un vector:

\[\vec{v}_{\text{come}} \in \mathbb{R}^d\]

2. Calcular scores para CADA palabra del vocabulario

\[\vec{z} = W'^T \vec{v}_{\text{come}}\]

3. Softmax (para cada palabra de contexto)

\[P(w_c \mid w_t) = \frac{e^{\vec{u}_{w_c}^T \vec{v}_{w_t}}}{\sum_{j=1}^{|V|} e^{\vec{u}_j^T \vec{v}_{w_t}}}\]

donde \(\vec{u}_{w_c}\) es el vector de la palabra de contexto en la matriz \(W'\).

Función de pérdida Skip-gram

\[\mathcal{L} = -\sum_{t=1}^{T} \sum_{\substack{-c \leq j \leq c \\ j \neq 0}} \log P(w_{t+j} \mid w_t)\]

CBOW vs. Skip-gram

CBOW

Aspecto Detalle
Entrada Contexto (múltiples palabras)
Salida Palabra central (1 palabra)
Velocidad Más rápido ⚡
Datos escasos Peor rendimiento
Mejor para Corpus grandes, palabras frecuentes

Skip-gram

Aspecto Detalle
Entrada Palabra central (1 palabra)
Salida Contexto (múltiples palabras)
Velocidad Más lento 🐢
Datos escasos Mejor rendimiento ✅
Mejor para Corpus pequeños, palabras raras

En la práctica

Skip-gram con Negative Sampling (SGNS) es la configuración más popular y la que usaremos. Funciona bien incluso con corpus moderados.

Bloque 6: El Problema del Softmax

¿Por Qué el Softmax es Costoso?

Recordemos la fórmula del softmax:

\[P(w_c \mid w_t) = \frac{e^{\vec{u}_{w_c}^T \vec{v}_{w_t}}}{\sum_{j=1}^{|V|} e^{\vec{u}_j^T \vec{v}_{w_t}}}\]

El problema

El denominador requiere sumar sobre todas las palabras del vocabulario:

\[\sum_{j=1}^{|V|} e^{\vec{u}_j^T \vec{v}_{w_t}}\]

Si \(|V| = 100{,}000\), ¡cada predicción requiere 100,000 multiplicaciones!

Costo computacional

\(|V|\) Operaciones/predicción
10,000 10K
100,000 100K
1,000,000 1M 😱

Esto hace el entrenamiento prohibitivamente lento.

Necesitamos una solución más eficiente

¿Podemos evitar calcular el softmax completo? → ¡Sí! Negative Sampling

Negative Sampling (Muestreo Negativo)

Idea: En vez de un problema de clasificación sobre \(|V|\) clases, convertirlo en varios problemas de clasificación binaria.

El truco

Para cada par (palabra central, palabra de contexto):

  1. Ejemplo positivo: el par real del corpus → etiqueta = 1
  2. Ejemplos negativos: muestrear \(k\) palabras aleatorias del vocabulario → etiqueta = 0

Ejemplo con \(k = 3\)

Palabra central: “come”, contexto: “gato”

Par Etiqueta
(come, gato) ✅ 1 (positivo)
(come, constitución) ❌ 0 (negativo)
(come, rápido) ❌ 0 (negativo)
(come, Bolivia) ❌ 0 (negativo)

Negative Sampling: La Matemática

Nuevo objetivo

En vez de softmax, usamos regresión logística (sigmoide):

. . .

\[\mathcal{L} = -\left[\log \sigma(\vec{u}_{w_c}^T \vec{v}_{w_t}) + \sum_{i=1}^{k} \log \sigma(-\vec{u}_{w_i}^T \vec{v}_{w_t})\right]\]

donde \(\sigma(x) = \frac{1}{1 + e^{-x}}\) es la función sigmoide.

. . .

Primer término (positivo)

\[\log \sigma(\vec{u}_{w_c}^T \vec{v}_{w_t})\]

“Haz que el producto punto entre la palabra central y la de contexto sea grande

Segundo término (negativos)

\[\sum_{i=1}^{k} \log \sigma(-\vec{u}_{w_i}^T \vec{v}_{w_t})\]

“Haz que el producto punto entre la palabra central y las palabras aleatorias sea pequeño

Complejidad

Softmax: \(O(|V|)\) por predicción → Neg. Sampling: \(O(k)\) por predicción, donde \(k \sim 5{-}15\). ¡Reducción masiva! 🚀

¿Cómo se Muestrean los Negativos?

No se muestrean uniformemente. Se usa una distribución basada en la frecuencia de cada palabra:

\[P_{\text{neg}}(w) = \frac{f(w)^{3/4}}{\sum_{j=1}^{|V|} f(w_j)^{3/4}}\]

¿Por qué el exponente \(3/4\)?

  • \(f(w)^1\): favorece demasiado las palabras frecuentes
  • \(f(w)^0 = 1\): muestreo uniforme (ignora frecuencia)
  • \(f(w)^{3/4}\): punto medio — las palabras raras se muestrean más que con la distribución original, pero no tanto como con muestreo uniforme

Ejemplo

Palabra \(f(w)\) \(f(w)^{3/4}\)
“el” 0.05 0.030
“gato” 0.001 0.0018
“quasar” 0.00001 0.00006

Sin \(3/4\): “el” es 5000x más probable que “quasar”

Con \(3/4\): “el” es solo 500x más probable

Bloque 7: Propiedades Mágicas de los Embeddings

Aritmética de Palabras

Una de las propiedades más sorprendentes de Word2Vec:

\[\vec{v}_{\text{rey}} - \vec{v}_{\text{hombre}} + \vec{v}_{\text{mujer}} \approx \vec{v}_{\text{reina}}\]

Más ejemplos

Operación Resultado
París - Francia + España ≈ Madrid
grande - bueno + malo ≈ terrible
caminar - caminó + corrió ≈ correr
hermano - hombre + mujer ≈ hermana

¿Por qué funciona?

Los embeddings capturan relaciones lineales:

\[\vec{v}_{\text{rey}} - \vec{v}_{\text{reina}} \approx \vec{v}_{\text{hombre}} - \vec{v}_{\text{mujer}}\]

Esta diferencia codifica el concepto de “género” como una dirección en el espacio vectorial.

Formalización

La operación se realiza como: encontrar la palabra \(w^*\) tal que: \[w^* = \arg\max_{w \in V} \text{cos\_sim}(\vec{v}_w, \vec{v}_{\text{rey}} - \vec{v}_{\text{hombre}} + \vec{v}_{\text{mujer}})\]

Similitud entre Palabras

La similitud coseno entre vectores captura relaciones semánticas:

\[\text{cos\_sim}(\vec{a}, \vec{b}) = \frac{\vec{a} \cdot \vec{b}}{||\vec{a}|| \cdot ||\vec{b}||}\]

Similitudes altas

Par Similitud
(gato, perro) ~0.76
(rey, reina) ~0.73
(Madrid, España) ~0.68
(bueno, excelente) ~0.72

Similitudes bajas

Par Similitud
(gato, democracia) ~0.05
(rey, banana) ~0.02
(Madrid, correr) ~0.08
(bueno, mesa) ~0.11

¿Por qué coseno y no distancia euclidiana?

La similitud coseno mide el ángulo entre vectores, ignorando la magnitud. Es más robusta porque vectores de palabras frecuentes tienden a tener mayor norma.

¿Qué Capturan las Dimensiones?

Cada dimensión del embedding captura un aspecto semántico latente:

Dimensiones interpretables (hipotéticas)

Dim. Concepto rey reina gato
23 Realeza 0.9 0.8 0.0
47 Género (M→F) -0.7 0.6 0.1
89 Animal 0.1 0.1 0.9
112 Tamaño 0.5 0.3 -0.3

Realidad

  • Las dimensiones no son directamente interpretables
  • Son combinaciones complejas de muchos conceptos
  • Pero las relaciones entre vectores sí capturan semántica real
  • Esto es similar a los componentes principales en PCA (¡lo veremos en S3!)

Bloque 8: Hiperparámetros de Word2Vec

Hiperparámetros Clave

Dimensión del embedding (\(d\))

Valor Uso
50-100 Tareas simples, corpus pequeños
200-300 Uso general ✅
500+ Corpus muy grandes

Tamaño de ventana (\(c\))

Valor Captura
2-5 Relaciones sintácticas (similares en gramática)
5-10 Relaciones semánticas (similares en significado)

Negative samples (\(k\))

Valor Uso
2-5 Corpus grandes
5-20 Corpus pequeños ✅

Otros

Parámetro Típico
Learning rate (\(\alpha\)) 0.025 → 0.0001
Épocas 5-15
Min count 5 (ignorar palabras con fewer occurrences)
Subsampling \(t = 10^{-5}\)

Subsampling de palabras frecuentes

Palabras como “el”, “de”, “que” no aportan mucha información contextual. Word2Vec las descarta con probabilidad \(P_{\text{discard}}(w) = 1 - \sqrt{\frac{t}{f(w)}}\).

Bloque 9: Implementación con Gensim

Entrenando Word2Vec desde Cero

from gensim.models import Word2Vec

# Corpus de ejemplo (lista de oraciones tokenizadas)
corpus = [
    ["el", "gato", "come", "pescado", "fresco"],
    ["el", "perro", "come", "carne", "roja"],
    ["mi", "gato", "duerme", "en", "el", "sofá"],
    ["mi", "perro", "duerme", "en", "la", "cama"],
    ["el", "gato", "negro", "persigue", "al", "ratón"],
    ["el", "perro", "grande", "persigue", "al", "gato"],
    ["el", "niño", "come", "una", "manzana", "roja"],
    ["la", "niña", "come", "una", "naranja", "fresca"],
    ["el", "gato", "juega", "con", "la", "pelota"],
    ["el", "perro", "juega", "con", "un", "hueso"],
    ["el", "gato", "bebe", "leche", "fresca"],
    ["el", "perro", "bebe", "agua", "fría"],
    ["un", "gato", "pequeño", "maúlla", "fuerte"],
    ["un", "perro", "pequeño", "ladra", "fuerte"],
    ["la", "niña", "acaricia", "al", "gato", "negro"],
    ["el", "niño", "acaricia", "al", "perro", "grande"],
]

# Entrenar modelo Skip-gram
modelo = Word2Vec(
    sentences=corpus,
    vector_size=50,     # Dimensión del embedding (d)
    window=3,           # Tamaño de ventana (c)
    min_count=1,        # Frecuencia mínima
    sg=1,               # 1 = Skip-gram, 0 = CBOW
    negative=5,         # Número de negative samples (k)
    epochs=200,         # Más épocas porque el corpus es pequeño
    seed=42
)

print(f"Vocabulario: {len(modelo.wv)} palabras")
print(f"Dimensión: {modelo.wv.vector_size}")
Vocabulario: 39 palabras
Dimensión: 50

Explorando los Embeddings

import numpy as np

# Vector de una palabra
vec_gato = modelo.wv["gato"]
print(f"Vector de 'gato' (primeros 10 dims):\n{vec_gato[:10].round(3)}")
print(f"Norma: {np.linalg.norm(vec_gato):.3f}")
Vector de 'gato' (primeros 10 dims):
[-0.002 -0.009 -0.009  0.025 -0.003 -0.006 -0.026  0.016 -0.016  0.004]
Norma: 0.263
# Palabras más similares
print("\nPalabras más similares a 'gato':")
for palabra, sim in modelo.wv.most_similar("gato", topn=5):
    print(f"  {palabra:15s} {sim:.4f}")

Palabras más similares a 'gato':
  perro           0.9059
  el              0.9030
  juega           0.8972
  la              0.8891
  come            0.8813

Similitud entre Pares

# Pares de comparación
pares = [
    ("gato", "perro"),
    ("niño", "niña"),
    ("come", "bebe"),
    ("gato", "come"),
    ("grande", "pequeño"),
]

print("Similitud coseno entre pares:")
print("-" * 40)
for w1, w2 in pares:
    sim = modelo.wv.similarity(w1, w2)
    barra = "█" * int(abs(sim) * 20)
    print(f"  ({w1:10s}, {w2:10s}): {sim:+.4f} {barra}")
Similitud coseno entre pares:
----------------------------------------
  (gato      , perro     ): +0.9059 ██████████████████
  (niño      , niña      ): +0.7226 ██████████████
  (come      , bebe      ): +0.7876 ███████████████
  (gato      , come      ): +0.8813 █████████████████
  (grande    , pequeño   ): +0.4129 ████████

Observación

Con un corpus tan pequeño los resultados no serán perfectos, pero ya se empiezan a ver patrones: “gato” y “perro” deberían tener similitud alta por sus contextos compartidos.

Aritmética de Vectores

# Analogía: niño - niña + gato ≈ ?
try:
    resultado = modelo.wv.most_similar(
        positive=["niño", "gato"],
        negative=["niña"],
        topn=3
    )
    print("niño - niña + gato ≈ ?")
    for palabra, sim in resultado:
        print(f"  {palabra:15s} {sim:.4f}")
except KeyError as e:
    print(f"Palabra no encontrada: {e}")

print()

# Palabra que no encaja
try:
    raro = modelo.wv.doesnt_match(["gato", "perro", "manzana"])
    print(f"¿Cuál no encaja en [gato, perro, manzana]? → '{raro}'")
except Exception:
    print("Vocabulario insuficiente para doesnt_match")
niño - niña + gato ≈ ?
  el              0.7896
  la              0.7587
  perro           0.7540

¿Cuál no encaja en [gato, perro, manzana]? → 'manzana'

Usando Embeddings Pre-entrenados

En la práctica, es común usar embeddings pre-entrenados en corpus muy grandes:

import gensim.downloader as api

# Descargar Word2Vec pre-entrenado en Google News (1.5GB)
# ¡Esto toma varios minutos y mucha RAM!
modelo_google = api.load("word2vec-google-news-300")

# Ahora sí vemos la magia
print(modelo_google.most_similar("king"))
# [('kings', 0.71), ('queen', 0.65), ('prince', 0.63), ...]

# Analogía: king - man + woman ≈ queen
resultado = modelo_google.most_similar(
    positive=["king", "woman"],
    negative=["man"],
    topn=1
)
print(resultado)  # [('queen', 0.71)]

Modelos pre-entrenados disponibles en Gensim

  • word2vec-google-news-300: 3M palabras, 300 dims (inglés)
  • glove-wiki-gigaword-100: 400K palabras, 100 dims (inglés)
  • fasttext-wiki-news-subwords-300: 1M palabras, 300 dims (inglés)

Para español: modelos de la SBWCE o de FastText.

Bloque 10: Resumen y Conexiones

El Panorama Completo

Lo que aprendimos hoy

  1. Hipótesis distribucional: el significado viene del contexto
  2. CBOW: contexto → palabra central
  3. Skip-gram: palabra central → contexto
  4. Negative Sampling: eficiencia computacional
  5. Propiedades: analogías, similitud, clustering

Mapa del viaje

Semana Representación Tipo
1-2 One-hot, BoW, TF-IDF Disperso
4 Word2Vec Denso
4 (S2) GloVe, FastText Denso
4 (S3) Visualización (t-SNE, PCA)

Próxima sesión: GloVe y FastText

  • GloVe: Combina lo mejor de la factorización de matrices y Word2Vec
  • FastText: Resuelve el problema de palabras fuera del vocabulario (OOV) usando subpalabras

Resumen de Fórmulas Clave

Concepto Fórmula
Softmax \(P(w_c \mid w_t) = \frac{e^{\vec{u}_{w_c}^T \vec{v}_{w_t}}}{\sum_j e^{\vec{u}_j^T \vec{v}_{w_t}}}\)
Negative Sampling \(\mathcal{L} = -\log \sigma(\vec{u}_{w_c}^T \vec{v}_{w_t}) - \sum_{i=1}^{k} \log \sigma(-\vec{u}_{w_i}^T \vec{v}_{w_t})\)
Muestreo negativo \(P_{\text{neg}}(w) = \frac{f(w)^{3/4}}{\sum_j f(w_j)^{3/4}}\)
Similitud coseno \(\text{cos\_sim}(\vec{a}, \vec{b}) = \frac{\vec{a} \cdot \vec{b}}{||\vec{a}|| \cdot ||\vec{b}||}\)
Analogía \(w^* = \arg\max_w \cos(\vec{v}_w, \vec{v}_a - \vec{v}_b + \vec{v}_c)\)
Subsampling \(P_{\text{discard}}(w) = 1 - \sqrt{\frac{t}{f(w)}}\)

Para Reflexionar 🤔

Ventajas de Word2Vec

  • ✅ Captura similitud semántica
  • ✅ Relaciones lineales (analogías)
  • ✅ Dimensión controlable
  • ✅ Entrenamiento eficiente
  • ✅ Transferible a otras tareas

Limitaciones

  • Un vector por palabra: “banco” (financiero) = “banco” (mueble)
  • ❌ No captura el orden de las palabras
  • ❌ Ventana de contexto fija
  • ❌ Palabras OOV (fuera del vocabulario)
  • ❌ Puede codificar sesgos sociales

Sesgo en Word Embeddings

Word2Vec entrenado en texto de internet puede aprender: \(\vec{v}_{\text{doctor}} - \vec{v}_{\text{hombre}} + \vec{v}_{\text{mujer}} \approx \vec{v}_{\text{enfermera}}\). Esto refleja sesgos de los datos, no la realidad. Lo exploraremos en Semana 18 (Ética en NLP).

Lecturas Recomendadas

Papers originales

  1. Mikolov et al. (2013). Efficient Estimation of Word Representations in Vector Space. arXiv:1301.3781

  2. Mikolov et al. (2013). Distributed Representations of Words and Phrases and their Compositionality. NIPS 2013

Recursos adicionales

  1. Jurafsky & Martin, Ch. 6Vector Semantics and Embeddings

  2. Jay Alammar: The Illustrated Word2Vec — Excelente visualización interactiva

  3. Gensim Word2Vec Tutorial