File size: 2,775 Bytes
62cdc78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import pandas as pd
import numpy as np
from supabase import create_client
from sentence_transformers import SentenceTransformer
import faiss
import gradio as gr

# Configura Supabase
SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")

EMBEDDING_MODEL = "all-MiniLM-L6-v2"

# Crea client per Supabase
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)

# Carica il modello per gli embedding
model = SentenceTransformer(EMBEDDING_MODEL)

# Funzione per caricare i dati da Supabase
def load_database(supabase_client):
    # Recupera gli articoli da Supabase (assumiamo che la tabella si chiami 'papers')
    response = supabase_client.table("papers").select("*").execute()
    data = response.data
    
    # Converti i dati in un DataFrame
    df = pd.DataFrame(data)
    return df

# Funzione per creare l'indice FAISS
def create_faiss_index(embeddings):
    dimension = len(embeddings[0])  # La dimensione degli embedding
    index = faiss.IndexFlatL2(dimension)  # Crea un indice per la ricerca basato sulla distanza L2
    index.add(np.array(embeddings, dtype=np.float32))  # Aggiungi gli embedding all'indice
    return index

# Funzione per eseguire la ricerca
def search_papers(query, supabase_client):
    # Carica i dati e l'indice FAISS
    df = load_database(supabase_client)
    index = create_faiss_index(df["embedding"].tolist())

    # Calcola l'embedding della query
    query_embedding = model.encode(query).reshape(1, -1).astype(np.float32)  
    distances, indices = index.search(query_embedding, 3)  # Cerca i top 2 articoli più simili

    results = df.iloc[indices[0]]  # Recupera i risultati corrispondenti
    return [(res["title"], res["url"]) for _, res in results.iterrows()]


# Funzione per generare l'interfaccia Gradio
def gradio_interface(query):
    results = search_papers(query, supabase)
    html_output = "<ul style='list-style-type: none; padding-left: 0;'>"
    
    for title, url in results:
        html_output += f"""
            <li style="margin-bottom: 15px;">
                <a href='{url}' target='_blank' style='text-decoration: none; color: #007bff; font-size: 18px; font-weight: bold;'>
                    {title}
                </a>
            </li>
        """
    
    html_output += "</ul>"
    
    return html_output

# Interfaccia Gradio
iface = gr.Interface(
    fn=gradio_interface,
    inputs=gr.Textbox(label="Inserisci la tua query di ricerca", placeholder="Es. 'Deep Learning for NLP'", lines=1),
    outputs=gr.HTML(label="Articoli correlati", elem_id="output-section"),
    live=True,
    title="Ricerca articoli arXiv",
    description="Inserisci una query per trovare articoli correlati.",
)


# Avvia l'interfaccia
if __name__ == "__main__":
    iface.launch()