QDHShamiro commited on
Commit
8f61432
·
verified ·
1 Parent(s): 0ce0aa6

Upload code/tokenizer.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. code/tokenizer.py +63 -0
code/tokenizer.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ from pathlib import Path
3
+
4
+ from tokenizers import Tokenizer, models, trainers, pre_tokenizers, decoders
5
+
6
+ VOCAB_SIZE = 32000
7
+ SPECIAL_TOKENS = ["<pad>", "<unk>", "<bos>", "<eos>"]
8
+
9
+
10
+ class BPETokenizer:
11
+ def __init__(self, tokenizer: Tokenizer):
12
+ self._tok = tokenizer
13
+
14
+ @property
15
+ def vocab_size(self) -> int:
16
+ return self._tok.get_vocab_size()
17
+
18
+ def encode(self, text: str) -> list[int]:
19
+ return self._tok.encode(text).ids
20
+
21
+ def decode(self, ids) -> str:
22
+ return self._tok.decode(list(ids))
23
+
24
+ def save(self, path: Path):
25
+ self._tok.save(str(path))
26
+
27
+ @classmethod
28
+ def load(cls, path: Path) -> "BPETokenizer":
29
+ return cls(Tokenizer.from_file(str(path)))
30
+
31
+ @classmethod
32
+ def build_from_text(cls, text: str, vocab_size: int = VOCAB_SIZE) -> "BPETokenizer":
33
+ tok = Tokenizer(models.BPE(unk_token="<unk>"))
34
+ tok.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=True)
35
+ tok.decoder = decoders.ByteLevel()
36
+ trainer = trainers.BpeTrainer(
37
+ vocab_size=vocab_size,
38
+ special_tokens=SPECIAL_TOKENS,
39
+ min_frequency=2,
40
+ )
41
+ tok.train_from_iterator(_chunk(text), trainer=trainer)
42
+ return cls(tok)
43
+
44
+ @classmethod
45
+ def build_from_files(cls, paths: list[Path], vocab_size: int = VOCAB_SIZE) -> "BPETokenizer":
46
+ tok = Tokenizer(models.BPE(unk_token="<unk>"))
47
+ tok.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=True)
48
+ tok.decoder = decoders.ByteLevel()
49
+ trainer = trainers.BpeTrainer(
50
+ vocab_size=vocab_size,
51
+ special_tokens=SPECIAL_TOKENS,
52
+ min_frequency=2,
53
+ )
54
+ tok.train([str(p) for p in paths], trainer=trainer)
55
+ return cls(tok)
56
+
57
+
58
+ def _chunk(text: str, size: int = 1_000_000):
59
+ for i in range(0, len(text), size):
60
+ yield text[i:i + size]
61
+
62
+
63
+ CharTokenizer = BPETokenizer