ruanchaves's picture
feat: text simplification
37f65a8
raw
history blame
4.28 kB
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()