Similarita / app.py
phalanx80's picture
Update app.py
3941c61 verified
import json
import numpy as np
import gradio as gr
# Funzione per calcolare la distanza coseno
def cosine_similarity(vec_a, vec_b):
dot_product = np.dot(vec_a, vec_b)
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
return dot_product / (norm_a * norm_b)
# Carica gli embeddings dal file JSON
def load_embeddings(file_path):
try:
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data
except UnicodeDecodeError as e:
return f"Errore di codifica: {e}"
except json.JSONDecodeError as e:
return f"Errore di parsing JSON: {e}"
except Exception as e:
return f"Errore: {e}"
# Trova gli articoli simili e gli articoli più distanti
def find_similar_articles(input_title, embeddings_data, top_n=5, bottom_n=3):
input_embedding = None
for article in embeddings_data:
if article['titolo_articolo'] == input_title:
input_embedding = article['embedding']
break
if input_embedding is None:
return f"Articolo '{input_title}' non trovato."
similarities = []
for article in embeddings_data:
if article['titolo_articolo'] != input_title:
similarity = cosine_similarity(input_embedding, article['embedding'])
similarities.append((article['titolo_articolo'], similarity))
# Ordina per somiglianza decrescente
similarities.sort(key=lambda x: x[1], reverse=True)
# Trova gli articoli con somiglianza minima
least_similar_articles = similarities[-bottom_n:]
return similarities[:top_n], least_similar_articles
# Funzione principale per Gradio
def search_articles(input_title):
similar_articles, least_similar_articles = find_similar_articles(input_title, embeddings_data)
return similar_articles, least_similar_articles # Lista con 3 articoli meno simili
# Autocompletamento dei titoli
def get_titles(embeddings_data):
return [article['titolo_articolo'] for article in embeddings_data]
# Carica gli embeddings
file_path = 'embedded_articles.json' # Percorso del tuo file JSON
embeddings_data = load_embeddings(file_path)
# Controlla se ci sono errori nel caricamento
if isinstance(embeddings_data, str): # Se è un messaggio di errore
print(embeddings_data)
else:
# Configura l'interfaccia Gradio con autocompletamento
title_choices = get_titles(embeddings_data) # Ottieni i titoli
custom_css = """
.button-info {
background: burlywood !important;
color: black;
}
"""
with gr.Blocks(css=custom_css) as demo:
gr.Markdown("# Ricerca Articoli Simili")
gr.Markdown("Seleziona il titolo di un articolo per trovare articoli semanticamente simili e i più distanti.")
# Aggiungi la riga per l'input
input_title = gr.Dropdown(label="Titolo dell'articolo", choices=title_choices, type="value")
# Pulsanti Submit e Clear con classe CSS personalizzata
with gr.Row():
submit_btn = gr.Button("Submit", elem_classes="button-info") # Applica la classe CSS
clear_btn = gr.Button("Clear")
# Tabelle per articoli simili e meno simili con intestazioni personalizzate
similar_output = gr.Dataframe(label="Articoli più simili (Top 5)", headers=["Titolo", "Punteggio similarità"])
least_similar_output = gr.Dataframe(label="Articoli meno simili (Top 3)", headers=["Titolo", "Punteggio similarità"])
# Collega i pulsanti alle funzioni
submit_btn.click(search_articles, inputs=input_title, outputs=[similar_output, least_similar_output])
clear_btn.click(lambda: ("", ""), None, [similar_output, least_similar_output])
demo.launch(share=True)