File size: 4,284 Bytes
37f65a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
from collections import Counter

article_string = "Author: <a href=\"https://huggingface.co/ruanchaves\">Ruan Chaves Rodrigues</a>. Read more about our <a href=\"https://github.com/ruanchaves/evaluation-portuguese-language-models\">research on the evaluation of Portuguese language models</a>."

app_title = "Text simplification (Simplificação Textual)"

app_description = """
Given two versions of the same sentence, this app determines which one is more simple.
You can either introduce your own sentences by filling in "Sentence A" and "Sentence B" or click on one of the example pairs provided below.

(Dado duas versões da mesma frase, este aplicativo determina qual é a mais simples.
Você pode introduzir suas próprias frases preenchendo os campos "Sentence A" e "Sentence B" ou clicar em um dos pares de exemplo fornecidos abaixo.)
"""

app_examples = [
    ["O preço para instalar um DVD player no carro fica entre R$ 2 mil e R$ 5 mil.", "Instalar um DVD player no carro tem preço médio entre R$ 2 mil e R$ 5 mil."],
    ["Especialista alerta para cuidados com os olhos.", "Especialista alerta para cuidados com os olhos."],
    ["Para evitar um novo enfraquecimento político, o governo não pretende influir para que os senadores do PMDB contrários à CPMF sejam substituídos na CCJ.", "O governo não pretende influir para que os senadores do PMDB contrários à CPMF sejam substituídos na CCJ."]
]

output_textbox_component_description = """
Output will appear here once the app has finished analyzing the answer.

(A saída aparecerá aqui assim que o aplicativo terminar de analisar a resposta.)
"""

output_json_component_description = { "breakdown": """
This box presents a detailed breakdown of the evaluation for each model.
""",
"detalhamento": """
(Esta caixa apresenta um detalhamento da avaliação para cada modelo.)
""" }

score_descriptions = {
    0: "Sentence A is more simple than Sentence B.",
    1: "The two sentences are equally simple.", 
    2: "Sentence B is more simple than Sentence A.",
}

score_descriptions_pt = {
     0: "(A frase A é mais simples que a frase B.)",
     1: "(As duas frases são igualmente simples.)",
     2: "(A frase B é mais simples que a frase A.)",
}

model_list = [
    "ruanchaves/mdeberta-v3-base-porsimplessent",
    "ruanchaves/bert-base-portuguese-cased-porsimplessent",
]

user_friendly_name = {
    "ruanchaves/mdeberta-v3-base-porsimplessent": "mDeBERTa-v3 (PorSimplesSent)",
    "ruanchaves/bert-base-portuguese-cased-porsimplessent": "BERTimbau base (PorSimplesSent)",
}

model_array = []

for model_name in model_list:
    row = {}
    row["name"] = model_name
    row["tokenizer"] = AutoTokenizer.from_pretrained(model_name)
    row["model"] = AutoModelForSequenceClassification.from_pretrained(model_name)
    model_array.append(row)

def most_frequent(array):
    occurence_count = Counter(array)
    return occurence_count.most_common(1)[0][0]

def predict(s1, s2):
    scores = {}
    for row in model_array:
        name = user_friendly_name[row["name"]]
        tokenizer = row["tokenizer"]
        model = row["model"]
        model_input = tokenizer(*([s1], [s2]), padding=True, return_tensors="pt")
        with torch.no_grad():
            output = model(**model_input)
            score = output[0][0].argmax().item()
            scores[name] = score
    average_score = most_frequent(list(scores.values()))
    description = score_descriptions[average_score]
    description_pt = score_descriptions_pt[average_score]
    final_description = description + "\n \n" + description_pt

    for key, value in scores.items():
      scores[key] = score_descriptions[value]

    return final_description, scores


inputs = [
    gr.inputs.Textbox(label="Sentence A"),
    gr.inputs.Textbox(label="Sentence B")
]

outputs = [
 gr.Textbox(label="Evaluation", value=output_textbox_component_description),
 gr.JSON(label="Results by model", value=output_json_component_description)
]


gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title=app_title, 
             description=app_description,
             examples=app_examples,
             article = article_string).launch()