Cómo Implementar la Similitud del Coseno en Python

La similitud del coseno tiene varias aplicaciones en el mundo real, y al utilizar vectores de incrustación, podemos comparar significados del mundo real de manera programática. Python es uno de los lenguajes más populares para la ciencia de datos, y ofrece diversas bibliotecas para calcular la similitud del coseno con facilidad. En este artículo, discutiremos cómo puedes implementar la similitud del coseno en Python con la ayuda de las bibliotecas Scikit-Learn y NumPy

¿Qué es la Similitud del Coseno?

Similitud del coseno es una medida de similitud entre dos vectores no nulos en un espacio n-dimensional. Se utiliza en diversas aplicaciones, como el análisis de texto y los sistemas de recomendación, para determinar cuán similares son dos vectores en términos de su dirección en el espacio vectorial.

Fórmula de Similitud del Coseno

La similitud del coseno entre dos vectores, A y B, se calcula utilizando la siguiente fórmula:

Similitud del Coseno (A, B) = (A · B) / (||A|| * ||B||)

En esta fórmula, A · B representa el producto escalar de los vectores A y B. Esto se calcula multiplicando los componentes correspondientes de los dos vectores y sumando los resultados. ||A|| representa la norma euclidiana (magnitud) del vector A, que es la raíz cuadrada de la suma de los cuadrados de sus componentes. Se calcula como ||A|| = √(A₁² + A₂² + … + Aₙ²). ||B|| representa la norma euclidiana (magnitud) del vector B, calculada de la misma manera que ||A||.

Cómo Calcular la Similaridad del Coseno

Para calcular la similitud del coseno, primero completa el cálculo para el producto escalar de los dos vectores. Luego, divídelo por el producto de sus magnitudes. El valor resultante estará en el rango de -1 a 1, donde:

  • Si la similitud del coseno es 1, significa que los vectores tienen la misma dirección y son perfectamente similares.
  • Si la similitud del coseno es 0, significa que los vectores son perpendiculares entre sí y no tienen similitud.
  • Si la similitud del coseno es -1, significa que los vectores tienen direcciones opuestas y son perfectamente disimilares.

En el análisis de texto, la similitud del coseno se utiliza para medir la similitud entre vectores de documentos, donde cada documento se representa como un vector en un espacio de alta dimensión, con cada dimensión correspondiente a un término o palabra en el corpus. Al calcular la similitud del coseno entre vectores de documentos, puedes determinar qué tan similares o disímiles son dos documentos entre sí.

Bibliotecas para el Cálculo de la Similaridad del Coseno

  • NumPy: Excelente para operaciones numéricas y optimizado para velocidad.
  • scikit-learn: Ofrece varios algoritmos de aprendizaje automático y incluye un método para la similitud del coseno en su paquete de métricas.

Los siguientes son algunos ejemplos para mostrar cómo se puede calcular la similitud del coseno utilizando Python. Usaremos nuestros dos vectores de reseña de libros ahora familiares [5,3,4] y [4,2,4]. 

Python Puro

Si bien previamente calculamos esto a mano, por supuesto, ¡una computadora puede hacerlo! Así es como puedes calcular la similitud del coseno usando Python sin bibliotecas adicionales:

Python

 

A = [5, 3, 4]

B = [4, 2, 4]

# Calculate dot product

dot_product = sum(a*b for a, b in zip(A, B))

# Calculate the magnitude of each vector

magnitude_A = sum(a*a for a in A)**0.5

magnitude_B = sum(b*b for b in B)**0.5

# Compute cosine similarity

cosine_similarity = dot_product / (magnitude_A * magnitude_B)

print(f"Cosine Similarity using standard Python: {cosine_similarity}")

NumPy

Vectores de incrustación generalmente tendrán muchas dimensiones, cientos, miles, incluso millones o más. Con NumPy, puedes calcular la similitud del coseno usando operaciones de matriz, que están altamente optimizadas. 

Python

 

import numpy as np

A = np.array([5, 3, 4])

B = np.array([4, 2, 4])

dot_product = np.dot(A, B)

magnitude_A = np.linalg.norm(A)

magnitude_B = np.linalg.norm(B)

cosine_similarity = dot_product / (magnitude_A * magnitude_B)

print(f"Cosine Similarity using NumPy: {cosine_similarity}")

Scikit-Learn

La función cosine_similarity de scikit-learn facilita aún más el cálculo de operaciones de similitud del coseno altamente optimizadas:

Python

 

from sklearn.metrics.pairwise import cosine_similarity

A = np.array([[5, 3, 4]])

B = np.array([[4, 2, 4]])

cosine_similarity_result = cosine_similarity(A, B)

print(f"Cosine Similarity using scikit-learn: {cosine_similarity_result[0][0]}")

Consejos para Optimizar Cálculos de Similitud del Coseno en Python

Si vas a usar Python para calcular directamente la similitud del coseno, hay algunas cosas a considerar:

  • Utilizar bibliotecas optimizadas como NumPy o scikit-learn: Estas bibliotecas están optimizadas para el rendimiento y generalmente son más rápidas que Python puro.
  • Usar Numba:Numba es un compilador JIT de código abierto para Python y código NumPy, construido específicamente para optimizar funciones de cálculo científico.
  • Utilizar GPUs: Si tienes acceso a una GPU, utiliza librerías de Python como Tensorflow que han sido optimizadas para su uso en una GPU.
  • Paralelizar Cálculos: Si tienes las capacidades de hardware, considera paralelizar tus cálculos para acelerarlos.

Buscar Grandes Cantidades de Vectores con Búsqueda de Vectores en AstraDB

Si necesitas buscar grandes cantidades de vectores, podrías encontrar más eficiente y escalable utilizar una base de datos de vectores como la capacidad de Búsqueda de Vectores de DataStax Astra. La Búsqueda de Vectores en Astra DB ofrece una plataforma poderosa para ayudarte a ejecutar búsquedas de vectores con cálculos de similitud del coseno integrados, por lo que puedes obtener más información de tus datos.

Source:
https://dzone.com/articles/how-to-implement-cosine-similarity-in-python