Similitud de coseno para recomendación de texto

Representa las oraciones mediante vectores de bolsa de palabras, calcula la similitud de coseno y encuentra la oración más similar.

Al completar este caso, comprenderás:La base matemática de los sistemas de búsqueda y recomendación: el producto punto mide la «misma dirección» y la norma se usa para normalizar.


Introducción desde la vida cotidiana

Buscar «auriculares Bluetooth» en Taobao

Escribes «auriculares Bluetooth» y Taobao encuentra al instante los más relevantes entre millones de productos. No ordena según si el título contiene o no palabras que coincidan exactamente, sino que convierte cada título de producto en una serie de números (un vector) y luego compara si la «dirección» de tu término de búsqueda y la de cada título son consistentes.

Cuanto más cercanas sean las direcciones, más similares serán los significados. Que el título sea largo o corto no afecta el juicio: esto esla similitud de cosenola intuición.


Comprensión intuitiva

Imagina dos flechas disparadas por dos arcos. Cuanto más alineadas estén las direcciones de las dos flechas, más cercano a 1 será el coseno del ángulo; si las dos flechas son perpendiculares, el coseno es 0; si las dos flechas van en direcciones opuestas, el coseno es -1.

~ 1
Misma dirección
Dos oraciones con el mismo significado
~ 0
Perpendiculares entre sí
Dos oraciones sin relación alguna
~ -1
Direcciones opuestas
Poco común en el modelo de bolsa de palabras

La cuestión clave es: ¿cómo convertir un fragmento de texto en una flecha? Para ello, es necesario introducir el modelo de bolsa de palabras.


Definición matemática

Fórmula de la similitud de coseno

\[ \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|} = \frac{\sum_{i=1}^{n} a_i \cdot b_i}{\sqrt{\sum a_i^2} \cdot \sqrt{\sum b_i^2}} \]

El numerador es el producto punto (mide el grado en que dos vectores apuntan en la «misma dirección»), y el denominador es el producto de las dos normas (elimina la influencia de la longitud del vector).

Modelo de bolsa de palabras (Bag of Words)

Método para convertir una oración en un vector:

  1. Definir un vocabulario (todas las palabras posibles)
  2. Para cada oración, si una palabra aparece, se marca como 1; si no aparece, se marca como 0
  3. Se obtiene un vector cuya longitud es igual al tamaño del vocabulario

Aquí se usa la versión más simplificada de «presencia o ausencia» (bolsa de palabras one-hot). En aplicaciones reales, se suele sustituir por TF-IDF o incrustaciones de palabras (Word Embedding). Pero la idea central es la misma: convertir el texto en vectores que puedan participar en operaciones matemáticas.


Práctica con Python

Construye vectores de bolsa de palabras con 5 oraciones en chino, calcula la similitud de coseno con la oración de consulta y encuentra la oración más similar.

Ejemplo

import numpy as np

# 1. Preparar el corpus: 5 oraciones en chino, que incluyen dos tipos de temas: aprendizaje de IA y vida cotidiana
sentences = [
    "Me gusta usar python para estudiar aprendizaje automático",
    "python es una buena herramienta para aprender inteligencia artificial",
    "Hoy hace muy buen tiempo, perfecto para salir a caminar",
    El aprendizaje profundo requiere grandes cantidades de datos y potencia de cálculo.,
    "Caminar es una excelente forma de relajarse",
]

# 2. Construir el vocabulario (versión simplificada para enseñanza: definir manualmente las palabras posibles)
vocab_words = ["yo", "Me gusta", "usar", "python", "Aprender", "Aprendizaje automático", "ser",
               "Inteligencia artificial", "bueno", "Herramientas", "Hoy", "Clima", "muy", "Adecuado",
               "Salir", "Pasear", "Aprendizaje profundo", "Necesitar", "Gran cantidad", "de", "Datos",
               "Potencia de cálculo", "Un tipo", "Relajarse", "Manera"]

def to_vector(sentence, vocab):
    """Convierte las oraciones en vectores de bolsa de palabras: las palabras que aparecen se marcan como 1"""
    vec = np.zeros(len(vocab))
    for i, w in enumerate(vocab):
        if w in sentence:
            vec[i] = 1  # si la palabra aparece, se marca como 1
    return vec

# 5 oraciones → 5 vectores
vectors = np.array([to_vector(s, vocab_words) for s in sentences])
print("EJEMPLO Dimensión del vector de cada oración:", vectors.shape[1],
      "(tamaño del vocabulario)")

# 3. Escribir manualmente la función de similitud de coseno (sin usar sklearn)
def cosine_similarity(a, b):
    dot = np.dot(a, b)             # producto punto
    norm_a = np.linalg.norm(a)     # norma de a
    norm_b = np.linalg.norm(b)     # norma de b
    if norm_a == 0 or norm_b == 0:
        return 0.0                 # el vector cero no tiene dirección
    return dot / (norm_a * norm_b)

# 4. Dada una oración de consulta, encontrar la oración más similar
query = "Estoy aprendiendo Python e inteligencia artificial"
query_vec = to_vector(query, vocab_words)

sims = [cosine_similarity(query_vec, v) for v in vectors]

print(f"\nEJEMPLO Oración de consulta: {query!r}\n")
for s, sim in sorted(zip(sentences, sims),
                     key=lambda x: -x[1]):
    print(f" Similitud {sim:.3f} <- {s}")

# 5. Verificación: la similitud de oraciones no relacionadas es 0
print("\nEJEMPLO Verificación: dos oraciones completamente no relacionadas")
v1 = to_vector("python aprendizaje automático", vocab_words)
v2 = to_vector("Caminar para relajarse", vocab_words)
print(f'aprendizaje automático de python' vs 'caminar y relajarse':
      f"cos = {cosine_similarity(v1, v2):.3f}")
EJEMPLO 每句话的向量维度: 25 (词表大小)

EJEMPLO 查询句子: '我在学习python和人工智能'

  相似度 0.577  <-  python是学习人工智能的好工具
  相似度 0.500  <-  我喜欢用python学习机器学习
  相似度 0.000  <-  今天天气很好适合出去散步
  相似度 0.000  <-  深度学习需要大量的数据和算力
  相似度 0.000  <-  散步是一种很好的放松方式

EJEMPLO 验证:两个完全不相关的句子
  'python机器学习' vs '散步放松': cos = 0.000

El resultado es muy intuitivo: las oraciones que contienen las mismas palabras clave tienen una similitud alta, mientras que las oraciones completamente no relacionadas tienen una similitud de 0.


Escenarios de aplicación en IA

Escenario de IACómo usar la similitud de coseno
Motor de búsquedaConvierte el término de búsqueda y los documentos en vectores, y ordena y devuelve los resultados según la similitud de coseno.
Sistema de recomendaciónEncuentra los productos más similares al vector de comportamiento histórico del usuario.
Búsqueda semánticaUtiliza incrustaciones de palabras (Word2Vec/BERT) para vectorizar y capturar sinónimos: «auriculares Bluetooth» y «auriculares inalámbricos» también coincidirán.
Reconocimiento facialCodifica las imágenes de rostros como vectores (Face Embedding) y compara la similitud de coseno de dos rostros para determinar si son la misma persona.
Recuperación RAGEn aplicaciones de modelos grandes, se utiliza la similitud de coseno para recuperar los fragmentos de documento más relevantes de la base de conocimiento.

En el «mecanismo de atención» utilizado en modelos grandes como GPT, el producto punto de Q y K (QK^T) también calcula esencialmente la similitud: la similitud de coseno omite la normalización de la norma del denominador.

Otras extensiones