tymbos commited on
Commit
e1e86f9
·
verified ·
1 Parent(s): 869fcd2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -23
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
- yield line.strip()
 
21
 
22
  def enhanced_validation(tokenizer, test_text):
 
 
 
23
  encoded = tokenizer.encode(test_text)
24
  decoded = tokenizer.decode(encoded.ids)
25
 
26
- # Ανάλυση Unknown Tokens
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
- # Κατανομή μηκών tokens
31
  token_lengths = [len(t) for t in encoded.tokens]
32
  avg_length = np.mean(token_lengths) if token_lengths else 0
33
 
34
- # Έλεγχος code coverage
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 Length')
42
- plt.ylabel('Frequency')
 
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
- # Αποθήκευση και φόρτωση για validation
69
- with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as f:
70
- tokenizer.save(f.name)
71
- trained_tokenizer = Tokenizer.from_file(f.name)
72
- os.unlink(f.name)
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="Κατανομή Μηκών Tokens")
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,