| """Fix tokenizer v3: remove 32 BPE merges that produce tokens not in vocab (surgery orphans).""" |
| import json |
| from pathlib import Path |
|
|
| src = Path("tokenizer.json") |
| with open(src) as f: |
| t = json.load(f) |
|
|
| v = t["model"]["vocab"] |
| merges = t["model"]["merges"] |
| print(f"Before: vocab={len(v)} merges={len(merges)}") |
|
|
| clean_merges = [] |
| removed = [] |
| for m in merges: |
| if isinstance(m, list) and len(m) == 2: |
| comb = m[0] + m[1] |
| if comb in v: |
| clean_merges.append(m) |
| else: |
| removed.append((m, comb)) |
| else: |
| |
| clean_merges.append(m) |
|
|
| t["model"]["merges"] = clean_merges |
| print(f"After: vocab={len(v)} merges={len(clean_merges)} removed={len(removed)}") |
| print("Removed examples:") |
| for m, comb in removed[:15]: |
| print(f" {m} -> {comb!r}") |
|
|
| with open(src, "w", encoding="utf-8") as f: |
| json.dump(t, f, ensure_ascii=False) |
| print(f"Saved {src}") |
|
|
| |
| from tokenizers import Tokenizer |
| try: |
| tk = Tokenizer.from_file(str(src)) |
| print(f"LOAD OK vocab_size={tk.get_vocab_size()}") |
| |
| test = "Bonjour, je suis ARCHON. <|im_start|>system test<|im_end|>" |
| ids = tk.encode(test).ids |
| print(f"encode test: ids[:15]={ids[:15]} len={len(ids)}") |
| print(f"decode: {tk.decode(ids)!r}") |
| except Exception as e: |
| print(f"LOAD FAIL: {e}") |
|
|