Promote v0.3.1 to main (4-domain SOTA at 100k vocab)
Browse files- BENCHMARK.md +26 -127
- README.md +127 -187
- bench_results.json +515 -0
- tokenizer.json +0 -0
BENCHMARK.md
CHANGED
|
@@ -1,127 +1,26 @@
|
|
| 1 |
-
# SARFTokenizer Benchmark
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
| 5 | google/gemma-3-1b-pt | 262,145 | 2.833 | 3.069 | 0.923 | 2.04 | 2.30 |
|
| 28 |
-
| 6 | google/gemma-2-2b | 256,000 | 2.779 | 3.117 | 0.892 | 2.08 | 2.27 |
|
| 29 |
-
| 7 | QCRI/Fanar-1-9B-Instruct | 128,256 | 2.778 | 3.047 | 0.911 | 2.08 | 2.32 |
|
| 30 |
-
| 8 | Qwen/Qwen2.5-0.5B | 151,665 | 2.583 | 2.923 | 0.884 | 2.24 | 2.42 |
|
| 31 |
-
| 9 | hammh0a/Hala-350M | 64,400 | 2.219 | 3.220 | 0.689 | 2.61 | 2.20 |
|
| 32 |
-
| 10 | tiktoken/cl100k_base (GPT-4) | 100,277 | 1.429 | 3.066 | 0.466 | 4.05 | 2.31 |
|
| 33 |
-
| 11 | tiiuae/falcon-7b | 65,024 | 0.991 | 2.720 | 0.364 | 5.84 | 2.60 |
|
| 34 |
-
|
| 35 |
-
## v0.2 vs v0.1 (same vocab tier)
|
| 36 |
-
|
| 37 |
-
| Metric | v0.1 (BPE) | v0.2 (Unigram) | Δ |
|
| 38 |
-
|---|---:|---:|---:|
|
| 39 |
-
| Vocab | 62,912 | 65,000 | +3% |
|
| 40 |
-
| AR chars/token | 3.262 | **3.683** | **+12.9%** |
|
| 41 |
-
| EN chars/token | 2.729 | **3.522** | **+29.1%** |
|
| 42 |
-
| Parity | 1.196 | **1.046** | –12.5% toward 1.0 |
|
| 43 |
-
| AR tokens/word | 1.77 | **1.57** | **–11.3%** |
|
| 44 |
-
| EN tokens/word | 2.59 | **2.01** | **–22.4%** |
|
| 45 |
-
|
| 46 |
-
v0.2 wins on every axis: better Arabic compression, massively better English compression, and tighter balance.
|
| 47 |
-
|
| 48 |
-
## Same-class comparison (62k – 66k vocab)
|
| 49 |
-
|
| 50 |
-
| Tokenizer | Vocab | AR CpT | EN CpT | Parity |
|
| 51 |
-
|---|---:|---:|---:|---:|
|
| 52 |
-
| **SARFTokenizer v0.2** | **65,000** | **3.683** | **3.522** | **1.046** |
|
| 53 |
-
| SARFTokenizer v0.1 | 62,912 | 3.262 | 2.729 | 1.196 |
|
| 54 |
-
| ALLaM-7B-Instruct-preview | 64,000 | 2.854 | 2.518 | 1.133 |
|
| 55 |
-
| hammh0a/Hala-350M | 64,400 | 2.219 | 3.220 | 0.689 |
|
| 56 |
-
| tiiuae/falcon-7b | 65,024 | 0.991 | 2.720 | 0.364 |
|
| 57 |
-
|
| 58 |
-
v0.2 leads every peer in its vocab class on AR CpT, EN CpT, and parity simultaneously.
|
| 59 |
-
|
| 60 |
-
## Findings
|
| 61 |
-
|
| 62 |
-
**First tokenizer to beat GPT-4o on both Arabic AND English at 1/3 the vocab.** o200k_base (200k vocab) scores 3.087 AR / 3.409 EN. SARFTokenizer v0.2 (65k) scores 3.683 AR / 3.522 EN — +19.3% AR, +3.3% EN at 32.5% of the vocab size.
|
| 63 |
-
|
| 64 |
-
**Parity 1.046 — closest-to-1 ever observed in this benchmark.** v0.2 is the first tokenizer to simultaneously (a) lead on Arabic CpT, (b) lead on English CpT for its vocab tier, and (c) have parity within 5% of perfect balance.
|
| 65 |
-
|
| 66 |
-
**Unigram LM beats BPE on bilingual Arabic+English at 65k vocab** — +12.9% AR, +29.1% EN over a well-tuned parity-aware BPE pipeline. Matches the findings of "Rethinking Tokenization for Rich Morphology" (arXiv:2508.08424) and AraToken (arXiv:2512.18399).
|
| 67 |
-
|
| 68 |
-
**Vocab size is not the bottleneck at 65k with Unigram** — Gemma's 256k vocab (2.779 AR) loses to our 65k. Allocation quality matters more than size.
|
| 69 |
-
|
| 70 |
-
**Every public SOTA Arabic-multilingual tokenizer tested uses BPE.** Falcon, ALLaM, Jais, Fanar, Qwen, Hala all ship BPE variants. Unigram at a bilingual 65k budget is the underexplored SOTA regime — v0.2 demonstrates the gap.
|
| 71 |
-
|
| 72 |
-
## Design notes for v0.2
|
| 73 |
-
|
| 74 |
-
- **Model**: HuggingFace-native `tokenizers.models.Unigram`, trained via `UnigramTrainer`.
|
| 75 |
-
- **Training corpus**: 500M chars from `deeplatent-hq-bilingual`, 50/50 AR/EN balanced, document-capped at 8000 chars and further chunked at 1500 chars per training sample.
|
| 76 |
-
- **Pre-tokenizer**: `Metaspace(replacement="▁", prepend_scheme="always")` — SentencePiece-style whitespace marker. Preserves word+space as single unit, no whitespace fragmentation.
|
| 77 |
-
- **Normalizer**: AraToken-style `Sequence` of NFKC → Alef unification (4 variants → bare ا) → Ya maksura → Ya → tashkeel strip → tatweel strip → zero-width + bidi strip → Arabic-Indic digits → ASCII.
|
| 78 |
-
- **Decoder**: `Metaspace`.
|
| 79 |
-
- **Special tokens**: `<s>`, `</s>`, `<unk>`, `<pad>`.
|
| 80 |
-
- **No MYTE / PUA / morpheme preprocessing** — Unigram's EM pruning recovers morphological segmentation natively.
|
| 81 |
-
|
| 82 |
-
## Interpretation
|
| 83 |
-
|
| 84 |
-
For bilingual Arabic/English deployment, SARFTokenizer v0.2's combination of:
|
| 85 |
-
|
| 86 |
-
- **65k total vocab** (embedding-table savings vs 128k–262k competitors)
|
| 87 |
-
- **Arabic CpT above GPT-4o's 200k vocab** (+19.3%)
|
| 88 |
-
- **English CpT above GPT-4o at 1/3 the vocab** (+3.3%)
|
| 89 |
-
- **Parity 1.046** (near-perfect cross-lingual balance)
|
| 90 |
-
- **Loads via `AutoTokenizer.from_pretrained` cleanly** (no `trust_remote_code`)
|
| 91 |
-
- **No external preprocessing required** — all normalization embedded
|
| 92 |
-
|
| 93 |
-
makes it the strongest public bilingual Arabic-English tokenizer below the 100k vocab tier.
|
| 94 |
-
|
| 95 |
-
## Reproducibility
|
| 96 |
-
|
| 97 |
-
```bash
|
| 98 |
-
# Train v0.2 (Unigram)
|
| 99 |
-
uv run -m scripts.tok_train_unigram \
|
| 100 |
-
--data_dir=/path/to/deeplatent-hq-bilingual \
|
| 101 |
-
--output_dir=./tokenizer_unigram_65k \
|
| 102 |
-
--vocab_size=65000 \
|
| 103 |
-
--max_chars=500000000 \
|
| 104 |
-
--doc_cap=8000 \
|
| 105 |
-
--chunk_max_chars=1500
|
| 106 |
-
|
| 107 |
-
# Verify
|
| 108 |
-
uv run -m scripts.verify_baked_tokenizer \
|
| 109 |
-
--baked_tokenizer_json=./tokenizer_unigram_65k/tokenizer.json \
|
| 110 |
-
--morf_map_path=./morfessor_models/morf_map.json \
|
| 111 |
-
--tokenizer_dir=./tokenizer_unigram_65k \
|
| 112 |
-
--tokenizer_type=unigram
|
| 113 |
-
|
| 114 |
-
# Benchmark
|
| 115 |
-
uv run -m scripts.bench_tokenizers \
|
| 116 |
-
--hf_json ./tokenizer_unigram_65k/tokenizer.json:SARFTokenizer-v0.2 \
|
| 117 |
-
--tiktoken o200k_base cl100k_base \
|
| 118 |
-
--hf_repo Qwen/Qwen2.5-0.5B tiiuae/falcon-7b google/gemma-2-2b \
|
| 119 |
-
google/gemma-3-1b-pt ALLaM-AI/ALLaM-7B-Instruct-preview \
|
| 120 |
-
QCRI/Fanar-1-9B-Instruct hammh0a/Hala-350M \
|
| 121 |
-
--output bench/results.json
|
| 122 |
-
```
|
| 123 |
-
|
| 124 |
-
## Version history
|
| 125 |
-
|
| 126 |
-
- **v0.2** (2026-04): Unigram LM at 65k vocab with AraToken normalization. Beats GPT-4o on both AR and EN at 1/3 vocab.
|
| 127 |
-
- **v0.1** (2026-04): MYTE + Parity-aware BPE at 62,912 vocab with 14k Arabic morpheme atomic tokens.
|
|
|
|
| 1 |
+
# SARFTokenizer v0.3.1 — Full Benchmark
|
| 2 |
+
|
| 3 |
+
15-tokenizer comparison on a 1,200-document held-out 4-domain eval (300 AR + 300 EN + 300 math + 300 code), each doc capped at 2,000 characters. `add_special_tokens=False`, no external preprocessing.
|
| 4 |
+
|
| 5 |
+
| Rank | Tokenizer | Vocab | AR CpT | EN CpT | MATH CpT | CODE CpT | Parity AR/EN |
|
| 6 |
+
|---:|---|--:|--:|--:|--:|--:|--:|
|
| 7 |
+
| 🥇 | **SARFTokenizer v0.3.1** | **100,000** | **4.004** | **3.733** | **4.243** | **4.200** | **1.073** |
|
| 8 |
+
| 2 | SARFTokenizer v0.2 | 65,000 | 3.683 | 3.522 | 3.922 | 3.913 | 1.046 |
|
| 9 |
+
| 3 | SARFTokenizer v0.3 | 80,000 | 3.192 | 3.631 | 4.259 | 4.224 | 0.879 |
|
| 10 |
+
| 4 | Qwen3.6-35B-A3B | 248,077 | 3.129 | 2.985 | 3.233 | 3.432 | 1.048 |
|
| 11 |
+
| 5 | tiktoken/o200k_base (GPT-4o) | 200,019 | 3.087 | 3.409 | 3.505 | 3.622 | 0.906 |
|
| 12 |
+
| 6 | ALLaM-7B-Instruct-preview | 64,000 | 2.854 | 2.518 | 3.000 | 3.250 | 1.133 |
|
| 13 |
+
| 7 | google/gemma-4-31B-it | 262,144 | 2.833 | 3.069 | 3.242 | 3.383 | 0.923 |
|
| 14 |
+
| 7t | google/gemma-3-1b-pt | 262,145 | 2.833 | 3.069 | 3.242 | 3.384 | 0.923 |
|
| 15 |
+
| 9 | google/gemma-2-2b | 256,000 | 2.779 | 3.117 | 3.269 | 3.383 | 0.892 |
|
| 16 |
+
| 10 | QCRI/Fanar-1-9B | 128,256 | 2.778 | 3.047 | 3.221 | 3.346 | 0.911 |
|
| 17 |
+
| 11 | Qwen2.5-0.5B | 151,665 | 2.583 | 2.923 | 3.299 | 3.512 | 0.884 |
|
| 18 |
+
| 12 | Hala-350M | 64,400 | 2.219 | 3.220 | 3.367 | 3.477 | 0.689 |
|
| 19 |
+
| 13 | Kimi-K2.6 | 163,840 | 2.074 | 3.239 | 3.520 | 3.630 | 0.640 |
|
| 20 |
+
| 14 | tiktoken/cl100k_base (GPT-4) | 100,277 | 1.429 | 3.066 | 3.479 | 3.607 | 0.466 |
|
| 21 |
+
| 15 | Falcon-7B | 65,024 | 0.991 | 2.720 | 3.108 | 3.210 | 0.364 |
|
| 22 |
+
|
| 23 |
+
CpT = chars per token (higher is better).
|
| 24 |
+
Parity = AR CpT / EN CpT (1.0 = perfect cross-lingual balance, > 1 = Arabic-favored).
|
| 25 |
+
|
| 26 |
+
Raw per-tokenizer per-domain metrics: `bench_results.json`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -10,67 +10,98 @@ tags:
|
|
| 10 |
- bilingual
|
| 11 |
- arabic
|
| 12 |
- english
|
|
|
|
|
|
|
| 13 |
- sentencepiece-style
|
| 14 |
library_name: tokenizers
|
| 15 |
---
|
| 16 |
|
| 17 |
-
# SARFTokenizer v0.
|
| 18 |
|
| 19 |
-
A
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
## The headline — what we actually claim
|
| 22 |
|
| 23 |
-
**
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
|
| 34 |
-
|
|
| 35 |
-
|
|
| 36 |
-
|
|
| 37 |
-
|
|
| 38 |
-
|
|
| 39 |
-
|
|
| 40 |
-
|
|
| 41 |
-
|
|
| 42 |
-
|
|
| 43 |
-
|
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
###
|
| 52 |
-
|
| 53 |
-
|
|
| 54 |
-
|---|--:|--:|--:|
|
| 55 |
-
|
|
| 56 |
-
| **
|
| 57 |
-
| **
|
| 58 |
-
| **
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
## Why this matters
|
| 62 |
|
| 63 |
-
- **Arabic-first deployments**:
|
| 64 |
-
|
| 65 |
-
- **
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
## Caveats we want you to know
|
| 68 |
|
| 69 |
-
1. **
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
---
|
| 76 |
|
|
@@ -79,127 +110,64 @@ Full honest writeup: [`FAIR_BENCHMARK.md`](./FAIR_BENCHMARK.md).
|
|
| 79 |
| Property | Value |
|
| 80 |
|---|---|
|
| 81 |
| Model | Unigram LM (HuggingFace `tokenizers.models.Unigram`) |
|
| 82 |
-
| Vocabulary size |
|
| 83 |
| Pre-tokenizer | Metaspace (`▁` marker, SentencePiece-style) |
|
| 84 |
-
| Normalizer | AraToken-style: NFKC → Alef
|
| 85 |
| Special tokens | `<s>`, `</s>`, `<unk>`, `<pad>` |
|
| 86 |
-
|
|
| 87 |
-
| Training
|
|
|
|
| 88 |
| Public API | `AutoTokenizer.from_pretrained` without `trust_remote_code` |
|
| 89 |
|
| 90 |
---
|
| 91 |
|
| 92 |
## Quick start
|
| 93 |
|
| 94 |
-
### Colab (private repo, with token)
|
| 95 |
-
|
| 96 |
```python
|
| 97 |
-
from huggingface_hub import login
|
| 98 |
from transformers import AutoTokenizer
|
| 99 |
-
from google.colab import userdata
|
| 100 |
-
|
| 101 |
-
hf_token = userdata.get("HF-Token")
|
| 102 |
-
login(token=hf_token, add_to_git_credential=False) # sets global auth
|
| 103 |
-
|
| 104 |
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer")
|
| 105 |
-
print(
|
| 106 |
-
print(tok.decode(tok.encode("المعلم يشرح الدرس."), skip_special_tokens=True))
|
| 107 |
```
|
| 108 |
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
### Local environment (no token)
|
| 112 |
|
| 113 |
```python
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer")
|
| 117 |
-
print("vocab:", tok.vocab_size)
|
| 118 |
-
```
|
| 119 |
|
| 120 |
-
#
|
|
|
|
| 121 |
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
from transformers import AutoTokenizer
|
| 125 |
-
|
| 126 |
-
local = snapshot_download("almaghrabima/SARFTokenizer")
|
| 127 |
-
tok = AutoTokenizer.from_pretrained(local)
|
| 128 |
```
|
| 129 |
|
| 130 |
-
##
|
| 131 |
|
| 132 |
```python
|
| 133 |
from tokenizers import Tokenizer
|
|
|
|
| 134 |
|
| 135 |
-
tok
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
add_special_tokens=False,
|
| 139 |
-
)
|
| 140 |
-
print(out.tokens)
|
| 141 |
-
# → ['▁The', '▁student', '▁reads', '▁a', '▁book.', '▁الطالب', '▁يقرأ', '▁كتابا', '.']
|
| 142 |
-
```
|
| 143 |
-
|
| 144 |
-
### Batch encoding for training
|
| 145 |
-
|
| 146 |
-
```python
|
| 147 |
-
batch = tok(
|
| 148 |
-
["السلام عليكم", "Hello world"],
|
| 149 |
-
padding=True, truncation=True, max_length=128,
|
| 150 |
-
return_tensors="pt",
|
| 151 |
-
)
|
| 152 |
```
|
| 153 |
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
## Reproduce the benchmark (fair OOD version)
|
| 157 |
-
|
| 158 |
-
The exact 600-document OOD eval corpus is published at [`almaghrabima/SARFTokenizer-benchmark-eval`](https://huggingface.co/datasets/almaghrabima/SARFTokenizer-benchmark-eval).
|
| 159 |
|
| 160 |
-
|
| 161 |
-
from datasets import load_dataset
|
| 162 |
-
from transformers import AutoTokenizer
|
| 163 |
-
from huggingface_hub import login
|
| 164 |
-
login(token="your_hf_token", add_to_git_credential=False)
|
| 165 |
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
en_texts = [r["text"] for r in ds if r["language"] == "en"]
|
| 171 |
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
ar_t = sum(len(tok.encode(t, add_special_tokens=False)) for t in ar_texts)
|
| 175 |
-
en_t = sum(len(tok.encode(t, add_special_tokens=False)) for t in en_texts)
|
| 176 |
-
print(f"AR CpT={ar_c/ar_t:.3f} EN CpT={en_c/en_t:.3f} Parity={(ar_c/ar_t)/(en_c/en_t):.3f}")
|
| 177 |
-
```
|
| 178 |
|
| 179 |
-
|
| 180 |
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
```python
|
| 184 |
-
from transformers import AutoTokenizer
|
| 185 |
-
|
| 186 |
-
sarf = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer")
|
| 187 |
-
gemma = AutoTokenizer.from_pretrained("google/gemma-4-31B-it")
|
| 188 |
-
qwen = AutoTokenizer.from_pretrained("Qwen/Qwen3.6-35B-A3B")
|
| 189 |
-
kimi = AutoTokenizer.from_pretrained("moonshotai/Kimi-K2.6", trust_remote_code=True)
|
| 190 |
-
|
| 191 |
-
text = "your text here"
|
| 192 |
-
for name, t in [("SARF v0.2", sarf), ("Gemma-4", gemma),
|
| 193 |
-
("Qwen3.6", qwen), ("Kimi-K2.6", kimi)]:
|
| 194 |
-
ids = t.encode(text, add_special_tokens=False)
|
| 195 |
-
print(f"{name:<14} vocab={len(t):>7,} tokens={len(ids):>5} CpT={len(text)/len(ids):.3f}")
|
| 196 |
-
```
|
| 197 |
-
|
| 198 |
-
---
|
| 199 |
-
|
| 200 |
-
## Normalization applied at encode time
|
| 201 |
-
|
| 202 |
-
All Arabic text is normalized at encode time by the embedded normalizer:
|
| 203 |
|
| 204 |
- **NFKC** compat normalization
|
| 205 |
- **Tashkeel** (`U+064B`–`U+0652`, `U+0670`) removed
|
|
@@ -209,18 +177,9 @@ All Arabic text is normalized at encode time by the embedded normalizer:
|
|
| 209 |
- **Alef Maksura** `ى` → Ya `ي`
|
| 210 |
- **Arabic-Indic digits** (`٠`–`٩`) → ASCII `0`–`9`
|
| 211 |
|
| 212 |
-
Encoding is lossy on diacritics and Alef-Hamza variants — by design. If your
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
```python
|
| 217 |
-
from tokenizers import Tokenizer
|
| 218 |
-
tok = Tokenizer.from_pretrained("almaghrabima/SARFTokenizer")
|
| 219 |
-
print(tok.normalizer.normalize_str("الْمَعْلَمُ إلى آل أمَّة ١٢٣"))
|
| 220 |
-
# → "المعلم الي ال امة 123"
|
| 221 |
-
```
|
| 222 |
-
|
| 223 |
-
---
|
| 224 |
|
| 225 |
## Special tokens
|
| 226 |
|
|
@@ -231,55 +190,36 @@ print(tok.normalizer.normalize_str("الْمَعْلَمُ إلى آل أمَّ
|
|
| 231 |
| `<unk>` | unknown (byte fallback) |
|
| 232 |
| `<pad>` | padding |
|
| 233 |
|
| 234 |
-
---
|
| 235 |
-
|
| 236 |
## Why Unigram?
|
| 237 |
|
| 238 |
-
Recent literature (AraToken arXiv:2512.18399
|
| 239 |
-
|
| 240 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
|
| 242 |
---
|
| 243 |
|
| 244 |
## Files
|
| 245 |
|
| 246 |
-
- `tokenizer.json` — HuggingFace-format tokenizer (
|
| 247 |
-
- `tokenizer_config.json` —
|
| 248 |
-
- `special_tokens_map.json` — special tokens
|
| 249 |
-
- `BENCHMARK.md` —
|
| 250 |
-
- `
|
| 251 |
-
- `benchmark_results.json` — raw per-tokenizer metrics (in-domain)
|
| 252 |
-
- `benchmark_results_2026flagships.json` — raw metrics for Gemma-4, Qwen3.6, Kimi-K2.6
|
| 253 |
-
- `fair_benchmark_results.json` — raw OOD FineWeb metrics for all 13 tokenizers
|
| 254 |
-
|
| 255 |
-
## Related datasets
|
| 256 |
-
|
| 257 |
-
- [`almaghrabima/SARFTokenizer-benchmark-eval`](https://huggingface.co/datasets/almaghrabima/SARFTokenizer-benchmark-eval) — 300 AR + 300 EN documents used for the in-domain benchmark (public, 474 KB)
|
| 258 |
-
|
| 259 |
-
---
|
| 260 |
-
|
| 261 |
-
## Troubleshooting
|
| 262 |
-
|
| 263 |
-
### `OSError: ... is not a local folder and is not a valid model identifier`
|
| 264 |
|
| 265 |
-
|
| 266 |
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
Same root cause. Use `login()` or `snapshot_download()` → load from local path.
|
| 270 |
-
|
| 271 |
-
### `401 Unauthorized` but `whoami` worked
|
| 272 |
-
|
| 273 |
-
Token valid but `AutoConfig` not forwarding it. Use `login()` to set auth globally.
|
| 274 |
-
|
| 275 |
-
---
|
| 276 |
|
| 277 |
## Version history
|
| 278 |
|
| 279 |
-
- **v0.
|
| 280 |
-
- **v0.
|
| 281 |
-
|
| 282 |
-
---
|
| 283 |
|
| 284 |
## License
|
| 285 |
|
|
|
|
| 10 |
- bilingual
|
| 11 |
- arabic
|
| 12 |
- english
|
| 13 |
+
- math
|
| 14 |
+
- code
|
| 15 |
- sentencepiece-style
|
| 16 |
library_name: tokenizers
|
| 17 |
---
|
| 18 |
|
| 19 |
+
# SARFTokenizer v0.3.1 — 4-domain (AR / EN / Math / Code) at 100k vocab
|
| 20 |
|
| 21 |
+
A 4-domain tokenizer at **100,000 vocabulary** built on HuggingFace's Unigram LM
|
| 22 |
+
with the AraToken-style normalization pipeline. Adds **math** and **code** to
|
| 23 |
+
the bilingual AR/EN coverage of [v0.2](https://huggingface.co/almaghrabima/SARFTokenizer/tree/v0.2)
|
| 24 |
+
**without regressing Arabic** — and pushes Arabic CpT to **4.004**, the highest
|
| 25 |
+
we have measured on any tokenizer at any vocab size.
|
| 26 |
|
| 27 |
## The headline — what we actually claim
|
| 28 |
|
| 29 |
+
**SOTA on every domain at any published vocab tier.** v0.3.1 is simultaneously
|
| 30 |
+
the best Arabic, best English, best math, and best code tokenizer we have
|
| 31 |
+
measured, beating GPT-4o (200k vocab) on every domain at half the vocab size.
|
| 32 |
+
|
| 33 |
+
### Benchmark — 1,200-document held-out 4-domain eval
|
| 34 |
+
|
| 35 |
+
300 docs each of Arabic, English, math (FineMath-4plus), code (Nemotron-Code).
|
| 36 |
+
2,000-char cap per doc. `add_special_tokens=False`. No external preprocessing —
|
| 37 |
+
each tokenizer's own normalizer/pre-tokenizer runs naturally.
|
| 38 |
+
|
| 39 |
+
| Rank | Tokenizer | Vocab | AR | EN | MATH | CODE | Parity AR/EN |
|
| 40 |
+
|---:|---|--:|--:|--:|--:|--:|--:|
|
| 41 |
+
| **🥇** | **SARFTokenizer v0.3.1** | **100,000** | **4.004** | **3.733** | **4.243** | **4.200** | **1.073** |
|
| 42 |
+
| 2 | SARFTokenizer v0.2 | 65,000 | 3.683 | 3.522 | 3.922 | 3.913 | 1.046 |
|
| 43 |
+
| 3 | SARFTokenizer v0.3 | 80,000 | 3.192 | 3.631 | 4.259 | 4.224 | 0.879 |
|
| 44 |
+
| 4 | Qwen3.6-35B-A3B | 248,077 | 3.129 | 2.985 | 3.233 | 3.432 | 1.048 |
|
| 45 |
+
| 5 | tiktoken/o200k_base (GPT-4o, GPT-5) | 200,019 | 3.087 | 3.409 | 3.505 | 3.622 | 0.906 |
|
| 46 |
+
| 6 | ALLaM-7B-Instruct-preview | 64,000 | 2.854 | 2.518 | 3.000 | 3.250 | 1.133 |
|
| 47 |
+
| 7 | google/gemma-4-31B-it | 262,144 | 2.833 | 3.069 | 3.242 | 3.383 | 0.923 |
|
| 48 |
+
| 7t | google/gemma-3-1b-pt | 262,145 | 2.833 | 3.069 | 3.242 | 3.384 | 0.923 |
|
| 49 |
+
| 9 | google/gemma-2-2b | 256,000 | 2.779 | 3.117 | 3.269 | 3.383 | 0.892 |
|
| 50 |
+
| 10 | QCRI/Fanar-1-9B-Instruct | 128,256 | 2.778 | 3.047 | 3.221 | 3.346 | 0.911 |
|
| 51 |
+
| 11 | Qwen2.5-0.5B | 151,665 | 2.583 | 2.923 | 3.299 | 3.512 | 0.884 |
|
| 52 |
+
| 12 | Hala-350M | 64,400 | 2.219 | 3.220 | 3.367 | 3.477 | 0.689 |
|
| 53 |
+
| 13 | Kimi-K2.6 | 163,840 | 2.074 | 3.239 | 3.520 | 3.630 | 0.640 |
|
| 54 |
+
| 14 | tiktoken/cl100k_base (GPT-4) | 100,277 | 1.429 | 3.066 | 3.479 | 3.607 | 0.466 |
|
| 55 |
+
| 15 | Falcon-7B | 65,024 | 0.991 | 2.720 | 3.108 | 3.210 | 0.364 |
|
| 56 |
+
|
| 57 |
+
### v0.3.1 vs the best peer per domain
|
| 58 |
+
|
| 59 |
+
| Domain | v0.3.1 | Best peer | Δ |
|
| 60 |
+
|---|--:|--:|--:|
|
| 61 |
+
| Arabic | **4.004** | Qwen3.6-35B (3.129) | **+27.9%** |
|
| 62 |
+
| English | **3.733** | GPT-4o `o200k_base` (3.409) | **+9.5%** |
|
| 63 |
+
| Math | **4.243** | GPT-4o `o200k_base` (3.505) | **+21.0%** |
|
| 64 |
+
| Code | **4.200** | GPT-4o `o200k_base` (3.622) | **+16.0%** |
|
| 65 |
+
|
| 66 |
+
### v0.3.1 vs prior SARFTokenizer revisions
|
| 67 |
+
|
| 68 |
+
| Domain | v0.2 (65k) | v0.3 (80k) | **v0.3.1 (100k)** | Δ vs v0.2 |
|
| 69 |
+
|---|--:|--:|--:|--:|
|
| 70 |
+
| Arabic | 3.683 | 3.192 | **4.004** | **+8.7%** |
|
| 71 |
+
| English | 3.522 | 3.631 | **3.733** | **+6.0%** |
|
| 72 |
+
| Math | 3.922 | 4.259 | 4.243 | **+8.2%** |
|
| 73 |
+
| Code | 3.913 | 4.224 | 4.200 | +7.3% |
|
| 74 |
+
|
| 75 |
+
The 100k vocab gives Arabic ~50,000 effective slots (vs v0.2's 32,500 at 65k),
|
| 76 |
+
and the 250M-char Arabic training share matches v0.2 exactly — so AR strictly
|
| 77 |
+
gains from the larger vocab while math/code retain v0.3-class compression.
|
| 78 |
|
| 79 |
## Why this matters
|
| 80 |
|
| 81 |
+
- **Arabic-first deployments**: 4.004 AR CpT means ~30% more Arabic context in
|
| 82 |
+
the same window vs GPT-4o, ~9% more vs our own v0.2.
|
| 83 |
+
- **Bilingual + technical domains**: math and code now first-class — strong
|
| 84 |
+
compression on Python, math word problems, and formal reasoning chains.
|
| 85 |
+
- **Vocab specialization > vocab size**: at 100k we beat models with 200k–262k
|
| 86 |
+
vocabularies on every domain.
|
| 87 |
+
- **Same infrastructure**: `AutoTokenizer.from_pretrained` without
|
| 88 |
+
`trust_remote_code`, no Python preprocessing.
|
| 89 |
|
| 90 |
## Caveats we want you to know
|
| 91 |
|
| 92 |
+
1. **Lossy Arabic normalization (inherited from v0.2).** Tashkeel, Alef variants,
|
| 93 |
+
Ya Maksura, and Indic digits are normalized at encode time. Not suitable
|
| 94 |
+
for Qur'anic text or classical poetry with full diacritics.
|
| 95 |
+
2. **Math is web-style.** Trained on FineMath-4plus — natural-language math
|
| 96 |
+
web text, not LaTeX-heavy formal mathematics.
|
| 97 |
+
3. **Code is Python-leaning.** Trained on Nemotron-Code, dominated by Python
|
| 98 |
+
competitive-programming solutions with `<think>` reasoning. Less common
|
| 99 |
+
languages may fall back to byte-level pieces more often.
|
| 100 |
+
4. **Larger embedding table.** 100k × hidden_dim is ~50% bigger than the v0.2
|
| 101 |
+
65k row table. Worth it if you can afford the parameters; if not, see
|
| 102 |
+
[v0.2](https://huggingface.co/almaghrabima/SARFTokenizer/tree/v0.2) (AR/EN
|
| 103 |
+
only) or [v0.3](https://huggingface.co/almaghrabima/SARFTokenizer/tree/v0.3)
|
| 104 |
+
(4-domain at 80k with AR regression).
|
| 105 |
|
| 106 |
---
|
| 107 |
|
|
|
|
| 110 |
| Property | Value |
|
| 111 |
|---|---|
|
| 112 |
| Model | Unigram LM (HuggingFace `tokenizers.models.Unigram`) |
|
| 113 |
+
| Vocabulary size | **100,000** |
|
| 114 |
| Pre-tokenizer | Metaspace (`▁` marker, SentencePiece-style) |
|
| 115 |
+
| Normalizer | AraToken-style: NFKC → Alef/Ya unification → tashkeel/tatweel/zero-width strip → Indic digits → ASCII |
|
| 116 |
| Special tokens | `<s>`, `</s>`, `<unk>`, `<pad>` |
|
| 117 |
+
| Domains | Arabic + English + Math + Code |
|
| 118 |
+
| Training corpus | 500M chars (250 AR / 100 EN / 75 math / 75 code) |
|
| 119 |
+
| Training corpus repo | [`almaghrabima/deeplatent-labeled`](https://huggingface.co/datasets/almaghrabima/deeplatent-labeled) |
|
| 120 |
| Public API | `AutoTokenizer.from_pretrained` without `trust_remote_code` |
|
| 121 |
|
| 122 |
---
|
| 123 |
|
| 124 |
## Quick start
|
| 125 |
|
|
|
|
|
|
|
| 126 |
```python
|
|
|
|
| 127 |
from transformers import AutoTokenizer
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer")
|
| 129 |
+
print(tok.vocab_size) # 100000
|
|
|
|
| 130 |
```
|
| 131 |
|
| 132 |
+
To pin to a specific revision:
|
|
|
|
|
|
|
| 133 |
|
| 134 |
```python
|
| 135 |
+
# v0.3.1 (latest, 100k, 4-domain, this revision)
|
| 136 |
+
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer", revision="v0.3.1")
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
+
# v0.3 (80k, 4-domain — accepts AR regression for smaller vocab)
|
| 139 |
+
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer", revision="v0.3")
|
| 140 |
|
| 141 |
+
# v0.2 (65k, AR/EN only — original SOTA-Arabic release)
|
| 142 |
+
tok = AutoTokenizer.from_pretrained("almaghrabima/SARFTokenizer", revision="v0.2")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
```
|
| 144 |
|
| 145 |
+
## Low-level `tokenizers` API
|
| 146 |
|
| 147 |
```python
|
| 148 |
from tokenizers import Tokenizer
|
| 149 |
+
tok = Tokenizer.from_pretrained("almaghrabima/SARFTokenizer") # main = v0.3.1
|
| 150 |
|
| 151 |
+
print(tok.encode("المعلم يشرح الدرس في الصف اليوم.", add_special_tokens=False).tokens)
|
| 152 |
+
print(tok.encode("def fib(n):\n return n if n<2 else fib(n-1)+fib(n-2)",
|
| 153 |
+
add_special_tokens=False).tokens)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
```
|
| 155 |
|
| 156 |
+
## Reproduce the benchmark
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
|
| 158 |
+
The eval set (300 AR + 300 EN + 300 math + 300 code) is built from:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 159 |
|
| 160 |
+
- **AR/EN**: the [`SARFTokenizer-benchmark-eval`](https://huggingface.co/datasets/almaghrabima/SARFTokenizer-benchmark-eval) dataset.
|
| 161 |
+
- **Math**: held-out tail of `HuggingFaceTB/finemath` (`finemath-4plus`).
|
| 162 |
+
- **Code**: held-out tail of `saurabh5/nemotron-post-training-dataset-v1-code`
|
| 163 |
+
with role markers stripped (problem + solution flattened with `\n\n`).
|
|
|
|
| 164 |
|
| 165 |
+
Each doc capped at 2000 chars, no normalization beyond what each tokenizer
|
| 166 |
+
applies internally.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
|
| 168 |
+
## Normalization (lossy on Arabic, by design)
|
| 169 |
|
| 170 |
+
All Arabic text is normalized at encode time:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
|
| 172 |
- **NFKC** compat normalization
|
| 173 |
- **Tashkeel** (`U+064B`–`U+0652`, `U+0670`) removed
|
|
|
|
| 177 |
- **Alef Maksura** `ى` → Ya `ي`
|
| 178 |
- **Arabic-Indic digits** (`٠`–`٩`) → ASCII `0`–`9`
|
| 179 |
|
| 180 |
+
Encoding is lossy on diacritics and Alef-Hamza variants — by design. If your
|
| 181 |
+
downstream task requires preserving these (classical poetry with full
|
| 182 |
+
diacritics, Qur'anic text), this tokenizer is not suitable.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
|
| 184 |
## Special tokens
|
| 185 |
|
|
|
|
| 190 |
| `<unk>` | unknown (byte fallback) |
|
| 191 |
| `<pad>` | padding |
|
| 192 |
|
|
|
|
|
|
|
| 193 |
## Why Unigram?
|
| 194 |
|
| 195 |
+
Recent literature (AraToken arXiv:2512.18399; "Rethinking Tokenization for Rich
|
| 196 |
+
Morphology" arXiv:2508.08424) finds Unigram LM outperforms BPE on
|
| 197 |
+
morphologically rich languages because its EM-based pruning recovers morphology
|
| 198 |
+
implicitly — no explicit morpheme preprocessing required. v0.3.1 confirms the
|
| 199 |
+
finding extends to math and code: at 100k vocab the model discovers strong
|
| 200 |
+
multi-character pieces for AR words, EN tokens, math notation, and Python
|
| 201 |
+
identifiers in a single homogeneous lattice.
|
| 202 |
|
| 203 |
---
|
| 204 |
|
| 205 |
## Files
|
| 206 |
|
| 207 |
+
- `tokenizer.json` — HuggingFace-format tokenizer (6.6 MB)
|
| 208 |
+
- `tokenizer_config.json` — `PreTrainedTokenizerFast` config
|
| 209 |
+
- `special_tokens_map.json` — special tokens map
|
| 210 |
+
- `BENCHMARK.md` — full results across 15 tokenizers (this README's table)
|
| 211 |
+
- `bench_results.json` — raw per-tokenizer per-domain metrics
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 212 |
|
| 213 |
+
## Related
|
| 214 |
|
| 215 |
+
- Training corpus: [`almaghrabima/deeplatent-labeled`](https://huggingface.co/datasets/almaghrabima/deeplatent-labeled) — 4-domain labeled pretraining corpus
|
| 216 |
+
- Eval corpus (AR/EN portion): [`almaghrabima/SARFTokenizer-benchmark-eval`](https://huggingface.co/datasets/almaghrabima/SARFTokenizer-benchmark-eval) — 300 AR + 300 EN held-out documents
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 217 |
|
| 218 |
## Version history
|
| 219 |
|
| 220 |
+
- **v0.3.1** (latest, this revision) — 100k vocab, 4-domain. SOTA on AR/EN/math/code.
|
| 221 |
+
- **v0.3** — 80k vocab, 4-domain. Math/code SOTA but AR regresses vs v0.2.
|
| 222 |
+
- **v0.2** — 65k vocab, AR/EN only. Original release; SOTA Arabic at sub-100k tier.
|
|
|
|
| 223 |
|
| 224 |
## License
|
| 225 |
|
bench_results.json
ADDED
|
@@ -0,0 +1,515 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"eval": "/tmp/v03_eval/eval.parquet",
|
| 3 |
+
"results": [
|
| 4 |
+
{
|
| 5 |
+
"name": "SARFTokenizer v0.3.1",
|
| 6 |
+
"vocab": 100000,
|
| 7 |
+
"by_label": {
|
| 8 |
+
"arabic": {
|
| 9 |
+
"chars": 479808,
|
| 10 |
+
"words": 82964,
|
| 11 |
+
"tokens": 119828,
|
| 12 |
+
"cpt": 4.004139266281671,
|
| 13 |
+
"tpw": 1.4443373029265705
|
| 14 |
+
},
|
| 15 |
+
"english": {
|
| 16 |
+
"chars": 69308,
|
| 17 |
+
"words": 9805,
|
| 18 |
+
"tokens": 18568,
|
| 19 |
+
"cpt": 3.73265833692374,
|
| 20 |
+
"tpw": 1.8937276899541051
|
| 21 |
+
},
|
| 22 |
+
"math": {
|
| 23 |
+
"chars": 518667,
|
| 24 |
+
"words": 91001,
|
| 25 |
+
"tokens": 122248,
|
| 26 |
+
"cpt": 4.242744257574766,
|
| 27 |
+
"tpw": 1.3433698530785376
|
| 28 |
+
},
|
| 29 |
+
"code": {
|
| 30 |
+
"chars": 600000,
|
| 31 |
+
"words": 115473,
|
| 32 |
+
"tokens": 142865,
|
| 33 |
+
"cpt": 4.1997690127043015,
|
| 34 |
+
"tpw": 1.237215626163692
|
| 35 |
+
}
|
| 36 |
+
}
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"name": "SARFTokenizer v0.3",
|
| 40 |
+
"vocab": 80000,
|
| 41 |
+
"by_label": {
|
| 42 |
+
"arabic": {
|
| 43 |
+
"chars": 479808,
|
| 44 |
+
"words": 82964,
|
| 45 |
+
"tokens": 150332,
|
| 46 |
+
"cpt": 3.191655801825293,
|
| 47 |
+
"tpw": 1.8120148498143773
|
| 48 |
+
},
|
| 49 |
+
"english": {
|
| 50 |
+
"chars": 69308,
|
| 51 |
+
"words": 9805,
|
| 52 |
+
"tokens": 19088,
|
| 53 |
+
"cpt": 3.6309723386420787,
|
| 54 |
+
"tpw": 1.9467618561958184
|
| 55 |
+
},
|
| 56 |
+
"math": {
|
| 57 |
+
"chars": 518667,
|
| 58 |
+
"words": 91001,
|
| 59 |
+
"tokens": 121769,
|
| 60 |
+
"cpt": 4.259433846052772,
|
| 61 |
+
"tpw": 1.3381061746574214
|
| 62 |
+
},
|
| 63 |
+
"code": {
|
| 64 |
+
"chars": 600000,
|
| 65 |
+
"words": 115473,
|
| 66 |
+
"tokens": 142051,
|
| 67 |
+
"cpt": 4.223835101477638,
|
| 68 |
+
"tpw": 1.2301663592354923
|
| 69 |
+
}
|
| 70 |
+
}
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"name": "SARFTokenizer v0.2",
|
| 74 |
+
"vocab": 65000,
|
| 75 |
+
"by_label": {
|
| 76 |
+
"arabic": {
|
| 77 |
+
"chars": 479808,
|
| 78 |
+
"words": 82964,
|
| 79 |
+
"tokens": 130289,
|
| 80 |
+
"cpt": 3.6826439684086916,
|
| 81 |
+
"tpw": 1.570428137505424
|
| 82 |
+
},
|
| 83 |
+
"english": {
|
| 84 |
+
"chars": 69308,
|
| 85 |
+
"words": 9805,
|
| 86 |
+
"tokens": 19681,
|
| 87 |
+
"cpt": 3.5215690259641277,
|
| 88 |
+
"tpw": 2.0072412034676184
|
| 89 |
+
},
|
| 90 |
+
"math": {
|
| 91 |
+
"chars": 518667,
|
| 92 |
+
"words": 91001,
|
| 93 |
+
"tokens": 132253,
|
| 94 |
+
"cpt": 3.921778712014094,
|
| 95 |
+
"tpw": 1.4533136998494522
|
| 96 |
+
},
|
| 97 |
+
"code": {
|
| 98 |
+
"chars": 600000,
|
| 99 |
+
"words": 115473,
|
| 100 |
+
"tokens": 153321,
|
| 101 |
+
"cpt": 3.913358248380848,
|
| 102 |
+
"tpw": 1.3277649320620404
|
| 103 |
+
}
|
| 104 |
+
}
|
| 105 |
+
},
|
| 106 |
+
{
|
| 107 |
+
"name": "Qwen3.6-35B-A3B",
|
| 108 |
+
"vocab": 248077,
|
| 109 |
+
"by_label": {
|
| 110 |
+
"arabic": {
|
| 111 |
+
"chars": 479808,
|
| 112 |
+
"words": 82964,
|
| 113 |
+
"tokens": 153331,
|
| 114 |
+
"cpt": 3.129230227416504,
|
| 115 |
+
"tpw": 1.8481630586760522
|
| 116 |
+
},
|
| 117 |
+
"english": {
|
| 118 |
+
"chars": 69308,
|
| 119 |
+
"words": 9805,
|
| 120 |
+
"tokens": 23217,
|
| 121 |
+
"cpt": 2.985226342766077,
|
| 122 |
+
"tpw": 2.3678735339112698
|
| 123 |
+
},
|
| 124 |
+
"math": {
|
| 125 |
+
"chars": 518667,
|
| 126 |
+
"words": 91001,
|
| 127 |
+
"tokens": 160453,
|
| 128 |
+
"cpt": 3.2325166871295643,
|
| 129 |
+
"tpw": 1.7632004043911604
|
| 130 |
+
},
|
| 131 |
+
"code": {
|
| 132 |
+
"chars": 600000,
|
| 133 |
+
"words": 115473,
|
| 134 |
+
"tokens": 174818,
|
| 135 |
+
"cpt": 3.4321408550606916,
|
| 136 |
+
"tpw": 1.5139296632113135
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
},
|
| 140 |
+
{
|
| 141 |
+
"name": "GPT-4o (o200k_base)",
|
| 142 |
+
"vocab": 200019,
|
| 143 |
+
"by_label": {
|
| 144 |
+
"arabic": {
|
| 145 |
+
"chars": 479808,
|
| 146 |
+
"words": 82964,
|
| 147 |
+
"tokens": 155409,
|
| 148 |
+
"cpt": 3.0873887612686524,
|
| 149 |
+
"tpw": 1.8732100670170195
|
| 150 |
+
},
|
| 151 |
+
"english": {
|
| 152 |
+
"chars": 69308,
|
| 153 |
+
"words": 9805,
|
| 154 |
+
"tokens": 20332,
|
| 155 |
+
"cpt": 3.4088136927011607,
|
| 156 |
+
"tpw": 2.0736359000509945
|
| 157 |
+
},
|
| 158 |
+
"math": {
|
| 159 |
+
"chars": 518667,
|
| 160 |
+
"words": 91001,
|
| 161 |
+
"tokens": 147972,
|
| 162 |
+
"cpt": 3.505169897007542,
|
| 163 |
+
"tpw": 1.6260480654058747
|
| 164 |
+
},
|
| 165 |
+
"code": {
|
| 166 |
+
"chars": 600000,
|
| 167 |
+
"words": 115473,
|
| 168 |
+
"tokens": 165658,
|
| 169 |
+
"cpt": 3.621919858986587,
|
| 170 |
+
"tpw": 1.434603760186364
|
| 171 |
+
}
|
| 172 |
+
}
|
| 173 |
+
},
|
| 174 |
+
{
|
| 175 |
+
"name": "ALLaM-7B-Instruct",
|
| 176 |
+
"vocab": 64000,
|
| 177 |
+
"by_label": {
|
| 178 |
+
"arabic": {
|
| 179 |
+
"chars": 479808,
|
| 180 |
+
"words": 82964,
|
| 181 |
+
"tokens": 168111,
|
| 182 |
+
"cpt": 2.854114245944644,
|
| 183 |
+
"tpw": 2.0263126175208526
|
| 184 |
+
},
|
| 185 |
+
"english": {
|
| 186 |
+
"chars": 69308,
|
| 187 |
+
"words": 9805,
|
| 188 |
+
"tokens": 27522,
|
| 189 |
+
"cpt": 2.5182762880604606,
|
| 190 |
+
"tpw": 2.8069352371239162
|
| 191 |
+
},
|
| 192 |
+
"math": {
|
| 193 |
+
"chars": 518667,
|
| 194 |
+
"words": 91001,
|
| 195 |
+
"tokens": 172904,
|
| 196 |
+
"cpt": 2.9997397399713135,
|
| 197 |
+
"tpw": 1.9000230766694872
|
| 198 |
+
},
|
| 199 |
+
"code": {
|
| 200 |
+
"chars": 600000,
|
| 201 |
+
"words": 115473,
|
| 202 |
+
"tokens": 184611,
|
| 203 |
+
"cpt": 3.2500771893332465,
|
| 204 |
+
"tpw": 1.5987373671767426
|
| 205 |
+
}
|
| 206 |
+
}
|
| 207 |
+
},
|
| 208 |
+
{
|
| 209 |
+
"name": "google/gemma-4-31B-it",
|
| 210 |
+
"vocab": 262144,
|
| 211 |
+
"by_label": {
|
| 212 |
+
"arabic": {
|
| 213 |
+
"chars": 479808,
|
| 214 |
+
"words": 82964,
|
| 215 |
+
"tokens": 169379,
|
| 216 |
+
"cpt": 2.8327478613051205,
|
| 217 |
+
"tpw": 2.041596355045562
|
| 218 |
+
},
|
| 219 |
+
"english": {
|
| 220 |
+
"chars": 69308,
|
| 221 |
+
"words": 9805,
|
| 222 |
+
"tokens": 22580,
|
| 223 |
+
"cpt": 3.0694419840566876,
|
| 224 |
+
"tpw": 2.302906680265171
|
| 225 |
+
},
|
| 226 |
+
"math": {
|
| 227 |
+
"chars": 518667,
|
| 228 |
+
"words": 91001,
|
| 229 |
+
"tokens": 160000,
|
| 230 |
+
"cpt": 3.24166875,
|
| 231 |
+
"tpw": 1.7582224371160757
|
| 232 |
+
},
|
| 233 |
+
"code": {
|
| 234 |
+
"chars": 600000,
|
| 235 |
+
"words": 115473,
|
| 236 |
+
"tokens": 177333,
|
| 237 |
+
"cpt": 3.38346500651317,
|
| 238 |
+
"tpw": 1.5357096464108493
|
| 239 |
+
}
|
| 240 |
+
}
|
| 241 |
+
},
|
| 242 |
+
{
|
| 243 |
+
"name": "google/gemma-3-1b-pt",
|
| 244 |
+
"vocab": 262145,
|
| 245 |
+
"by_label": {
|
| 246 |
+
"arabic": {
|
| 247 |
+
"chars": 479808,
|
| 248 |
+
"words": 82964,
|
| 249 |
+
"tokens": 169379,
|
| 250 |
+
"cpt": 2.8327478613051205,
|
| 251 |
+
"tpw": 2.041596355045562
|
| 252 |
+
},
|
| 253 |
+
"english": {
|
| 254 |
+
"chars": 69308,
|
| 255 |
+
"words": 9805,
|
| 256 |
+
"tokens": 22580,
|
| 257 |
+
"cpt": 3.0694419840566876,
|
| 258 |
+
"tpw": 2.302906680265171
|
| 259 |
+
},
|
| 260 |
+
"math": {
|
| 261 |
+
"chars": 518667,
|
| 262 |
+
"words": 91001,
|
| 263 |
+
"tokens": 160000,
|
| 264 |
+
"cpt": 3.24166875,
|
| 265 |
+
"tpw": 1.7582224371160757
|
| 266 |
+
},
|
| 267 |
+
"code": {
|
| 268 |
+
"chars": 600000,
|
| 269 |
+
"words": 115473,
|
| 270 |
+
"tokens": 177301,
|
| 271 |
+
"cpt": 3.384075667931935,
|
| 272 |
+
"tpw": 1.535432525352247
|
| 273 |
+
}
|
| 274 |
+
}
|
| 275 |
+
},
|
| 276 |
+
{
|
| 277 |
+
"name": "google/gemma-2-2b",
|
| 278 |
+
"vocab": 256000,
|
| 279 |
+
"by_label": {
|
| 280 |
+
"arabic": {
|
| 281 |
+
"chars": 479808,
|
| 282 |
+
"words": 82964,
|
| 283 |
+
"tokens": 172625,
|
| 284 |
+
"cpt": 2.7794815351194786,
|
| 285 |
+
"tpw": 2.0807217588351574
|
| 286 |
+
},
|
| 287 |
+
"english": {
|
| 288 |
+
"chars": 69308,
|
| 289 |
+
"words": 9805,
|
| 290 |
+
"tokens": 22237,
|
| 291 |
+
"cpt": 3.1167873364212797,
|
| 292 |
+
"tpw": 2.267924528301887
|
| 293 |
+
},
|
| 294 |
+
"math": {
|
| 295 |
+
"chars": 518667,
|
| 296 |
+
"words": 91001,
|
| 297 |
+
"tokens": 158685,
|
| 298 |
+
"cpt": 3.268531997353247,
|
| 299 |
+
"tpw": 1.7437720464610278
|
| 300 |
+
},
|
| 301 |
+
"code": {
|
| 302 |
+
"chars": 600000,
|
| 303 |
+
"words": 115473,
|
| 304 |
+
"tokens": 177356,
|
| 305 |
+
"cpt": 3.3830262297300346,
|
| 306 |
+
"tpw": 1.5359088271717198
|
| 307 |
+
}
|
| 308 |
+
}
|
| 309 |
+
},
|
| 310 |
+
{
|
| 311 |
+
"name": "QCRI/Fanar-1-9B",
|
| 312 |
+
"vocab": 128256,
|
| 313 |
+
"by_label": {
|
| 314 |
+
"arabic": {
|
| 315 |
+
"chars": 479808,
|
| 316 |
+
"words": 82964,
|
| 317 |
+
"tokens": 172741,
|
| 318 |
+
"cpt": 2.777615042172964,
|
| 319 |
+
"tpw": 2.0821199556434116
|
| 320 |
+
},
|
| 321 |
+
"english": {
|
| 322 |
+
"chars": 69308,
|
| 323 |
+
"words": 9805,
|
| 324 |
+
"tokens": 22743,
|
| 325 |
+
"cpt": 3.047443169326826,
|
| 326 |
+
"tpw": 2.319530851606323
|
| 327 |
+
},
|
| 328 |
+
"math": {
|
| 329 |
+
"chars": 518667,
|
| 330 |
+
"words": 91001,
|
| 331 |
+
"tokens": 161011,
|
| 332 |
+
"cpt": 3.2213140717093864,
|
| 333 |
+
"tpw": 1.7693322051406029
|
| 334 |
+
},
|
| 335 |
+
"code": {
|
| 336 |
+
"chars": 600000,
|
| 337 |
+
"words": 115473,
|
| 338 |
+
"tokens": 179306,
|
| 339 |
+
"cpt": 3.3462349280001784,
|
| 340 |
+
"tpw": 1.5527958916803062
|
| 341 |
+
}
|
| 342 |
+
}
|
| 343 |
+
},
|
| 344 |
+
{
|
| 345 |
+
"name": "Qwen2.5-0.5B",
|
| 346 |
+
"vocab": 151665,
|
| 347 |
+
"by_label": {
|
| 348 |
+
"arabic": {
|
| 349 |
+
"chars": 479808,
|
| 350 |
+
"words": 82964,
|
| 351 |
+
"tokens": 185741,
|
| 352 |
+
"cpt": 2.5832099536451296,
|
| 353 |
+
"tpw": 2.2388144255339664
|
| 354 |
+
},
|
| 355 |
+
"english": {
|
| 356 |
+
"chars": 69308,
|
| 357 |
+
"words": 9805,
|
| 358 |
+
"tokens": 23714,
|
| 359 |
+
"cpt": 2.922661718815889,
|
| 360 |
+
"tpw": 2.4185619581845996
|
| 361 |
+
},
|
| 362 |
+
"math": {
|
| 363 |
+
"chars": 518667,
|
| 364 |
+
"words": 91001,
|
| 365 |
+
"tokens": 157198,
|
| 366 |
+
"cpt": 3.299450374686701,
|
| 367 |
+
"tpw": 1.7274315666860804
|
| 368 |
+
},
|
| 369 |
+
"code": {
|
| 370 |
+
"chars": 600000,
|
| 371 |
+
"words": 115473,
|
| 372 |
+
"tokens": 170867,
|
| 373 |
+
"cpt": 3.5115030989014846,
|
| 374 |
+
"tpw": 1.479713872506993
|
| 375 |
+
}
|
| 376 |
+
}
|
| 377 |
+
},
|
| 378 |
+
{
|
| 379 |
+
"name": "Hala-350M",
|
| 380 |
+
"vocab": 64400,
|
| 381 |
+
"by_label": {
|
| 382 |
+
"arabic": {
|
| 383 |
+
"chars": 479808,
|
| 384 |
+
"words": 82964,
|
| 385 |
+
"tokens": 216262,
|
| 386 |
+
"cpt": 2.218642202513618,
|
| 387 |
+
"tpw": 2.6066968805747073
|
| 388 |
+
},
|
| 389 |
+
"english": {
|
| 390 |
+
"chars": 69308,
|
| 391 |
+
"words": 9805,
|
| 392 |
+
"tokens": 21525,
|
| 393 |
+
"cpt": 3.219883855981417,
|
| 394 |
+
"tpw": 2.195308516063233
|
| 395 |
+
},
|
| 396 |
+
"math": {
|
| 397 |
+
"chars": 518667,
|
| 398 |
+
"words": 91001,
|
| 399 |
+
"tokens": 154027,
|
| 400 |
+
"cpt": 3.367377148162335,
|
| 401 |
+
"tpw": 1.6925857957604862
|
| 402 |
+
},
|
| 403 |
+
"code": {
|
| 404 |
+
"chars": 600000,
|
| 405 |
+
"words": 115473,
|
| 406 |
+
"tokens": 172555,
|
| 407 |
+
"cpt": 3.477152212338095,
|
| 408 |
+
"tpw": 1.4943320083482718
|
| 409 |
+
}
|
| 410 |
+
}
|
| 411 |
+
},
|
| 412 |
+
{
|
| 413 |
+
"name": "Kimi-K2.6",
|
| 414 |
+
"vocab": 163840,
|
| 415 |
+
"by_label": {
|
| 416 |
+
"arabic": {
|
| 417 |
+
"chars": 479808,
|
| 418 |
+
"words": 82964,
|
| 419 |
+
"tokens": 231367,
|
| 420 |
+
"cpt": 2.0737961766371176,
|
| 421 |
+
"tpw": 2.788763801166771
|
| 422 |
+
},
|
| 423 |
+
"english": {
|
| 424 |
+
"chars": 69308,
|
| 425 |
+
"words": 9805,
|
| 426 |
+
"tokens": 21401,
|
| 427 |
+
"cpt": 3.238540255128265,
|
| 428 |
+
"tpw": 2.182661907190209
|
| 429 |
+
},
|
| 430 |
+
"math": {
|
| 431 |
+
"chars": 518667,
|
| 432 |
+
"words": 91001,
|
| 433 |
+
"tokens": 147361,
|
| 434 |
+
"cpt": 3.5197033136311506,
|
| 435 |
+
"tpw": 1.6193338534741377
|
| 436 |
+
},
|
| 437 |
+
"code": {
|
| 438 |
+
"chars": 600000,
|
| 439 |
+
"words": 115473,
|
| 440 |
+
"tokens": 165268,
|
| 441 |
+
"cpt": 3.630466878040516,
|
| 442 |
+
"tpw": 1.4312263472846467
|
| 443 |
+
}
|
| 444 |
+
}
|
| 445 |
+
},
|
| 446 |
+
{
|
| 447 |
+
"name": "GPT-4 (cl100k_base)",
|
| 448 |
+
"vocab": 100277,
|
| 449 |
+
"by_label": {
|
| 450 |
+
"arabic": {
|
| 451 |
+
"chars": 479808,
|
| 452 |
+
"words": 82964,
|
| 453 |
+
"tokens": 335815,
|
| 454 |
+
"cpt": 1.428786683143993,
|
| 455 |
+
"tpw": 4.047719492792054
|
| 456 |
+
},
|
| 457 |
+
"english": {
|
| 458 |
+
"chars": 69308,
|
| 459 |
+
"words": 9805,
|
| 460 |
+
"tokens": 22607,
|
| 461 |
+
"cpt": 3.065776087052683,
|
| 462 |
+
"tpw": 2.3056603773584907
|
| 463 |
+
},
|
| 464 |
+
"math": {
|
| 465 |
+
"chars": 518667,
|
| 466 |
+
"words": 91001,
|
| 467 |
+
"tokens": 149086,
|
| 468 |
+
"cpt": 3.478978576123848,
|
| 469 |
+
"tpw": 1.6382896891242953
|
| 470 |
+
},
|
| 471 |
+
"code": {
|
| 472 |
+
"chars": 600000,
|
| 473 |
+
"words": 115473,
|
| 474 |
+
"tokens": 166345,
|
| 475 |
+
"cpt": 3.606961435570651,
|
| 476 |
+
"tpw": 1.440553202913235
|
| 477 |
+
}
|
| 478 |
+
}
|
| 479 |
+
},
|
| 480 |
+
{
|
| 481 |
+
"name": "Falcon-7B",
|
| 482 |
+
"vocab": 65024,
|
| 483 |
+
"by_label": {
|
| 484 |
+
"arabic": {
|
| 485 |
+
"chars": 479808,
|
| 486 |
+
"words": 82964,
|
| 487 |
+
"tokens": 484375,
|
| 488 |
+
"cpt": 0.9905713548387097,
|
| 489 |
+
"tpw": 5.838375681018273
|
| 490 |
+
},
|
| 491 |
+
"english": {
|
| 492 |
+
"chars": 69308,
|
| 493 |
+
"words": 9805,
|
| 494 |
+
"tokens": 25481,
|
| 495 |
+
"cpt": 2.71998744162317,
|
| 496 |
+
"tpw": 2.5987761346251914
|
| 497 |
+
},
|
| 498 |
+
"math": {
|
| 499 |
+
"chars": 518667,
|
| 500 |
+
"words": 91001,
|
| 501 |
+
"tokens": 166874,
|
| 502 |
+
"cpt": 3.1081354794635474,
|
| 503 |
+
"tpw": 1.833760068570675
|
| 504 |
+
},
|
| 505 |
+
"code": {
|
| 506 |
+
"chars": 600000,
|
| 507 |
+
"words": 115473,
|
| 508 |
+
"tokens": 186896,
|
| 509 |
+
"cpt": 3.2103415803441484,
|
| 510 |
+
"tpw": 1.6185255427675733
|
| 511 |
+
}
|
| 512 |
+
}
|
| 513 |
+
}
|
| 514 |
+
]
|
| 515 |
+
}
|
tokenizer.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|