Paolo De Gasperis commited on
Commit
74d73fc
·
verified ·
1 Parent(s): 8f02f98

Upload 3 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ all_embeddings.json filter=lfs diff=lfs merge=lfs -text
all_embeddings.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:24ce9e74f41760a3a19d103c233e31479828e8b5c967fa40b7baf7bf0016d6f6
3
+ size 43765340
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ numpy
2
+ gradio
sa-similar-url-mistral.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import numpy as np
3
+ import gradio as gr
4
+ import logging
5
+
6
+ # Configurazione del logging per errori
7
+ logging.basicConfig(filename="error.log", level=logging.ERROR,
8
+ format='%(asctime)s - %(levelname)s - %(message)s')
9
+
10
+ # Funzione per calcolare la similarità coseno
11
+ def cosine_similarity(vec_a, vec_b):
12
+ dot_product = np.dot(vec_a, vec_b)
13
+ norm_a = np.linalg.norm(vec_a)
14
+ norm_b = np.linalg.norm(vec_b)
15
+ if norm_a == 0 or norm_b == 0:
16
+ return 0.0
17
+ return dot_product / (norm_a * norm_b)
18
+
19
+ # Funzione per caricare gli embeddings dal file JSON
20
+ def load_embeddings(file_path):
21
+ try:
22
+ with open(file_path, 'r', encoding='utf-8') as file:
23
+ data = json.load(file)
24
+ return data
25
+ except UnicodeDecodeError as e:
26
+ logging.error(f"Errore di codifica nel caricamento del file JSON: {e}")
27
+ return f"Errore: {e}"
28
+ except json.JSONDecodeError as e:
29
+ logging.error(f"Errore di parsing JSON: {e}")
30
+ return f"Errore: {e}"
31
+ except Exception as e:
32
+ logging.error(f"Errore generico nel caricamento del file JSON: {e}")
33
+ return f"Errore: {e}"
34
+
35
+ # Funzione per trovare gli articoli simili
36
+ def find_similar_articles(input_title, embeddings_data):
37
+ input_embedding = None
38
+ # Trova l'embedding dell'articolo di riferimento
39
+ for article in embeddings_data:
40
+ if article['titolo_articolo'] == input_title:
41
+ input_embedding = article['embedding']
42
+ break
43
+
44
+ if input_embedding is None:
45
+ error_message = f"Articolo '{input_title}' non trovato."
46
+ logging.error(error_message)
47
+ return None, None, error_message
48
+
49
+ similarities = []
50
+ # Calcola la similarità per ogni articolo (diverso dall'articolo di riferimento)
51
+ for article in embeddings_data:
52
+ if article['titolo_articolo'] != input_title:
53
+ try:
54
+ similarity = cosine_similarity(input_embedding, article['embedding'])
55
+ except Exception as e:
56
+ logging.error(f"Errore nel calcolo della similarità per l'articolo {article['titolo_articolo']}: {e}")
57
+ similarity = 0.0
58
+ # Costruzione del link per il download del PDF
59
+ pdf_url = f"https://storiadellarterivista.it/data/pdf/{article['testo_pdf']}"
60
+ pdf_link = f'<a href="{pdf_url}" download>{article["testo_pdf"]}</a>'
61
+ similarities.append({
62
+ "titolo_articolo": article['titolo_articolo'],
63
+ "similarity": similarity,
64
+ "pdf_link": pdf_link
65
+ })
66
+ # Ordina gli articoli in ordine decrescente per similarità
67
+ similarities_sorted = sorted(similarities, key=lambda x: x['similarity'], reverse=True)
68
+ top_5 = similarities_sorted[:5]
69
+ # Ordina in ordine crescente per ottenere i 5 articoli con minore similarità
70
+ bottom_5 = sorted(similarities, key=lambda x: x['similarity'])[:5]
71
+ return top_5, bottom_5, None
72
+
73
+ # Funzione per generare una tabella HTML a partire da una lista di articoli
74
+ def generate_html_table(articles, title):
75
+ html = f"<h3>{title}</h3>"
76
+ html += '<table border="1" style="border-collapse: collapse; width:100%;">'
77
+ html += "<tr><th>Titolo Articolo</th><th>Similarità</th><th>PDF</th></tr>"
78
+ for art in articles:
79
+ html += f"<tr><td>{art['titolo_articolo']}</td><td>{art['similarity']:.3f}</td><td>{art['pdf_link']}</td></tr>"
80
+ html += "</table>"
81
+ return html
82
+
83
+ # Funzione principale chiamata dall'interfaccia GRADIO
84
+ def search_articles(input_title):
85
+ top_5, bottom_5, error = find_similar_articles(input_title, embeddings_data)
86
+ if error:
87
+ return error, error
88
+ top_table = generate_html_table(top_5, "Top 5 Articoli più simili")
89
+ bottom_table = generate_html_table(bottom_5, "Bottom 5 Articoli meno simili")
90
+ return top_table, bottom_table
91
+
92
+ # Funzione per ottenere l'elenco dei titoli (per l'autocompletamento)
93
+ def get_titles(embeddings_data):
94
+ return [article['titolo_articolo'] for article in embeddings_data]
95
+
96
+ # Caricamento degli embeddings
97
+ file_path = 'all_embeddings.json' # Percorso del file JSON contenente gli embeddings
98
+ embeddings_data = load_embeddings(file_path)
99
+
100
+ # Controllo di eventuali errori nel caricamento
101
+ if isinstance(embeddings_data, str):
102
+ logging.error(embeddings_data)
103
+ print(embeddings_data)
104
+ else:
105
+ title_choices = get_titles(embeddings_data)
106
+ iface = gr.Interface(
107
+ fn=search_articles,
108
+ inputs=gr.Dropdown(label="Titolo dell'articolo", choices=title_choices, type="value"),
109
+ outputs=[gr.HTML(label="Articoli più simili"), gr.HTML(label="Articoli meno simili")],
110
+ title="Ricerca Articoli Simili",
111
+ description=("Seleziona il titolo di un articolo per trovare quelli semanticamente simili. "
112
+ "Vengono mostrati i 5 articoli con maggiore similarità e i 5 con minore similarità, "
113
+ "con il coefficiente di similarità e un link per il download del PDF.")
114
+ )
115
+ iface.launch(share=True)