import os
import gradio as gr
from gradio.components import Label
import subprocess
import sys
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
install("numpy")
install("transformers")
install("torch")
import torch
from transformers import AutoTokenizer
from transformers import AutoModel
import numpy as np
import re
auth_token = os.environ.get("AUTH-TOKEN")
header = '''--------------------------------------------------------------------------------------------------
D
E
M
O
--------------------------------------------------------------------------------------------------'''
tokenizer_cl = tokenizer = AutoTokenizer.from_pretrained("osiria/distiluse-base-italian")
model_cl = AutoModel.from_pretrained("osiria/distiluse-base-italian")
def classify(text, classes, prompt = "L'argomento di cui parliamo è quindi: "):
text = text[:10000]
classes = {el.split(":")[0].strip(): el.split(":")[1].strip() for el in classes.split("\n")}
t_vec = model_cl(tokenizer_cl.encode(text, return_tensors = "pt", truncation = True, max_length = 512)).last_hidden_state[0,0,:].cpu().detach().numpy()
t_vec = t_vec/np.linalg.norm(t_vec)
t_vec = t_vec.reshape(-1, 1)
classes_mod = [prompt + re.sub("\s+", " ", classes[cl].lower().replace(",", " ")).strip() for cl in classes]
cl_vecs = np.array([model_cl(tokenizer_cl.encode(cl, return_tensors = "pt", truncation = True, max_length = 512)).last_hidden_state[0,0,:].cpu().detach().numpy() for cl in classes_mod])
cl_vecs = cl_vecs/np.sqrt(np.sum(cl_vecs**2, axis = 1).reshape(-1,1))
scores = np.dot(cl_vecs, t_vec).reshape(1,-1)[0]
scores = scores*(scores > 0)
scores = (scores/np.sum(scores))
scores = scores*(scores > 0.05)
scores = (scores/np.sum(scores))
scores = scores.tolist()
classes = list(classes.keys())
output = list(zip(classes, scores))
output = sorted(output, key = lambda tpl: tpl[1], reverse = True)
output = {tpl[0].capitalize(): tpl[1] for tpl in output}
return output
init_text = '''L'Agenzia Spaziale Italiana (ASI) è un ente governativo italiano, istituito nel 1988, che ha il compito di predisporre e attuare la politica aerospaziale italiana. Dipende e utilizza i fondi ricevuti dal Governo italiano per finanziare il progetto, lo sviluppo e la gestione operativa di missioni spaziali, con obiettivi scientifici e applicativi.
Gestisce missioni spaziali in proprio e in collaborazione con i maggiori organismi spaziali internazionali, prima tra tutte l'Agenzia spaziale europea (dove l'Italia è il terzo maggior contribuente dopo Francia e Germania, e a cui l'ASI corrisponde una parte del proprio budget), quindi la NASA e le altre agenzie spaziali nazionali. Per la realizzazione di satelliti e strumenti scientifici, l'ASI stipula contratti con le imprese, italiane e non, operanti nel settore aerospaziale.
Ha la sede principale a Roma e centri operativi a Matera (sede del Centro di geodesia spaziale Giuseppe Colombo) e Malindi, Kenya (sede del Centro spaziale Luigi Broglio). Il centro di Trapani-Milo, usato per i lanci di palloni stratosferici dal 1975, non è più operativo dal 2010.
Ha un organico di circa 393 dipendenti (al 2023), e un budget annuale al 2019 di circa 1,075 miliardi di euro. Le attività di ricerca vengono svolte in cooperazione con le Università, il CNR, gli osservatori astronomici, ecc. I campi di studio sono in genere le "scienze dell'universo, le scienze della Terra, le scienze della vita" e la tecnologia aerospaziale.
Con DM 08/06/2023 il Professore Teodoro Valente è stato nominato Presidente dell'Agenzia Spaziale Italiana.'''
init_classes = '''alimentazione: alimentazione, cibo, agricoltura, allevamento, nutrizione
arte: arte, pittura, scultura, moda
animali: animali, zoologia, botanica, piante
ambiente: ambiente, clima, sostenibilità, ecologia, inquinamento
economia: aziende, banche, economia, finanza, borsa
filosofia: etica, filosofia, religione, teologia
geografia: città, regioni, nazioni, geografia, geologia
giustizia: giustizia, magistratura, reati, criminalità
musica: musica, cantanti, gruppi musicali, generi musicali
cinema: cinema, film, televisione, spettacolo
intrattenimento: intrattenimento, tempo libero, svago, videogiochi
letteratura: letteratura, romanzi, narrativa, poesia
medicina: medicina, salute, farmaci, malattie, patologie
governo: governo, legge, politica, partiti, settore pubblico
scienza: scienza, ingegneria, tecnologia
sport: competizioni, sport
guerra: guerra, conflitti, battaglie, tematiche militari
storia: eventi, storia
società: tematiche sociali, tematiche internazionali
trasporti: automobili, treni, aerei, trasporti, veicoli
informatica: computer, smartphone, applicazioni, internet, social networks'''
init_output = classify(init_text, init_classes)
with gr.Blocks(css="footer {visibility: hidden}", theme=gr.themes.Default(text_size="lg", spacing_size="lg")) as interface:
with gr.Row():
gr.Markdown(header)
with gr.Row():
text = gr.Text(label="Write or paste a text", lines = 5, value = init_text)
with gr.Row():
gr.Examples([["Alessandro Manzoni, nome completo Alessandro Francesco Tommaso Antonio Manzoni (Milano, 7 marzo 1785 – Milano, 22 maggio 1873), è stato uno scrittore, poeta e drammaturgo italiano. Considerato uno dei maggiori romanzieri italiani di tutti i tempi per il suo celebre romanzo I promessi sposi, caposaldo della letteratura italiana, Manzoni ebbe il merito principale di aver gettato le basi per il romanzo moderno e di aver così patrocinato l'unità linguistica italiana, sulla scia di quella letteratura moralmente e civilmente impegnata propria dell'Illuminismo italiano."],
["Oggi sto male perchè ho la febbre"],
["Mi sono registrato su Facebook"],
["Stasera guardo qualcosa su Netflix"],
["La battaglia delle Termòpili, o delle Termòpile, fu una battaglia combattuta da un'alleanza di poleis greche, guidata dal re di Sparta Leonida I, contro l'Impero persiano governato da Serse I. Si svolse in tre giorni, durante la seconda invasione persiana della Grecia, nell'agosto o nel settembre del 480 a.C. presso lo stretto passaggio delle Termopili (o, più correttamente, Termopile, 'Le porte calde'), contemporaneamente alla battaglia navale di Capo Artemisio."],
["Ieri ho comprato l'Xbox One"],
["Domani per pranzo preparo la pasta alle vongole"],
["Ho appena ascoltato l'ultimo album dei Green Day"],
["Sono chiamati gas serra quei gas presenti nell'atmosfera che riescono a trattenere, in maniera consistente, una parte considerevole della componente nell'infrarosso della radiazione solare che colpisce la Terra ed è emessa dalla superficie terrestre, dall'atmosfera e dalle nuvole. Tale proprietà causa il fenomeno noto come 'effetto serra' ed è verificabile da un'analisi spettroscopica in laboratorio."]],
inputs=[text])
with gr.Row():
classes = gr.Text(label="Classes (write a few classes in the form 'class_name: word1, word2, word3...' using 1 to 5 descriptive words for each class)", lines = 1, value = '''alimentazione: alimentazione, cibo, agricoltura, allevamento, nutrizione
arte: arte, pittura, scultura, moda
animali: animali, zoologia, botanica, piante
ambiente: ambiente, clima, sostenibilità, ecologia, inquinamento
economia: aziende, banche, economia, finanza, borsa
filosofia: etica, filosofia, religione, teologia
geografia: città, regioni, nazioni, geografia, geologia
giustizia: giustizia, magistratura, reati, criminalità
musica: musica, cantanti, gruppi musicali, generi musicali
cinema: cinema, film, televisione, spettacolo
intrattenimento: intrattenimento, tempo libero, svago, videogiochi
letteratura: letteratura, romanzi, narrativa, poesia
medicina: medicina, salute, farmaci, malattie, patologie
governo: governo, legge, politica, partiti, settore pubblico
scienza: matematica, scienza, ingegneria, tecnologia, spazio
sport: competizioni, sport
guerra: guerra, conflitti, battaglie, tematiche militari
storia: eventi, storia
società: tematiche sociali, tematiche internazionali
trasporti: automobili, treni, aerei, trasporti, veicoli
informatica: computer, smartphone, applicazioni, internet, social networks''')
with gr.Row():
button = gr.Button("Classify").style(full_width=False)
with gr.Row():
with gr.Column():
output = Label(label="Result")
with gr.Row():
with gr.Column():
footer = gr.Markdown("A few examples in this demo are extracted from Wikipedia")
button.click(classify, inputs=[text, classes], outputs = [output])
interface.launch()