PythonSTB commited on
Commit
e208e57
·
verified ·
1 Parent(s): ef7e7bf

Upload tokenizers/Test_Tokenizers.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. tokenizers/Test_Tokenizers.py +250 -0
tokenizers/Test_Tokenizers.py ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test_Tokenizers.py - on-device validation for the tokenizers wheel.
4
+
5
+ Exercises the Rust/PyO3 binding: import, version, BPE train on a tiny
6
+ corpus + encode/decode roundtrip, models/normalizers/pre-tokenizers.
7
+ Exit code 0 = all tests passed, 1 = any FAIL.
8
+
9
+ Generated by RIMI
10
+ """
11
+ import sys
12
+
13
+ RESULTS = []
14
+
15
+
16
+ def test(name, fn):
17
+ try:
18
+ fn()
19
+ RESULTS.append(("PASS", name))
20
+ except NotImplementedError:
21
+ RESULTS.append(("SKIP", name))
22
+ except Exception as e:
23
+ RESULTS.append(("FAIL", name, str(e)))
24
+
25
+
26
+ def section(title):
27
+ print("\n===== %s =====" % title)
28
+
29
+
30
+ def check(cond, msg):
31
+ if not cond:
32
+ raise AssertionError(msg)
33
+
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # 1. imports + versions
37
+ # ---------------------------------------------------------------------------
38
+ def test_import_tokenizers():
39
+ import tokenizers
40
+ check(hasattr(tokenizers, "__version__"), "no __version__")
41
+ print(" tokenizers version:", tokenizers.__version__)
42
+ check(tokenizers.__version__ == "0.23.2", "version != 0.23.2")
43
+
44
+
45
+ def test_import_submodules():
46
+ import tokenizers.models
47
+ import tokenizers.trainers
48
+ import tokenizers.pre_tokenizers
49
+ import tokenizers.normalizers
50
+ import tokenizers.processors
51
+ import tokenizers.decoders
52
+ print(" submodules: models/trainers/pre_tokenizers/normalizers/processors/decoders OK")
53
+
54
+
55
+ def test_import_tokenizer_class():
56
+ from tokenizers import Tokenizer
57
+ check(callable(Tokenizer), "Tokenizer not callable")
58
+ print(" Tokenizer class OK")
59
+
60
+
61
+ # ---------------------------------------------------------------------------
62
+ # 2. BPE train on tiny corpus + encode/decode roundtrip
63
+ # ---------------------------------------------------------------------------
64
+ _TINY_CORPUS = [
65
+ "Hello world, this is a test.",
66
+ "Tokenizers are fast and versatile.",
67
+ "Hello again, another test sentence.",
68
+ "BPE training on a tiny corpus.",
69
+ "The quick brown fox jumps over the lazy dog.",
70
+ ]
71
+
72
+ _TRAIN_FILES = ["/tmp/tok_train.txt"]
73
+
74
+
75
+ def _write_corpus():
76
+ # Scripts dir on device is writable; fall back to current dir
77
+ import os
78
+ for cand in ("/tmp/tok_train.txt", "tok_train.txt"):
79
+ try:
80
+ with open(cand, "w", encoding="utf-8") as fh:
81
+ for line in _TINY_CORPUS:
82
+ fh.write(line + "\n")
83
+ return cand
84
+ except OSError:
85
+ continue
86
+ raise AssertionError("cannot write training corpus")
87
+
88
+
89
+ def test_bpe_train():
90
+ from tokenizers import Tokenizer
91
+ from tokenizers.models import BPE
92
+ from tokenizers.trainers import BpeTrainer
93
+ from tokenizers.pre_tokenizers import Whitespace
94
+
95
+ path = _write_corpus()
96
+ tok = Tokenizer(BPE(unk_token="[UNK]"))
97
+ tok.pre_tokenizer = Whitespace()
98
+ trainer = BpeTrainer(vocab_size=200, special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"])
99
+ tok.train([path], trainer)
100
+ vs = tok.get_vocab_size()
101
+ check(vs > 0, "vocab size 0")
102
+ print(" BPE trained, vocab size:", vs)
103
+
104
+
105
+ def test_encode_decode_roundtrip():
106
+ from tokenizers import Tokenizer
107
+ from tokenizers.models import BPE
108
+ from tokenizers.trainers import BpeTrainer
109
+ from tokenizers.pre_tokenizers import Whitespace
110
+
111
+ path = _write_corpus()
112
+ tok = Tokenizer(BPE(unk_token="[UNK]"))
113
+ tok.pre_tokenizer = Whitespace()
114
+ trainer = BpeTrainer(vocab_size=200, special_tokens=["[UNK]"])
115
+ tok.train([path], trainer)
116
+ text = "Hello world, BPE roundtrip test."
117
+ enc = tok.encode(text)
118
+ check(len(enc.ids) > 0, "no ids")
119
+ check(len(enc.tokens) > 0, "no tokens")
120
+ dec = tok.decode(enc.ids)
121
+ check(isinstance(dec, str) and len(dec) > 0, "empty decode")
122
+ # roundtrip: decoded text must contain the key words (whitespace split)
123
+ check("Hello" in dec, "roundtrip lost 'Hello': %r" % dec)
124
+ print(" ids:", enc.ids[:10])
125
+ print(" tokens:", enc.tokens[:10])
126
+ print(" decoded:", dec)
127
+
128
+
129
+ def test_encode_batch():
130
+ from tokenizers import Tokenizer
131
+ from tokenizers.models import BPE
132
+ from tokenizers.trainers import BpeTrainer
133
+ from tokenizers.pre_tokenizers import Whitespace
134
+
135
+ path = _write_corpus()
136
+ tok = Tokenizer(BPE(unk_token="[UNK]"))
137
+ tok.pre_tokenizer = Whitespace()
138
+ tok.train([path], BpeTrainer(vocab_size=200, special_tokens=["[UNK]"]))
139
+ encs = tok.encode_batch(_TINY_CORPUS[:3])
140
+ check(len(encs) == 3, "batch len")
141
+ check(all(len(e.ids) > 0 for e in encs), "empty batch ids")
142
+ print(" batch ok:", [len(e.ids) for e in encs])
143
+
144
+
145
+ # ---------------------------------------------------------------------------
146
+ # 3. WordLevel + save/load roundtrip
147
+ # ---------------------------------------------------------------------------
148
+ def test_wordlevel():
149
+ from tokenizers import Tokenizer
150
+ from tokenizers.models import WordLevel
151
+ from tokenizers.pre_tokenizers import WhitespaceSplit
152
+
153
+ tok = Tokenizer(WordLevel(vocab={"hello": 0, "world": 1, "[UNK]": 2}, unk_token="[UNK]"))
154
+ tok.pre_tokenizer = WhitespaceSplit()
155
+ enc = tok.encode("hello world")
156
+ check(enc.ids == [0, 1], "wordlevel ids %r" % (enc.ids,))
157
+ print(" WordLevel ids:", enc.ids)
158
+
159
+
160
+ def test_save_load():
161
+ import os
162
+ import tempfile
163
+ from tokenizers import Tokenizer
164
+ from tokenizers.models import BPE
165
+ from tokenizers.trainers import BpeTrainer
166
+ from tokenizers.pre_tokenizers import Whitespace
167
+
168
+ path = _write_corpus()
169
+ tok = Tokenizer(BPE(unk_token="[UNK]"))
170
+ tok.pre_tokenizer = Whitespace()
171
+ tok.train([path], BpeTrainer(vocab_size=200, special_tokens=["[UNK]"]))
172
+ tmpd = tempfile.mkdtemp()
173
+ fp = os.path.join(tmpd, "tok.json")
174
+ tok.save(fp)
175
+ check(os.path.isfile(fp), "save missing")
176
+ tok2 = Tokenizer.from_file(fp)
177
+ check(tok2.get_vocab_size() == tok.get_vocab_size(), "vocab mismatch after load")
178
+ print(" save/load vocab:", tok2.get_vocab_size())
179
+
180
+
181
+ # ---------------------------------------------------------------------------
182
+ # 4. normalizers / pre-tokenizers / processors / decoders
183
+ # ---------------------------------------------------------------------------
184
+ def test_normalizer():
185
+ from tokenizers import Tokenizer
186
+ from tokenizers.models import WordLevel
187
+ from tokenizers.normalizers import Lowercase
188
+ from tokenizers.pre_tokenizers import Whitespace
189
+
190
+ tok = Tokenizer(WordLevel(vocab={"hello": 0, "world": 1, "[UNK]": 2}, unk_token="[UNK]"))
191
+ tok.normalizer = Lowercase()
192
+ tok.pre_tokenizer = Whitespace()
193
+ enc = tok.encode("HELLO WORLD")
194
+ check(enc.ids == [0, 1], "lowercase ids %r" % (enc.ids,))
195
+ print(" Lowercase normalizer OK")
196
+
197
+
198
+ def test_bert_processing():
199
+ from tokenizers import Tokenizer
200
+ from tokenizers.models import WordPiece
201
+ from tokenizers.processors import BertProcessing
202
+
203
+ tok = Tokenizer(WordPiece(vocab={"hello": 0, "world": 1, "[UNK]": 2, "[CLS]": 3, "[SEP]": 4}, unk_token="[UNK]"))
204
+ tok.post_processor = BertProcessing(("[SEP]", 4), ("[CLS]", 3))
205
+ enc = tok.encode("hello world")
206
+ check(enc.ids[0] == 3 and enc.ids[-1] == 4, "bert ids %r" % (enc.ids,))
207
+ print(" BertProcessing ids:", enc.ids)
208
+
209
+
210
+ # ---------------------------------------------------------------------------
211
+ # main
212
+ # ---------------------------------------------------------------------------
213
+ def main():
214
+ section("1. imports + versions")
215
+ test("import tokenizers", test_import_tokenizers)
216
+ test("import submodules", test_import_submodules)
217
+ test("Tokenizer class", test_import_tokenizer_class)
218
+
219
+ section("2. BPE train + roundtrip")
220
+ test("BPE train tiny corpus", test_bpe_train)
221
+ test("encode/decode roundtrip", test_encode_decode_roundtrip)
222
+ test("encode_batch", test_encode_batch)
223
+
224
+ section("3. models + serialization")
225
+ test("WordLevel", test_wordlevel)
226
+ test("save/load", test_save_load)
227
+
228
+ section("4. pipeline pieces")
229
+ test("Lowercase normalizer", test_normalizer)
230
+ test("BertProcessing", test_bert_processing)
231
+
232
+ section("RESULT")
233
+ n_ok = n_fail = n_skip = 0
234
+ for r in RESULTS:
235
+ status = r[0]
236
+ if status == "PASS":
237
+ n_ok += 1
238
+ print(" OK %s" % r[1])
239
+ elif status == "SKIP":
240
+ n_skip += 1
241
+ print(" SKIP %s" % r[1])
242
+ else:
243
+ n_fail += 1
244
+ print(" FAIL %s: %s" % (r[1], r[2]))
245
+ print("RESULT: %d ok, %d failed, %d skipped" % (n_ok, n_fail, n_skip))
246
+ sys.exit(1 if n_fail else 0)
247
+
248
+
249
+ if __name__ == "__main__":
250
+ main()