ARTeLab/ARTeLab-SummIT
1
1import streamlit as st2import os3 4from transformers import AutoTokenizer5from transformers import AutoModelForSeq2SeqLM6from transformers import pipeline7from transformers import set_seed8 9debug = False10 11MODELS = [12 "ARTeLab/mbart-summarization-fanpage",13 "ARTeLab/mbart-summarization-ilpost",14 "ARTeLab/mbart-summarization-mlsum",15 "ARTeLab/it5-summarization-mlsum",16 "ARTeLab/it5-summarization-ilpost",17 "ARTeLab/it5-summarization-fanpage"18]19 20DEFAULT_TEXT: str = """(Fanpage) Dopo oltre mezzo secolo, il mistero della Natività di Caravaggio resta intatto. L'opera, intitolata la "Natività con i Santi Lorenzo e Francesco d'Assisi", fu trafugata la notte tra il 17 e il 18 ottobre 1969 dall'Oratorio di San Lorenzo a Palermo e tuttora non è stata ancora recuperata. L'olio su tela realizzato da Caravaggio, inserito dagli investigatori nella top ten mondiale delle opere d'arte trafugate e mai più ritrovate, ha un valore di mercato che si aggirerebbe oggi intorno ai 20 milioni di dollari secondo l'FBI. La sua storia è avvolta nel mistero e dopo cinquantuno anni ancora non è stata risolta, dopo il furto della mafia nel 1969 e forse ormai distrutta. L'unica certezza è che nemmeno questo Natale potremo ammirare l'opera raffigurante la nascita di Cristo del grande genio pittorico italiano. E forse, secondo i più pessimisti, non ci riusciremo mai più. Nella notte tra il 17 e il 18 ottobre, nel cuore di Palermo, i boss di Cosa Nostra si intrufolarono nell'Oratorio di San Lorenzo e arrotolarono la "Natività con i Santi Lorenzo e Francesco d'Assisi" di Caravaggio in malo modo, facendo sgranare la tela. Una delle più alte testimonianza dell'arte di ogni tempo fu distrutta così. Ma come facciamo a sapere oggi che la tela è andata distrutta? Fu il pentito Francesco Marino Mannoia, durante il processo Andreotti nel 1996 a raccontare del presunto disastro di un gioiello arrotolato in fretta e portato via in segno di sfregio. Ma questa versione stride con quella di un altro pentito che ricorda il quadro affisso ai summit di mafia, come un trofeo, mentre sui giornali si sussurrava di losche ma non provate trattative da 60 miliardi di vecchie lire fra mediatori e trafficanti. Nel 2017, il mafioso Gaetano Grado asserisce che la tela sarebbe stata nascosta, ma all'estero: nel 1970 il boss Badalamenti l'avrebbe trasferita in Svizzera in cambio di una notevole somma di franchi ad un antiquario svizzero, giunto a Palermo per definire l'affare. Grado riferisce anche che Badalamenti gli avrebbe detto che il quadro era stato scomposto per essere venduto sul mercato clandestino."""21 22 23class TextSummarizer:24 def __init__(self):25 self.tokenizer = None26 self.model = None27 self.generator = None28 self.model_loaded = None29 set_seed(42)30 31 def load(self, model_name):32 os.environ["TOKENIZERS_PARALLELISM"] = "false"33 self.tokenizer = AutoTokenizer.from_pretrained(model_name)34 self.model = AutoModelForSeq2SeqLM.from_pretrained(model_name)35 self.generator = pipeline(36 "text2text-generation", model=self.model, tokenizer=self.tokenizer37 )38 self.model_loaded = model_name39 40 def summarize(self, model_name, input_text, generate_kwargs) -> str:41 if not self.generator or self.model_loaded != model_name:42 with st.spinner("meanwhile: downloading/loading selected model...please don't go :("):43 self.load(model_name)44 return self.generator(45 input_text, return_tensors=False, return_text=True, **generate_kwargs46 )[0].get("generated_text")47 48 49@st.cache(allow_output_mutation=True)50def instantiate_generator():51 summarizer = TextSummarizer()52 return summarizer53 54 55def main():56 st.set_page_config( # Alternate names: setup_page, page, layout57 page_title="ARTeLab SummIT",58 layout="wide", # Can be "centered" or "wide". In the future also "dashboard", etc.59 initial_sidebar_state="expanded", # Can be "auto", "expanded", "collapsed"60 page_icon="📰", # String, anything supported by st.image, or None.61 )62 63 with open("style.css") as f:64 st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)65 66 generator = instantiate_generator()67 68 st.markdown(69 """70 <style>71 [data-testid="stSidebar"][aria-expanded="true"] > div:first-child {72 width: 500px;73 }74 [data-testid="stSidebar"][aria-expanded="false"] > div:first-child {75 width: 500px;76 margin-left: -500px;77 }78 </style>79 """,80 unsafe_allow_html=True,81 )82 st.sidebar.markdown("""# ARTeLab SummIT""")83 st.sidebar.image("fl.png", width=220)84 st.sidebar.markdown(85 """86 * Create summaries of Italian news articles.87 * Copy paste any Italian news text and press the Generate Summary botton.88 """89 )90 st.sidebar.title("Parameters:")91 92 MODEL = st.sidebar.selectbox("Choose model", index=1, options=MODELS)93 94 min_length = st.sidebar.number_input(95 "Min length", min_value=10, max_value=150, value=4096 )97 max_length = st.sidebar.number_input(98 "Max length", min_value=20, max_value=250, value=14299 )100 no_repeat_ngram_size = st.sidebar.number_input(101 "No repeat NGram size", min_value=1, max_value=5, value=3102 )103 104 if sampling_mode := st.sidebar.selectbox(105 "select a Mode", index=0, options=["Beam Search", "Top-k Sampling"]106 ):107 if sampling_mode == "Beam Search":108 num_beams = st.sidebar.number_input(109 "Num beams", min_value=1, max_value=10, value=4110 )111 length_penalty = st.sidebar.number_input(112 "Length penalty", min_value=0.0, max_value=5.0, value=1.5, step=0.1113 )114 params = {115 "min_length": min_length,116 "max_length": max_length,117 "no_repeat_ngram_size": no_repeat_ngram_size,118 "num_beams": num_beams,119 "early_stopping": True,120 "length_penalty": length_penalty,121 "num_return_sequences": 1,122 }123 else:124 top_k = st.sidebar.number_input(125 "Top K", min_value=0, max_value=100, value=50126 )127 top_p = st.sidebar.number_input(128 "Top P", min_value=0.0, max_value=1.0, value=0.9, step=0.05129 )130 temperature = st.sidebar.number_input(131 "Temperature", min_value=0.0, max_value=1.0, value=0.3, step=0.05132 )133 params = {134 "min_length": min_length,135 "max_length": max_length,136 "no_repeat_ngram_size": no_repeat_ngram_size,137 "do_sample": True,138 "top_k": top_k,139 "top_p": top_p,140 "temperature": temperature,141 "num_return_sequences": 1,142 }143 144 input_text = st.text_area("Enter an Italian news text", DEFAULT_TEXT, height=450)145 146 if st.button("Generate summary"):147 148 with st.spinner("Generating summary ..."):149 150 response = generator.summarize(MODEL, input_text, params)151 152 st.header("Summary:")153 st.markdown(response)154 155 156if __name__ == "__main__":157 main()