ruanchaves commited on
Commit
ccf281e
1 Parent(s): 3ec2e9f

feat: portuguese Q&A

Browse files
Files changed (2) hide show
  1. app.py +106 -0
  2. requirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
3
+ import torch
4
+ from collections import Counter
5
+
6
+ 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>."
7
+
8
+ app_title = "Question Answering (Respostas a Perguntas)"
9
+
10
+ app_description = """
11
+ This app determines if an answer is appropriate for a question. You can either introduce your own sentences by filling in "Question" and "Answer" or click on one of the example pairs provided below.
12
+
13
+ (Este aplicativo determina se uma resposta é apropriada para uma pergunta. Você pode introduzir suas próprias frases preenchendo "Question" e "Answer" ou clicar em um dos exemplos de pares fornecidos abaixo.)
14
+ """
15
+
16
+ app_examples = [
17
+ ["Quem deu suporte à revolução digital?", "A computação científica é uma área da computação que permite o avanço de estudos como o mapeamento do genoma humano."],
18
+ ["Por quem foi designada a profissão de tecnólogo em análise e desenvolvimento de sistemas?", "A designação atual da profissão foi estabelecida pelo Decreto 2208 de 17 de abril de 1997."],
19
+ ["Onde foi utilizado oficialmente o termo engenharia de software?", "Margaret Hamilton é creditada por ter criado o termo \"engenharia de software\""]
20
+ ]
21
+
22
+ output_textbox_component_description = """
23
+ Output will appear here once the app has finished analyzing the answer.
24
+
25
+ (A saída aparecerá aqui assim que o aplicativo terminar de analisar a resposta.)
26
+ """
27
+
28
+ output_json_component_description = { "breakdown": """
29
+ This box presents a detailed breakdown of the evaluation for each model.
30
+ """,
31
+ "detalhamento": """
32
+ (Esta caixa apresenta um detalhamento da avaliação para cada modelo.)
33
+ """ }
34
+
35
+ score_descriptions = {
36
+ 0: "Negative: The answer is not suitable for the provided question.",
37
+ 1: "Positive: The answer is suitable for the provided question.",
38
+ }
39
+
40
+ score_descriptions_pt = {
41
+ 0: "(Negativo: A resposta não é adequada para a pergunta fornecida.)",
42
+ 1: "(Positivo: A resposta é adequada para a pergunta fornecida.)",
43
+ }
44
+
45
+ model_list = [
46
+ "ruanchaves/mdeberta-v3-base-faquad-nli",
47
+ "ruanchaves/bert-base-portuguese-cased-faquad-nli",
48
+ "ruanchaves/bert-large-portuguese-cased-faquad-nli",
49
+ ]
50
+
51
+ user_friendly_name = {
52
+ "ruanchaves/mdeberta-v3-base-faquad-nli": "mDeBERTa-v3 (ASSIN 2)",
53
+ "ruanchaves/bert-base-portuguese-cased-faquad-nli": "BERTimbau base (ASSIN 2)",
54
+ "ruanchaves/bert-large-portuguese-cased-faquad-nli": "BERTimbau large (ASSIN 2)",
55
+ }
56
+
57
+ model_array = []
58
+
59
+ for model_name in model_list:
60
+ row = {}
61
+ row["name"] = model_name
62
+ row["tokenizer"] = AutoTokenizer.from_pretrained(model_name)
63
+ row["model"] = AutoModelForSequenceClassification.from_pretrained(model_name)
64
+ model_array.append(row)
65
+
66
+ def most_frequent(array):
67
+ occurence_count = Counter(array)
68
+ return occurence_count.most_common(1)[0][0]
69
+
70
+ def predict(s1, s2):
71
+ scores = {}
72
+ for row in model_array:
73
+ name = user_friendly_name[row["name"]]
74
+ tokenizer = row["tokenizer"]
75
+ model = row["model"]
76
+ model_input = tokenizer(*([s1], [s2]), padding=True, return_tensors="pt")
77
+ with torch.no_grad():
78
+ output = model(**model_input)
79
+ score = output[0][0].argmax().item()
80
+ scores[name] = score
81
+ average_score = most_frequent(list(scores.values()))
82
+ description = score_descriptions[average_score]
83
+ description_pt = score_descriptions_pt[average_score]
84
+ final_description = description + "\n \n" + description_pt
85
+
86
+ for key, value in scores.items():
87
+ scores[key] = score_descriptions[value]
88
+
89
+ return final_description, scores
90
+
91
+
92
+ inputs = [
93
+ gr.inputs.Textbox(label="Question"),
94
+ gr.inputs.Textbox(label="Answer")
95
+ ]
96
+
97
+ outputs = [
98
+ gr.Textbox(label="Evaluation", value=output_textbox_component_description),
99
+ gr.JSON(label="Results by model", value=output_json_component_description)
100
+ ]
101
+
102
+
103
+ gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title=app_title,
104
+ description=app_description,
105
+ examples=app_examples,
106
+ article = article_string).launch()
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ torch
2
+ gradio
3
+ transformers