import json class CharTokenizer: def __init__(self, vocab=None): if vocab is None: self.itos = [] else: self.itos = list(vocab) self.stoi = {ch: i for i, ch in enumerate(self.itos)} @classmethod def from_text(cls, text): return cls(sorted(set(text))) @property def vocab_size(self): return len(self.itos) def encode(self, text): return [self.stoi[ch] for ch in text if ch in self.stoi] def decode(self, ids): return "".join(self.itos[i] for i in ids) def save(self, path): with open(path, "w", encoding="utf-8") as f: json.dump(self.itos, f, ensure_ascii=False) @classmethod def load(cls, path): with open(path, encoding="utf-8") as f: return cls(json.load(f))