Update app.py
Browse files
app.py
CHANGED
@@ -2,47 +2,58 @@ import gradio as gr
|
|
2 |
import numpy as np
|
3 |
import matplotlib.pyplot as plt
|
4 |
from io import BytesIO
|
|
|
|
|
|
|
5 |
from train_tokenizer import train_tokenizer
|
6 |
from tokenizers import Tokenizer
|
7 |
from datasets import load_dataset
|
8 |
-
import tempfile
|
9 |
-
import os
|
10 |
|
11 |
def create_iterator(files=None, dataset_name=None, split="train", streaming=True):
|
|
|
|
|
|
|
12 |
if dataset_name:
|
13 |
dataset = load_dataset(dataset_name, split=split, streaming=streaming)
|
14 |
for example in dataset:
|
|
|
15 |
yield example['text']
|
16 |
elif files:
|
17 |
for file in files:
|
18 |
with open(file.name, 'r', encoding='utf-8') as f:
|
19 |
for line in f:
|
20 |
-
|
|
|
21 |
|
22 |
def enhanced_validation(tokenizer, test_text):
|
|
|
|
|
|
|
23 |
encoded = tokenizer.encode(test_text)
|
24 |
decoded = tokenizer.decode(encoded.ids)
|
25 |
|
26 |
-
#
|
27 |
unknown_tokens = sum(1 for t in encoded.tokens if t == "<unk>")
|
28 |
-
unknown_percent = unknown_tokens / len(encoded.tokens) * 100 if encoded.tokens else 0
|
29 |
|
30 |
-
#
|
31 |
token_lengths = [len(t) for t in encoded.tokens]
|
32 |
avg_length = np.mean(token_lengths) if token_lengths else 0
|
33 |
|
34 |
-
# Έλεγχος
|
35 |
code_symbols = ['{', '}', '(', ')', ';', '//', 'printf']
|
36 |
-
code_coverage = {sym: sym in test_text and sym in encoded.tokens for sym in code_symbols}
|
37 |
|
38 |
-
# Δημιουργία histogram
|
39 |
fig = plt.figure()
|
40 |
-
plt.hist(token_lengths, bins=20)
|
41 |
-
plt.xlabel('Token
|
42 |
-
plt.ylabel('
|
|
|
43 |
img_buffer = BytesIO()
|
44 |
plt.savefig(img_buffer, format='png')
|
45 |
plt.close()
|
|
|
46 |
|
47 |
return {
|
48 |
"roundtrip_success": test_text == decoded,
|
@@ -53,11 +64,14 @@ def enhanced_validation(tokenizer, test_text):
|
|
53 |
}
|
54 |
|
55 |
def train_and_test(files, dataset_name, split, vocab_size, min_freq, test_text):
|
56 |
-
|
|
|
|
|
|
|
57 |
if not files and not dataset_name:
|
58 |
raise gr.Error("Πρέπει να παρέχετε αρχεία ή όνομα dataset!")
|
59 |
|
60 |
-
# Δημιουργία iterator με streaming
|
61 |
iterator = create_iterator(files, dataset_name, split)
|
62 |
|
63 |
try:
|
@@ -65,21 +79,21 @@ def train_and_test(files, dataset_name, split, vocab_size, min_freq, test_text):
|
|
65 |
except Exception as e:
|
66 |
raise gr.Error(f"Σφάλμα εκπαίδευσης: {str(e)}")
|
67 |
|
68 |
-
# Αποθήκευση και φόρτωση για
|
69 |
-
with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as
|
70 |
-
tokenizer.save(
|
71 |
-
trained_tokenizer = Tokenizer.from_file(
|
72 |
-
os.unlink(
|
73 |
|
74 |
-
# Εκτενής επικύρωση
|
75 |
validation = enhanced_validation(trained_tokenizer, test_text)
|
76 |
|
77 |
return {
|
78 |
-
"validation_metrics": {k:v for k,v in validation.items() if k != "token_length_distribution"},
|
79 |
"histogram": validation["token_length_distribution"]
|
80 |
}
|
81 |
|
82 |
-
# Gradio Interface
|
83 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
84 |
gr.Markdown("## Προχωρημένος BPE Tokenizer Trainer")
|
85 |
|
@@ -101,7 +115,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
101 |
|
102 |
with gr.Column():
|
103 |
results_json = gr.JSON(label="Μετρικές")
|
104 |
-
results_plot = gr.Image(label="Κατανομή
|
105 |
|
106 |
train_btn.click(
|
107 |
fn=train_and_test,
|
|
|
2 |
import numpy as np
|
3 |
import matplotlib.pyplot as plt
|
4 |
from io import BytesIO
|
5 |
+
import tempfile
|
6 |
+
import os
|
7 |
+
|
8 |
from train_tokenizer import train_tokenizer
|
9 |
from tokenizers import Tokenizer
|
10 |
from datasets import load_dataset
|
|
|
|
|
11 |
|
12 |
def create_iterator(files=None, dataset_name=None, split="train", streaming=True):
|
13 |
+
"""
|
14 |
+
Δημιουργεί έναν iterator που διαβάζει κείμενο είτε από τοπικά αρχεία είτε από Hugging Face Dataset.
|
15 |
+
"""
|
16 |
if dataset_name:
|
17 |
dataset = load_dataset(dataset_name, split=split, streaming=streaming)
|
18 |
for example in dataset:
|
19 |
+
# Αν το πεδίο με το κείμενο ονομάζεται διαφορετικά, τροποποιήστε εδώ
|
20 |
yield example['text']
|
21 |
elif files:
|
22 |
for file in files:
|
23 |
with open(file.name, 'r', encoding='utf-8') as f:
|
24 |
for line in f:
|
25 |
+
if line.strip():
|
26 |
+
yield line.strip()
|
27 |
|
28 |
def enhanced_validation(tokenizer, test_text):
|
29 |
+
"""
|
30 |
+
Εκτελεί επικύρωση του tokenizer με ένα roundtrip test και παρέχει στατιστικά.
|
31 |
+
"""
|
32 |
encoded = tokenizer.encode(test_text)
|
33 |
decoded = tokenizer.decode(encoded.ids)
|
34 |
|
35 |
+
# Μέτρηση των Unknown tokens
|
36 |
unknown_tokens = sum(1 for t in encoded.tokens if t == "<unk>")
|
37 |
+
unknown_percent = (unknown_tokens / len(encoded.tokens) * 100) if encoded.tokens else 0
|
38 |
|
39 |
+
# Υπολογισμός μήκους των tokens
|
40 |
token_lengths = [len(t) for t in encoded.tokens]
|
41 |
avg_length = np.mean(token_lengths) if token_lengths else 0
|
42 |
|
43 |
+
# Έλεγχος κάλυψης κώδικα: παραδείγματα συμβόλων
|
44 |
code_symbols = ['{', '}', '(', ')', ';', '//', 'printf']
|
45 |
+
code_coverage = {sym: (sym in test_text and sym in encoded.tokens) for sym in code_symbols}
|
46 |
|
47 |
+
# Δημιουργία histogram για την κατανομή του μήκους των tokens
|
48 |
fig = plt.figure()
|
49 |
+
plt.hist(token_lengths, bins=20, color='skyblue', edgecolor='black')
|
50 |
+
plt.xlabel('Μήκος Token')
|
51 |
+
plt.ylabel('Συχνότητα')
|
52 |
+
plt.title('Κατανομή Μήκους Tokens')
|
53 |
img_buffer = BytesIO()
|
54 |
plt.savefig(img_buffer, format='png')
|
55 |
plt.close()
|
56 |
+
img_buffer.seek(0)
|
57 |
|
58 |
return {
|
59 |
"roundtrip_success": test_text == decoded,
|
|
|
64 |
}
|
65 |
|
66 |
def train_and_test(files, dataset_name, split, vocab_size, min_freq, test_text):
|
67 |
+
"""
|
68 |
+
Συνδυάζει τη διαδικασία εκπαίδευσης του tokenizer και την επικύρωση του με ένα δοκιμαστικό κείμενο.
|
69 |
+
"""
|
70 |
+
# Επιβεβαίωση εισόδων: πρέπει να παρέχεται είτε αρχείο είτε όνομα dataset
|
71 |
if not files and not dataset_name:
|
72 |
raise gr.Error("Πρέπει να παρέχετε αρχεία ή όνομα dataset!")
|
73 |
|
74 |
+
# Δημιουργία iterator (με streaming για αποδοτική ανάγνωση)
|
75 |
iterator = create_iterator(files, dataset_name, split)
|
76 |
|
77 |
try:
|
|
|
79 |
except Exception as e:
|
80 |
raise gr.Error(f"Σφάλμα εκπαίδευσης: {str(e)}")
|
81 |
|
82 |
+
# Αποθήκευση και φόρτωση του tokenizer για επικύρωση
|
83 |
+
with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as tmp:
|
84 |
+
tokenizer.save(tmp.name)
|
85 |
+
trained_tokenizer = Tokenizer.from_file(tmp.name)
|
86 |
+
os.unlink(tmp.name)
|
87 |
|
88 |
+
# Εκτενής επικύρωση με το δοκιμαστικό κείμενο
|
89 |
validation = enhanced_validation(trained_tokenizer, test_text)
|
90 |
|
91 |
return {
|
92 |
+
"validation_metrics": {k: v for k, v in validation.items() if k != "token_length_distribution"},
|
93 |
"histogram": validation["token_length_distribution"]
|
94 |
}
|
95 |
|
96 |
+
# Δημιουργία του Gradio Interface
|
97 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
98 |
gr.Markdown("## Προχωρημένος BPE Tokenizer Trainer")
|
99 |
|
|
|
115 |
|
116 |
with gr.Column():
|
117 |
results_json = gr.JSON(label="Μετρικές")
|
118 |
+
results_plot = gr.Image(label="Κατανομή Μήκους Tokens")
|
119 |
|
120 |
train_btn.click(
|
121 |
fn=train_and_test,
|