MSLars commited on
Commit
348749a
·
1 Parent(s): e0c3c35

Add application file

Browse files
.idea/.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
4
+ # Editor-based HTTP Client requests
5
+ /httpRequests/
6
+ # Datasource local storage ignored files
7
+ /dataSources/
8
+ /dataSources.local.xml
.idea/inspectionProfiles/profiles_settings.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
.idea/language_model_experiments.iml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
.idea/misc.xml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.13" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" />
7
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/language_model_experiments.iml" filepath="$PROJECT_DIR$/.idea/language_model_experiments.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
app.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # app.py
2
+
3
+ import gradio as gr
4
+ import torch
5
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
6
+ import pandas as pd
7
+
8
+ # --- 1. Modelle laden ---
9
+ # Wir laden die Modelle einmal beim Start der Anwendung, um die Ladezeit bei jeder Anfrage zu vermeiden.
10
+
11
+ # Modell 1: German GPT-2 für Text-Vervollständigung
12
+ # Wir laden hier Tokenizer und Modell manuell, da wir die Logits für das nächste Wort brauchen,
13
+ # was die Standard-Pipeline nicht direkt so ausgibt.
14
+ gpt2_model_name = "dbmdz/german-gpt2"
15
+ gpt2_tokenizer = AutoTokenizer.from_pretrained(gpt2_model_name)
16
+ # AutoModelWithLMHead ist veraltet, wir benutzen stattdessen AutoModelForCausalLM
17
+ gpt2_model = AutoModelForCausalLM.from_pretrained(gpt2_model_name)
18
+
19
+ # Modell 2: BERT für Masken-Füllung
20
+ # Hier können wir die Pipeline direkt nutzen, da sie genau das tut, was wir wollen.
21
+ unmasker = pipeline('fill-mask', model='bert-base-multilingual-uncased', top_k=5)
22
+
23
+
24
+ # --- 2. Logik-Funktionen für die Modelle ---
25
+
26
+ def predict_next_word(text):
27
+ """
28
+ Diese Funktion nimmt einen Text entgegen, tokenisiert ihn, gibt ihn an das GPT-2 Modell
29
+ und berechnet die Wahrscheinlichkeitsverteilung für das *unmittelbar* folgende Wort.
30
+ """
31
+ if not text or not text.strip():
32
+ return {}
33
+
34
+ # Text in Token-IDs umwandeln
35
+ inputs = gpt2_tokenizer(text, return_tensors='pt')
36
+
37
+ # Modell-Vorhersage ohne Gradientenberechnung (schneller)
38
+ with torch.no_grad():
39
+ logits = gpt2_model(**inputs).logits
40
+
41
+ # Wir interessieren uns nur für die Logits des letzten Tokens im Input
42
+ # Shape: [batch_size, sequence_length, vocab_size] -> wir nehmen das letzte Token
43
+ last_token_logits = logits[0, -1, :]
44
+
45
+ # Wende Softmax an, um Wahrscheinlichkeiten zu erhalten
46
+ probabilities = torch.nn.functional.softmax(last_token_logits, dim=-1)
47
+
48
+ # Finde die Top 5 wahrscheinlichsten Token-IDs und ihre Wahrscheinlichkeiten
49
+ top_k_probs, top_k_indices = torch.topk(probabilities, 5)
50
+
51
+ # Konvertiere die Token-IDs zurück in lesbare Tokens (Wörter)
52
+ top_k_tokens = gpt2_tokenizer.convert_ids_to_tokens(top_k_indices)
53
+
54
+ # Bereinige die Tokens (z.B. 'Ġ' entfernen, das für ein Leerzeichen steht)
55
+ cleaned_tokens = [token.replace('Ġ', '') for token in top_k_tokens]
56
+
57
+ # Erstelle ein Dictionary für die Ausgabe in Gradio
58
+ result_dict = {token: prob.item() for token, prob in zip(cleaned_tokens, top_k_probs)}
59
+
60
+ return result_dict
61
+
62
+
63
+ def fill_the_mask(text):
64
+ """
65
+ Diese Funktion nutzt die fill-mask Pipeline, um die wahrscheinlichsten Wörter für
66
+ das [MASK]-Token im Text zu finden.
67
+ """
68
+ # Überprüfen, ob das Masken-Token vorhanden ist
69
+ mask_token = unmasker.tokenizer.mask_token
70
+ if mask_token not in text:
71
+ # Einen Fehler in der Gradio-UI anzeigen
72
+ raise gr.Error(f"Die Eingabe muss das Masken-Token '{mask_token}' enthalten.")
73
+
74
+ # Pipeline aufrufen
75
+ predictions = unmasker(text)
76
+
77
+ # Die Ausgabe der Pipeline in ein Dictionary für Gradio umwandeln
78
+ # Die Pipeline liefert eine Liste von Dictionaries, wir formatieren sie um.
79
+ result_dict = {pred['token_str']: pred['score'] for pred in predictions}
80
+
81
+ return result_dict
82
+
83
+
84
+ # --- 3. Gradio Interface erstellen ---
85
+
86
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
87
+ gr.Markdown(
88
+ """
89
+ # Funktionalität von Language Models demonstrieren
90
+ Diese Anwendung zeigt die Kernfähigkeiten von zwei verschiedenen Arten von Transformer-Modellen:
91
+ 1. **Causal Language Models (z.B. GPT-2):** Diese Modelle sind darauf trainiert, das nächste Wort in einer Sequenz vorherzusagen. Sie sind ideal für die Textgenerierung.
92
+ 2. **Masked Language Models (z.B. BERT):** Diese Modelle lernen, fehlende Wörter in einem Satz zu ergänzen. Sie verstehen den Kontext in beide Richtungen (bidirektional) und sind stark in Klassifikations- oder Extraktionsaufgaben.
93
+ """
94
+ )
95
+
96
+ with gr.Tabs():
97
+ # --- Tab 1: Causal LM (GPT-2) ---
98
+ with gr.TabItem("1. Causal LM (Text-Vervollständigung)"):
99
+ gr.Markdown(
100
+ """
101
+ ## German GPT-2 (`dbmdz/german-gpt2`)
102
+ Dieses Modell sagt das wahrscheinlichste *nächste* Wort voraus.
103
+ ### Anleitung
104
+ Gib einen deutschen Satzanfang in das Textfeld ein und klicke auf "Nächstes Wort vorhersagen".
105
+ """
106
+ )
107
+ with gr.Row():
108
+ text_input_gpt = gr.Textbox(
109
+ label="Dein Satzanfang",
110
+ placeholder="Tippe hier...",
111
+ value="Der Sinn des Lebens ist",
112
+ lines=3
113
+ )
114
+
115
+ predict_button_gpt = gr.Button("Nächstes Wort vorhersagen")
116
+
117
+ gr.Markdown("### Wahrscheinlichste Folgewörter")
118
+ output_label_gpt = gr.Label(num_top_classes=5)
119
+
120
+ # --- Tab 2: Masked LM (BERT) ---
121
+ with gr.TabItem("2. Masked LM (Masken-Füllung)"):
122
+ gr.Markdown(
123
+ f"""
124
+ ## Multilingual BERT (`bert-base-multilingual-uncased`)
125
+ Dieses Modell füllt die Lücke, die durch ein sogenanntes "Masken-Token" (`{unmasker.tokenizer.mask_token}`) markiert ist.
126
+ ### Anleitung
127
+ Gib einen Satz mit dem Masken-Token `{unmasker.tokenizer.mask_token}` ein und klicke auf "Maske füllen".
128
+ """
129
+ )
130
+ with gr.Row():
131
+ text_input_bert = gr.Textbox(
132
+ label="Satz mit Maske",
133
+ placeholder="Tippe hier...",
134
+ value=f"Berlin ist die Hauptstadt von {unmasker.tokenizer.mask_token}.",
135
+ lines=3
136
+ )
137
+
138
+ fill_mask_button_bert = gr.Button("Maske füllen")
139
+
140
+ gr.Markdown("### Wahrscheinlichste Füllwörter")
141
+ output_label_bert = gr.Label(num_top_classes=5)
142
+
143
+ # --- 4. Events verknüpfen ---
144
+ predict_button_gpt.click(
145
+ fn=predict_next_word,
146
+ inputs=text_input_gpt,
147
+ outputs=output_label_gpt,
148
+ api_name="predict_next_word"
149
+ )
150
+
151
+ fill_mask_button_bert.click(
152
+ fn=fill_the_mask,
153
+ inputs=text_input_bert,
154
+ outputs=output_label_bert,
155
+ api_name="fill_mask"
156
+ )
157
+
158
+ # Anwendung starten
159
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ torch
3
+ transformers
4
+ pandas