Similitud coseno con vectores de palabras

Resumen

El producto punto es la operación matemática que permite a la inteligencia artificial entender qué tan alineados están dos vectores, y con ello, qué tan similares son dos conceptos. Si trabajas con machine learning, sistemas de recomendación o procesamiento de lenguaje natural, dominar esta operación junto con la similitud coseno es indispensable para medir afinidad entre datos.

¿Para qué sirve el producto punto en machine learning?

La norma de un vector te dice su longitud, pero no su dirección. Y en IA, la dirección lo es todo: revela si dos vectores apuntan hacia los mismos intereses, significados o categorías.

El producto punto aparece en tres escenarios que usas a diario sin notarlo [00:30]:

  • Sistemas de recomendación: cuando Netflix te sugiere una serie, calcula el producto punto entre el vector de tu perfil y el vector de la serie. El resultado es un score de afinidad.
  • Búsqueda semántica: al escribir “comida saludable” en Google, el motor compara vectores de frases mediante producto punto para medir relevancia semántica, no coincidencia exacta de palabras.
  • Modelos de lenguaje como ChatGPT: el mecanismo de atención usa producto punto miles de veces por segundo para decidir a qué palabras prestar más importancia al generar la siguiente.

Hay una regla técnica que no puedes saltarte: ambos vectores deben tener el mismo número de componentes. Por eso conviene verificar siempre con la propiedad shape de NumPy [01:30].

¿Qué es el producto punto entre dos vectores? Es una operación que multiplica componente a componente dos vectores del mismo tamaño y suma los resultados. Devuelve un único número que indica qué tan alineados están.

¿Cómo se calcula el producto punto en NumPy?

En NumPy tienes dos formas equivalentes de calcularlo. La primera usa el método clásico np.dot, y la segunda emplea el operador @, que es la sintaxis más actual y recomendada [02:30].

python import numpy as np

u = np.array([2, 3]) v = np.array([4, 1])

Forma clásica

producto_np = np.dot(u, v) print(f"Resultado con np.dot: {producto_np}")

Forma actual con el operador @

producto_actual = u @ v print(f"Resultado con @: {producto_actual}")

El resultado es 11. Pero aquí surge la pregunta clave: ¿11 es mucho o poco? ¿Un producto punto de 5000 sería mejor? La respuesta depende de la magnitud de los vectores, y por eso necesitas una métrica normalizada.

¿Qué es la similitud coseno y por qué se usa?

La similitud coseno nace de despejar el coseno del ángulo entre dos vectores en la fórmula geométrica del producto punto [04:00]:

$$\cos(\theta) = \frac{u \cdot v}{|u| \cdot |v|}$$

Es el producto punto dividido entre las normas de ambos vectores. El resultado siempre vive entre -1 y 1, lo que la convierte en la métrica más importante para procesamiento de lenguaje natural y recomendadores.

¿Por qué coseno y no seno?

La elección no es estética, es matemática. El coseno se alinea con la intuición humana de similitud [05:30]:

  • Vectores alineados (0°): cos(0) = 1, máxima similitud.
  • Vectores ortogonales (90°): cos(90) = 0, ninguna relación.
  • Vectores opuestos (180°): cos(180) = -1, máxima oposición.

El seno fallaría: daría cero tanto a 0° como a 180°, igualando vectores idénticos con vectores opuestos. No tiene sentido como métrica de afinidad.

¿Qué significa que dos vectores sean ortogonales? Que su producto punto es cero y forman un ángulo de 90°. En IA esto se interpreta como ausencia total de similitud entre dos conceptos.

¿Cómo medir similitud entre palabras con vectores preentrenados?

Para llevarlo al mundo real, puedes usar Gensim, una librería de procesamiento de lenguaje natural que permite descargar vectores de palabras ya preentrenados [07:00]. El modelo glove-wiki-gigaword-50 es ligero y contiene una enorme cantidad de palabras representadas como vectores.

python !pip install gensim

import gensim.downloader as api

print("Descargando modelo de vectores de palabras") word_vectors = api.load("glove-wiki-gigaword-50") print("Modelo cargado")

Cada palabra del modelo es una clave en un diccionario cuyos valores son vectores. Así puedes extraer vectores para king, man, queen y cat, y compararlos.

python rey = word_vectors["king"] hombre = word_vectors["man"] reina = word_vectors["queen"] gato = word_vectors["cat"]

def similitud_coseno(v1, v2): return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

sim_rey_hombre = similitud_coseno(rey, hombre) sim_rey_reina = similitud_coseno(rey, reina) sim_rey_gato = similitud_coseno(rey, gato)

¿Qué revelan los resultados?

Al imprimir las similitudes con dos decimales, descubres algo poderoso [10:30]:

  • Rey y reina: similitud alta, porque comparten contexto semántico de realeza.
  • Rey y hombre: similitud también alta, por la relación de género y figura humana.
  • Rey y gato: apenas 0.39, una similitud baja que tiene todo el sentido.

Estos vectores fueron creados durante el preentrenamiento del modelo a partir de millones de textos. Tú solo te ocupas de la geometría: mientras más cerca de 1, mayor afinidad entre las palabras.

Ejercicio para practicar

Crea vectores de tres componentes que representen tus intereses en tecnología, arte y deportes. Pide a un amigo o familiar que haga lo mismo. Calcula la similitud coseno entre ambos vectores y responde: ¿qué tan alineados están sus intereses?

Comparte tu resultado en los comentarios y cuéntame qué descubriste sobre la afinidad medida con álgebra lineal.