File size: 5,808 Bytes
9136be2
 
 
be1cc0b
9136be2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be1cc0b
 
 
9136be2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import os
import subprocess
import sys
import gradio as gr

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

install("numpy")
install("torch")
install("transformers")
install("unidecode")

import numpy as np
import torch
from transformers import DebertaV2TokenizerFast, DebertaV2ForQuestionAnswering
from transformers.pipelines import QuestionAnsweringPipeline
from transformers import pipeline
from collections import Counter
from unidecode import unidecode
import re
import string


tokenizer = DebertaV2TokenizerFast.from_pretrained("osiria/deberta-italian-question-answering")
model = DebertaV2ForQuestionAnswering.from_pretrained("osiria/deberta-italian-question-answering")

class OsiriaQA(QuestionAnsweringPipeline):
    
    def __init__(self, punctuation = ',;.:!?()[\]{}', **kwargs):

        QuestionAnsweringPipeline.__init__(self, **kwargs)
        self.post_regex_left = "^[\s" + punctuation + "]+"
        self.post_regex_right = "[\s" + punctuation + "]+$"
    
    def postprocess(self, output):
        
        output = QuestionAnsweringPipeline.postprocess(self, model_outputs=output)
        output_length = len(output["answer"])
        output["answer"] = re.sub(self.post_regex_left, "", output["answer"])
        output["start"] = output["start"] + (output_length - len(output["answer"]))
        output_length = len(output["answer"])
        output["answer"] = re.sub(self.post_regex_right, "", output["answer"])
        output["end"] = output["end"] - (output_length - len(output["answer"]))
        
        return output


device = torch.device("cpu")
model = model.to(device)
model.eval()


pipeline_qa = OsiriaQA(model = model, tokenizer = tokenizer)


header = '''--------------------------------------------------------------------------------------------------
<style>
.vertical-text {
    writing-mode: vertical-lr;
    text-orientation: upright;
    background-color:red;
}
</style>
<center>
<body>
<span class="vertical-text" style="background-color:lightgreen;border-radius: 3px;padding: 3px;"> </span>
<span class="vertical-text" style="background-color:orange;border-radius: 3px;padding: 3px;"> D</span>
<span class="vertical-text" style="background-color:lightblue;border-radius: 3px;padding: 3px;">    E</span>
<span class="vertical-text" style="background-color:tomato;border-radius: 3px;padding: 3px;">    M</span>
<span class="vertical-text" style="background-color:lightgrey;border-radius: 3px;padding: 3px;"> O</span>
<span class="vertical-text" style="background-color:#CF9FFF;border-radius: 3px;padding: 3px;"> </span>
</body>
</center>
<br>
'''

def extract(question, context):
    
    res = pipeline_qa(context = context,
                question = question)

    out_text = context[0:res["start"]] + '<span style="background-color:lightgreen;border-radius: 3px;padding: 3px;"><b>ᴀɴs </b> ' + context[res["start"]:res["end"]] + '</span>' + context[res["end"]:]
    
    return out_text


init_question= "Cos'è l'Agenzia Spaziale Italiana?"

init_context = '''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.'''

init_output = extract(question = init_question, context = init_context)


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():
        context = gr.Text(label="Context", lines = 10, value = init_context)
    with gr.Row():
        question = gr.Text(label="Question", lines = 1, value = init_question)
    with gr.Row():
        gr.Examples([["Cosa fa l'Agenzia Spaziale Italiana?"],
                     ["Qual è la sigla dell'Agenzia Spaziale Italiana?"],
                     ["Quando è stata fondata l'ASI?"],
                     ["Chi finanzia l'ASI?"],
                     ["Chi altro contribuisce all'Agenzia Spaziale Europea oltre all'Italia?"],
                     ["Dove ha sede l'Agenzia Spaziale Italiana?"],
                     ["Dove si trova il centro spaziale Giuseppe Colombo?"],
                     ["Dove si trova il centro spaziale Luigi Broglio?"],
                     ["Il centro di Trapani-Milo è ancora in funzione?"]],
                     inputs=[question])
    with gr.Row():
        with gr.Column():
            button = gr.Button("Ask").style(full_width=False)
    with gr.Row():
        with gr.Column():
            output = gr.Markdown(init_output)

    with gr.Row():
        with gr.Column():
            gr.Markdown("<center>The input examples in this demo are extracted from https://it.wikipedia.org</center>") 

    button.click(extract, inputs=[question, context], outputs = [output])


interface.launch()