Update train_tokenizer.py
Browse files- train_tokenizer.py +23 -16
train_tokenizer.py
CHANGED
@@ -1,37 +1,40 @@
|
|
|
|
1 |
from tokenizers import Tokenizer, decoders, models, normalizers, pre_tokenizers, trainers
|
2 |
from datasets import load_dataset
|
3 |
-
import re
|
4 |
|
5 |
-
#
|
|
|
6 |
code_regex = r"""(?x:
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
11 |
[<>]=?|\+\+|--|&&|\|\||[-+*/%=&|^~!]=?| # Operators
|
12 |
-
\d+\.?\d*|\.\d+|
|
13 |
-
[{}[\](),.;:]|
|
14 |
-
\p{L}+|\p{N}+|
|
15 |
-
\s+|
|
16 |
-
\S
|
17 |
)"""
|
18 |
|
19 |
def train_tokenizer(iterator, vocab_size=32000, min_frequency=2):
|
|
|
20 |
tokenizer = Tokenizer(models.BPE(unk_token="<unk>"))
|
21 |
|
22 |
-
#
|
23 |
tokenizer.normalizer = normalizers.Sequence([
|
24 |
normalizers.NFC(),
|
25 |
-
normalizers.StripAccents() #
|
26 |
])
|
27 |
|
28 |
-
#
|
29 |
tokenizer.pre_tokenizer = pre_tokenizers.Sequence([
|
30 |
-
pre_tokenizers.Regex(code_regex),
|
31 |
pre_tokenizers.ByteLevel(add_prefix_space=False)
|
32 |
])
|
33 |
|
34 |
-
#
|
35 |
trainer = trainers.BpeTrainer(
|
36 |
vocab_size=vocab_size,
|
37 |
min_frequency=min_frequency,
|
@@ -40,6 +43,10 @@ def train_tokenizer(iterator, vocab_size=32000, min_frequency=2):
|
|
40 |
show_progress=True
|
41 |
)
|
42 |
|
|
|
43 |
tokenizer.train_from_iterator(iterator, trainer=trainer)
|
|
|
|
|
44 |
tokenizer.decoder = decoders.ByteLevel()
|
|
|
45 |
return tokenizer
|
|
|
1 |
+
import regex # Χρησιμοποιείται για την υποστήριξη Unicode properties στο regex
|
2 |
from tokenizers import Tokenizer, decoders, models, normalizers, pre_tokenizers, trainers
|
3 |
from datasets import load_dataset
|
|
|
4 |
|
5 |
+
# Ορισμός custom regex για κώδικα και πολυγλωσσικό κείμενο.
|
6 |
+
# Χρησιμοποιεί το module regex που υποστηρίζει \p{L} και \p{N}.
|
7 |
code_regex = r"""(?x:
|
8 |
+
//.*?$| # Σχόλια τύπου //
|
9 |
+
/\*.*?\*/| # Σχόλια τύπου /* */
|
10 |
+
"(?:\\.|[^\\"])*"| # Strings με διπλά εισαγωγικά
|
11 |
+
'(?:\\.|[^\\'])*'| # Strings με μονά εισαγωγικά
|
12 |
+
\b(?:if|else|for|while|return|function)\b| # Κλειδικά για κώδικα
|
13 |
[<>]=?|\+\+|--|&&|\|\||[-+*/%=&|^~!]=?| # Operators
|
14 |
+
\d+\.?\d*|\.\d+| # Αριθμοί
|
15 |
+
[{}[\](),.;:]| # Σύμβολα
|
16 |
+
\p{L}+|\p{N}+| # Unicode γράμματα/αριθμοί
|
17 |
+
\s+| # Διαστήματα
|
18 |
+
\S # Οποιοσδήποτε άλλος χαρακτήρας
|
19 |
)"""
|
20 |
|
21 |
def train_tokenizer(iterator, vocab_size=32000, min_frequency=2):
|
22 |
+
# Δημιουργία του Tokenizer με το μοντέλο BPE και ειδικό token για Unknown.
|
23 |
tokenizer = Tokenizer(models.BPE(unk_token="<unk>"))
|
24 |
|
25 |
+
# Εφαρμογή normalization (NFC και αφαίρεση τόνων, αν χρειάζεται)
|
26 |
tokenizer.normalizer = normalizers.Sequence([
|
27 |
normalizers.NFC(),
|
28 |
+
normalizers.StripAccents() # Προαιρετικό: αφαιρεί τόνους
|
29 |
])
|
30 |
|
31 |
+
# Ορισμός custom pre-tokenizer με χρήση regex και ByteLevel
|
32 |
tokenizer.pre_tokenizer = pre_tokenizers.Sequence([
|
33 |
+
pre_tokenizers.Regex(pattern=code_regex),
|
34 |
pre_tokenizers.ByteLevel(add_prefix_space=False)
|
35 |
])
|
36 |
|
37 |
+
# Ορισμός του Trainer για το BPE
|
38 |
trainer = trainers.BpeTrainer(
|
39 |
vocab_size=vocab_size,
|
40 |
min_frequency=min_frequency,
|
|
|
43 |
show_progress=True
|
44 |
)
|
45 |
|
46 |
+
# Εκπαίδευση του tokenizer από iterator κειμένων
|
47 |
tokenizer.train_from_iterator(iterator, trainer=trainer)
|
48 |
+
|
49 |
+
# Ορισμός decoder ώστε να αντιστρέφεται σωστά η κωδικοποίηση
|
50 |
tokenizer.decoder = decoders.ByteLevel()
|
51 |
+
|
52 |
return tokenizer
|