Views
No views yet
Note: This is not a plug-and-play LLM tokenizer, but rather a raw statistical resource.
1tokenizer = AutoTokenizer.from_pretrained(
2 "transhumanist-already-exists/malyuk-uk-bpe-654k"
3)
4toks = tokenizer("Всі красиві зберігають оптимізм", add_special_tokens=False)
5print(toks.input_ids) # [11961, 41218, 33300, 63514]tokenizer.json Byte‐level tokenizer spec (vocab, merges, model settings).tokenizer_config.json Configuration metadata.special_tokens_map.json Mapping of special token (The same with Aya).readable_tokenizer_utf8.json Human-readable dump: UTF-8-decoded sub-tokens and merge rules, for corpus-linguistic inspection.vocab.json. Aya’s special tokens remain intact at the head.readable_tokenizer_utf8.json)1import os
2from datasets import load_dataset
3from tokenizers.pre_tokenizers import ByteLevel
4from transformers import AutoTokenizer
5
6os.environ["TOKENIZERS_PARALLELISM"] = "true"
7
8# Hyper-parameters
9MAX_VOCAB_SIZE = 1_000_000
10CORPUS_NAME = "lang-uk/malyuk"
11SEED = 42
12TEST_SET_SIZE = 100_000
13MIN_FREQUENCY = 500
14TOKENIZER_PATH = "./malyuk_uk_tokenizer"
15
16# 1) Load base Aya tokenizer and corpus
17tokenizer = AutoTokenizer.from_pretrained("CohereLabs/aya-expanse-32b")
18full_ds = load_dataset(CORPUS_NAME, split="train", cache_dir="./ds")
19ds = full_ds.remove_columns([c for c in full_ds.column_names if c != "text"])
20ds = ds.shuffle(seed=SEED)
21
22# 2) Skip the first TEST_SET_SIZE examples
23ds = ds.select(range(TEST_SET_SIZE, len(ds)))
24
25# 3) Define streaming iterator
26def batch_iterator(dataset, batch_size=500_000):
27 for batch in dataset.iter(batch_size=batch_size):
28 yield batch["text"]
29
30# 4) Train new tokenizer from iterator
31new_tok = tokenizer.train_new_from_iterator(
32 batch_iterator(ds),
33 vocab_size=MAX_VOCAB_SIZE,
34 length=len(ds),
35 new_special_tokens=list(tokenizer.added_tokens_encoder.keys()),
36 min_frequency=MIN_FREQUENCY,
37 initial_alphabet=ByteLevel.alphabet()
38)
39
40# 5) Save locally
41new_tok.save_pretrained(TOKENIZER_PATH)
42
43# 6) Small test
44malyuk_uk_tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
45test_dataset = full_ds.select(range(0, TEST_SET_SIZE))
46
47def tokenize_wrapper(tokenizer):
48 def batch_fn(examples):
49 outputs = tokenizer(
50 examples["text"],
51 padding=False,
52 truncation=False,
53 )
54 # list of token-counts, one per example
55 return {"tokens_count": [len(ids) for ids in outputs["input_ids"]]}
56 return batch_fn
57
58ds = test_dataset.map(tokenize_wrapper(malyuk_uk_tokenizer), batched=True, batch_size=20_000)
59print(f"malyuk_uk_tokenizer tokens count for 100_000 malyuk texts: {sum(ds['tokens_count'])}")| Tokenizer | Tokens for 100 000 texts |
|---|---|
| Malyuk (custom) | 33 959 222 |
| Aya Expanse-32B | 49 609 840 |
Please note: these are total token counts for the sample, would be more correct to measure per-word averages in future.
1@misc{zaduha2025post9138,
2 author = "{Bohdan Didenko}",
3 title = "{Post \#9138 on Telegram Channel Zaduha}",
4 howpublished = "\url{https://t.me/zaduha/9138}",
5 month = may,
6 year = {2025},
7 note = "[Online; accessed 22 May 2025]"
8}