|
|
|
import os |
|
os.system("pip install gradio sentence-transformers pandas numpy scipy chromadb") |
|
|
|
|
|
from sentence_transformers import SentenceTransformer |
|
import pandas as pd |
|
import chromadb |
|
from chromadb.utils import embedding_functions |
|
from datetime import datetime |
|
import gradio as gr |
|
|
|
|
|
EMBEDDING_LLM = "jinaai/jina-embeddings-v2-base-es" |
|
|
|
|
|
model = SentenceTransformer( |
|
EMBEDDING_LLM, |
|
trust_remote_code=True, |
|
) |
|
|
|
|
|
file_path = './Diagrama_de_decisi贸n completo.tsv' |
|
|
|
|
|
df = pd.read_csv( |
|
file_path, |
|
encoding='utf-8', |
|
sep='|' |
|
) |
|
df['ID'].astype(str).tolist() |
|
|
|
|
|
df['text'] = df.apply( |
|
lambda x: f"Tr谩mite: {x['Tr谩mite']}; Descripci贸n: {x['Descripci贸n']}; Palabras clave: {x['Tag (palabras clave)']}", |
|
axis=1 |
|
) |
|
|
|
|
|
df['embeddings'] = model.encode(df['text'], batch_size=64, show_progress_bar=True).tolist() |
|
|
|
|
|
client_persistent = chromadb.PersistentClient(path='./data_embeddings') |
|
embedding_function = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=EMBEDDING_LLM) |
|
|
|
|
|
db = client_persistent.get_or_create_collection( |
|
name='diagrama_decision_db', |
|
embedding_function=embedding_function, |
|
metadata={ |
|
'description': 'Tr谩mites y servicios - Centro de Atenci贸n para el Bienestar', |
|
'created': str(datetime.now()), |
|
'hnsw:construction_ef': 120, |
|
'hnsw:search_ef': 120, |
|
'hnsw:M': 5 |
|
} |
|
) |
|
|
|
|
|
db.add( |
|
ids=df['ID'].astype(str).tolist(), |
|
embeddings=df['embeddings'].tolist(), |
|
documents=df['text'].tolist(), |
|
metadatas=df[['Tr谩mite', 'Descripci贸n', 'Tag (palabras clave)']].to_dict('records') |
|
) |
|
|
|
print(f"N煤mero de registros en la colecci贸n: {db.count()}") |
|
|
|
|
|
def obtener_recomendaciones(preferencias, top_k=5): |
|
|
|
consulta_embedding = model.encode(preferencias, show_progress_bar=False) |
|
|
|
|
|
results = db.query(query_embeddings=[consulta_embedding], n_results=top_k) |
|
|
|
|
|
if not results or not results["metadatas"] or not results["metadatas"][0]: |
|
return [] |
|
|
|
recomendaciones = [] |
|
for idx, metadata in enumerate(results["metadatas"][0]): |
|
dist = results["distances"][0][idx] |
|
metadata['distancia_euclidiana'] = dist |
|
recomendaciones.append(metadata) |
|
|
|
return recomendaciones |
|
|
|
|
|
def procesar_recomendaciones(preferencias): |
|
recomendaciones = obtener_recomendaciones(preferencias) |
|
|
|
if not recomendaciones: |
|
return pd.DataFrame([{"Mensaje": "No se encontraron resultados para las preferencias proporcionadas."}]) |
|
|
|
|
|
resultados = [] |
|
for idx, tramite in enumerate(recomendaciones, 1): |
|
resultados.append({ |
|
"#": idx, |
|
"Tr谩mite": tramite.get('Tr谩mite', 'Desconocido'), |
|
"Descripci贸n": tramite.get('Descripci贸n', 'No disponible'), |
|
"Palabras clave": tramite.get('Tag (palabras clave)', 'No disponible'), |
|
"Distancia Euclidiana": tramite.get('distancia_euclidiana', 'N/A') |
|
}) |
|
|
|
|
|
return pd.DataFrame(resultados) |
|
|
|
|
|
def interfaz(preferencias): |
|
tabla_resultados = procesar_recomendaciones(preferencias) |
|
return tabla_resultados |
|
|
|
ui = gr.Interface( |
|
fn=interfaz, |
|
inputs=gr.Textbox(label="Preferencias", placeholder="Escribe tus preferencias, e.g., consulta de tr谩mites, palabras clave"), |
|
outputs=gr.Dataframe(label="Resultados de B煤squeda"), |
|
title="Buscador de Tr谩mites y Servicios con B煤squeda Sem谩ntica", |
|
description="Introduce tus preferencias para obtener resultados relevantes basados en similitud sem谩ntica." |
|
) |
|
|
|
|
|
ui.launch(server_name="0.0.0.0", server_port=7860) |