gilramos's picture
Update app.py
a3271fa verified
raw
history blame
3.54 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
app_title = "Portuguese Hate Speech Detection"
app_description = """
This app detects hate speech on Portuguese text using multiple models. You can either introduce your own sentences by filling in "Text" or click on one of the examples provided below.
"""
app_examples = [
["as pessoas tem que perceber que ser 'panasca' não é deixar de ser homem, é deixar de ser humano kkk"],
["ontem encontrei-me com um amigo meu e tivemos uma conversa agradável"],
]
output_textbox_component_description = """
This box will display the hate speech detection results based on the average score of multiple models.
"""
output_json_component_description = { "breakdown": """
This box presents a detailed breakdown of the evaluation for each model.
"""}
short_score_descriptions = {
0: "Non Hate Speech",
1: "Hate Speech"
}
score_descriptions = {
0: "This text is not Hate Speech.",
1: "This text is Hate Speech.",
}
model_list = [
"knowhate/HateBERTimbau",
"knowhate/HateBERTimbau-youtube",
"knowhate/HateBERTimbau-twitter",
"knowhate/HateBERTimbau-yt-tt",
]
user_friendly_name = {
"knowhate/HateBERTimbau": "HateBERTimbau (Original)",
"knowhate/HateBERTimbau-youtube": "HateBERTimbau (YouTube)",
"knowhate/HateBERTimbau-twitter": "HateBERTimbau (Twitter)",
"knowhate/HateBERTimbau-yt-tt": "HateBERTimbau (YouTube + Twitter)",
}
reverse_user_friendly_name = { v:k for k,v in user_friendly_name.items() }
user_friendly_name_list = list(user_friendly_name.values())
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, chosen_model):
if not chosen_model:
chosen_model = user_friendly_name_list[0]
scores = {}
full_chosen_model_name = reverse_user_friendly_name[chosen_model]
for row in model_array:
name = row["name"]
if name != full_chosen_model_name:
continue
else:
tokenizer = row["tokenizer"]
model = row["model"]
model_input = tokenizer(*([s1],), padding=True, return_tensors="pt")
with torch.no_grad():
output = model(**model_input)
logits = output[0][0].detach().numpy()
logits = softmax(logits).tolist()
break
def get_description(idx):
description = score_descriptions[idx]
description_pt = score_descriptions_pt[idx]
final_description = description + "\n \n" + description_pt
return final_description
max_pos = logits.index(max(logits))
markdown_description = get_description(max_pos)
scores = { short_score_descriptions[k]:v for k,v in enumerate(logits) }
return scores, markdown_description
inputs = [
gr.Textbox(label="Text", value=app_examples[0][0]),
gr.Dropdown(label="Model", choices=user_friendly_name_list, value=user_friendly_name_list[0])
]
outputs = [
gr.Label(label="Result"),
gr.Markdown(),
]
gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title=app_title,
description=app_description,
examples=app_examples,
article = article_string).launch()