efederici commited on
Commit
aad1ec0
1 Parent(s): 0d49fe7
Files changed (1) hide show
  1. app.py +166 -0
app.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+
4
+ from transformers import AutoTokenizer
5
+ from transformers import AutoModelForSeq2SeqLM
6
+ from transformers import pipeline
7
+ from transformers import set_seed
8
+
9
+ debug = False
10
+
11
+ MODELS = [
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
+
20
+ DEFAULT_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
+
23
+ class TextSummarizer:
24
+ def __init__(self):
25
+ self.tokenizer = None
26
+ self.model = None
27
+ self.generator = None
28
+ self.model_loaded = None
29
+ 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.tokenizer
37
+ )
38
+ self.model_loaded = model_name
39
+
40
+ def summarize(self, model_name, input_text, generate_kwargs) -> str:
41
+ if not self.generator or self.model_loaded != model_name:
42
+ self.load(model_name)
43
+ return self.generator(
44
+ input_text, return_tensors=False, return_text=True, **generate_kwargs
45
+ )[0].get("generated_text")
46
+
47
+
48
+ @st.cache(allow_output_mutation=True)
49
+ def instantiate_generator():
50
+ summarizer = TextSummarizer()
51
+ return summarizer
52
+
53
+
54
+ def main():
55
+ st.set_page_config( # Alternate names: setup_page, page, layout
56
+ page_title="ARTeLab Summarizer",
57
+ layout="wide", # Can be "centered" or "wide". In the future also "dashboard", etc.
58
+ initial_sidebar_state="expanded", # Can be "auto", "expanded", "collapsed"
59
+ page_icon="📰", # String, anything supported by st.image, or None.
60
+ )
61
+
62
+ with open("style.css") as f:
63
+ st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
64
+
65
+ generator = instantiate_generator()
66
+
67
+ st.markdown(
68
+ """
69
+ <style>
70
+ [data-testid="stSidebar"][aria-expanded="true"] > div:first-child {
71
+ width: 500px;
72
+ }
73
+ [data-testid="stSidebar"][aria-expanded="false"] > div:first-child {
74
+ width: 500px;
75
+ margin-left: -500px;
76
+ }
77
+ </style>
78
+ """,
79
+ unsafe_allow_html=True,
80
+ )
81
+ st.sidebar.image("NewsCovid-19-512.png", width=200)
82
+ st.sidebar.markdown(
83
+ """# ARTeLab Summarizer
84
+ * Create summaries of Italian news articles.
85
+ * Copy paste any Italian news text and press the Generate Summary botton.
86
+ """
87
+ )
88
+ st.sidebar.title("Parameters:")
89
+
90
+ MODEL = st.sidebar.selectbox("Choose model", index=1, options=MODELS)
91
+
92
+ min_length = st.sidebar.number_input(
93
+ "Min length", min_value=10, max_value=150, value=75
94
+ )
95
+ max_length = st.sidebar.number_input(
96
+ "Max length", min_value=50, max_value=250, value=142
97
+ )
98
+ no_repeat_ngram_size = st.sidebar.number_input(
99
+ "No repeat NGram size", min_value=1, max_value=5, value=3
100
+ )
101
+
102
+ if sampling_mode := st.sidebar.selectbox(
103
+ "select a Mode", index=0, options=["Beam Search", "Top-k Sampling"]
104
+ ):
105
+ if sampling_mode == "Beam Search":
106
+ num_beams = st.sidebar.number_input(
107
+ "Num beams", min_value=1, max_value=10, value=4
108
+ )
109
+ length_penalty = st.sidebar.number_input(
110
+ "Length penalty", min_value=0.0, max_value=5.0, value=1.5, step=0.1
111
+ )
112
+ params = {
113
+ "min_length": min_length,
114
+ "max_length": max_length,
115
+ "no_repeat_ngram_size": no_repeat_ngram_size,
116
+ "num_beams": num_beams,
117
+ "early_stopping": True,
118
+ "length_penalty": length_penalty,
119
+ "num_return_sequences": 1,
120
+ }
121
+ else:
122
+ top_k = st.sidebar.number_input(
123
+ "Top K", min_value=0, max_value=100, value=50
124
+ )
125
+ top_p = st.sidebar.number_input(
126
+ "Top P", min_value=0.0, max_value=1.0, value=0.9, step=0.05
127
+ )
128
+ temperature = st.sidebar.number_input(
129
+ "Temperature", min_value=0.0, max_value=1.0, value=0.3, step=0.05
130
+ )
131
+ params = {
132
+ "min_length": min_length,
133
+ "max_length": max_length,
134
+ "no_repeat_ngram_size": no_repeat_ngram_size,
135
+ "do_sample": True,
136
+ "top_k": top_k,
137
+ "top_p": top_p,
138
+ "temperature": temperature,
139
+ "num_return_sequences": 1,
140
+ }
141
+
142
+ st.sidebar.markdown(
143
+ """For an explanation of the parameters, please to the [Huggingface blog post about text generation](https://huggingface.co/blog/how-to-generate)
144
+ and the [Huggingface text generation interface doc](https://huggingface.co/transformers/main_classes/model.html?highlight=generate#transformers.generation_utils.GenerationMixin.generate).
145
+ """
146
+ )
147
+
148
+ input_text = st.text_area("Enter a Dutch news text", DEFAULT_TEXT, height=500)
149
+
150
+ if st.button("Generate summary"):
151
+
152
+ with st.spinner("Generating summary ..."):
153
+ if debug:
154
+ from time import sleep
155
+
156
+ sleep(2)
157
+ response = """Trafugata in Svizzera, venduta a miliardari collezionisti senza scrupoli, oppure nascosta da Cosa Nostra chissà dove ed esibita come simbolo di potere durante summit tra mafiosi. Dopo oltre mezzo secolo quel che è certo è che anche a Natale 2020 la “Natività” di Caravaggio, una delle opere più preziose rubate e mai più ritrovate, non potrà essere ammirata da nessuno."""
158
+ else:
159
+ response = generator.summarize(MODEL, input_text, params)
160
+
161
+ st.header("Summary:")
162
+ st.markdown(response)
163
+
164
+
165
+ if __name__ == "__main__":
166
+ main()