#
#   python_llm_similitud_frases.py
#
#    Calcula la similitud en porcentaje entre 2 frases usando Similitud Coseno y Word Embeddings con un LLM
#       (se requiere instalar "Ollama" y el modelo "bge-m3")
#
#   Rogelio Ferreira Escutia - 1/septiembre/2026
#

# Bibliotecas utilizadas y que se requieren instalar
import ollama
import numpy as np

# LLM a utilizar con Ollama (debe estar instalado Ollama y el modelo ´bge-m3´)
model_name = "bge-m3"

# Calcula la similitud en porcentaje entre 2 frases
def calcular_similitud(frase_1: str, frase_2: str):
    # Convertir las frases a minúsculas
    frase_1 = frase_1.lower()
    frase_2 = frase_2.lower()
    # Generando los Words Embeddings
    word_embedding_1 = ollama.embed(model=model_name, input=frase_1)
    word_embedding_2 = ollama.embed(model=model_name, input=frase_2)
    # Creando los vectores
    vector_1 = np.array(word_embedding_1["embeddings"][0])
    vector_2 = np.array(word_embedding_2["embeddings"][0])
    # Cálculo de la Similitud Coseno: (A · B) / (||A|| * ||B||)
    producto_punto = np.dot(vector_1, vector_2)
    normal_vector_1 = np.linalg.norm(vector_1)
    normal_vector_2 = np.linalg.norm(vector_2)
    if normal_vector_1 == 0 or normal_vector_2 == 0:
        return 0.0
    similitud = producto_punto / (normal_vector_1 * normal_vector_2)
    # Convertir el resultado en una escala de porcentaje (0.0% a 100.0%)
    porcentaje_similitud = max(0.0, float(similitud)) * 100
    return round(porcentaje_similitud, 2)

if __name__ == "__main__":
    frase_1 = "El cielo es azul"
    frase_2 = "El cielo está tan azul"
    print("\n*** Calcula la similitud en porcentaje entre 2 frases ***\n")
    print(f"Frase 1: {frase_1}")
    print(f"Frase 2: {frase_2}")
    similitud = calcular_similitud(frase_1, frase_2)
    print(f"\nLa similitud es: {similitud}%\n")