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.
Dos oraciones con el mismo significado
Dos oraciones sin relación alguna
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:
- Definir un vocabulario (todas las palabras posibles)
- Para cada oración, si una palabra aparece, se marca como 1; si no aparece, se marca como 0
- 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
# 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 IA | Cómo usar la similitud de coseno |
|---|---|
| Motor de búsqueda | Convierte 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ón | Encuentra los productos más similares al vector de comportamiento histórico del usuario. |
| Búsqueda semántica | Utiliza incrustaciones de palabras (Word2Vec/BERT) para vectorizar y capturar sinónimos: «auriculares Bluetooth» y «auriculares inalámbricos» también coincidirán. |
| Reconocimiento facial | Codifica 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 RAG | En aplicaciones de modelos grandes, se utiliza la similitud de coseno para recuperar los fragmentos de documento más relevantes de la base de conocimiento. |
Otras extensionesEn 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.