File size: 3,741 Bytes
70b5fc5
 
 
072c906
70b5fc5
 
b642a67
 
 
 
 
 
 
 
 
70b5fc5
 
072c906
 
b642a67
072c906
 
 
 
 
 
b642a67
072c906
b642a67
072c906
 
b642a67
072c906
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b642a67
072c906
 
b642a67
072c906
 
 
 
b642a67
072c906
 
 
502440e
072c906
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
import transformers

import gradio as gr
import numpy as np
import tensorflow as tf

def encode(sentences, tokenizer, sequence_length):
    return tokenizer.batch_encode_plus(
        sentences,
        max_length=sequence_length, # set the length of the sequences
        add_special_tokens=True, # add [CLS] and [SEP] tokens
        return_attention_mask=True,
        return_token_type_ids=False, # not needed for this type of ML task
        pad_to_max_length=True, # add 0 pad tokens to the sequences less than max_length
        return_tensors='tf'
    )

hs_detection_model_1 = tf.keras.models.load_model('./model_1', compile=True)
hs_detection_model_2 = tf.keras.models.load_model('./model_2', compile=True)

def model_inference(sentence):
    encoded_model1_sentence = encode([sentence], transformers.BertTokenizer.from_pretrained('dbmdz/bert-base-german-cased'), 300)
    encoded_model2_sentence = encode([sentence], transformers.BertTokenizer.from_pretrained('dbmdz/bert-base-german-uncased'), 512)
    predictions_1 = hs_detection_model_1.predict(encoded_model1_sentence.values()).flatten()
    predictions_2 = hs_detection_model_2.predict(encoded_model2_sentence.values()).flatten()
    return {'Hassrede': float(predictions_1[0])}, {'Hassrede': float(predictions_2[0])}

title = "HS-Detector Demonstrator (deutsch)"
description = """
<div style="float: none; overflow: hidden;">
<div style="display:block; width:100%;">
<center>
<div style="width:50%; float: left; display: inline-block;">
    <h2>Ausgangsmodell</h2>
    <p>Modell: Bert ('dbmdz/bert-base-german-cased')</p>
    <p>Dataset: germeval18_hasoc19_rp21_combi_dataset <br/> (77.161 Einträge mit einem Hassrede-Anteil von 17,7%)</p>
    <p>Fine-Tuning Parameter: 2 Epochen, 300 Token pro Eintrag, 2e-5 LR</p>

    Evaluationsergebnisse:
    Balanced Accuracy: 0.756
    (Accuracy: 0.880)
    Binary F1-Score: 0.625
    Binary Precision: 0.699
    Binary Recall: 0.565
    MCC score: 0.559
    AUROC score: 0.756
</div>
<div style="width:50%; float: left; display: inline-block;">
    <h2>Challenger-Modell</h2>
    <p>Modell: Bert ('dbmdz/bert-base-german-uncased')</p>
    <p>Dataset: germeval18_hasoc19_rp21_combi_dataset_no-url_no-address  <br/> (~77.161 Einträge mit einem Hassrede-Anteil von 17,7%)</p>
    <p>Fine-Tuning Parameter: 2 Epochen, 512 Token pro Eintrag, 2e-5 LR</p>

    Evaluationsergebnisse:
    Balanced Accuracy: 0.749
    (Accuracy: 0.867)
    Binary F1-Score: 0.602
    Binary Precision: 0.642
    Binary Recall: 0.567
    MCC score: 0.524
    AUROC score: 0.749
</div>
</center>
</div>
</div>
"""
# <p>Dataset: germeval18_hasoc19_rp21_glasebach22_combi_dataset_no-addr.csv <br/> (84.239 Einträge mit einem Hassrede-Anteil von 18,2%)</p>
article = """Die Eingaben werden nicht geloggt. Klassifikator einfach ausprobieren. 
Unter dem Button 'Ersteller' kann inspiziert werden, welche Satz-Bestandteile für die Modelle vermutlich entscheident waren. 
Dabei werden automatisiert Satzteile verändert und die Auswirkungen auf die jeweils abgefragten Predictions beobachtet."""

input_sentence_text = gr.inputs.Textbox(lines=5, placeholder="Geben Sie hier den Satz ein, der von den Modellen auf Hassrede geprüft werden soll.")
output_predictions = [gr.outputs.Label(label="Prediction of initial model", num_top_classes=1), gr.outputs.Label(label="Prediction of challenging model", num_top_classes=1)]
ui = gr.Interface(fn=model_inference, inputs=input_sentence_text, outputs=output_predictions, title=title, article=article, description=description, interpretation="default", 
                  flagging_options=["incorrect", "ambiguous", "other"], theme="huggingface", css=".confidence {color: black !important}")
ui.launch(enable_queue=True)