Class: Dataset + measurement tool Citation anchor: arXiv/ACL paper + versioned dataset DOI
tokentax quantifies the "token tax": the same sentence costs 1× tokens in
English but often 2–8× in Tamil, Amharic, or Burmese, because LLM tokenizers
are trained on English-heavy corpora. It computes tokenization premium,
effective context-window shrinkage, and API cost multipliers for major
tokenizers across 100+ languages on parallel corpora, with confidence
intervals via evalci.
>>> import tokentax
>>> tok = tokentax.load_tokenizer("gpt-4o")
>>> corpus = tokentax.corpora.load_toy_corpus()
>>> tokentax.premium_report(tok, corpus["tam_Taml"], corpus["eng_Latn"], language="tam_Taml")
PremiumReport(tokenizer='gpt-4o', language='tam_Taml', premium=1.964, 95% CI=[1.673, 2.256], n=4)Phase 1 (core pipeline) and Phase 2 (full FLORES-200 sweep) are done. The
pipeline is validated: it reproduces Petrov et al. 2023's published premium
ratios (GPT-2/GPT-4 tokenizers, five languages) within 1.1% — see
scripts/validate_against_petrov2023.py. The full sweep covers 8 tokenizers
(gpt-4o, gpt-4, gpt-2, llama-3, qwen2.5, deepseek-v3, mistral, gemma-2 — Claude
excluded, see below) × 203 non-English FLORES-200 languages, 1.64M raw
per-sentence rows, summarized with evalci-backed CIs in
data/results/tokentax_summary_devtest.csv. Newer tokenizers show a markedly
lower mean premium (gpt-4o/gemma-2 ≈ 2.1×) than legacy ones (gpt-2 ≈ 4.5×) —
the "are newer tokenizers fairer" trend the paper will explore.
The OPUS domain-robustness check (scripts/run_opus_domain_check.py) is also
done, for the top 30 languages by mean FLORES premium: 21/30 have a mapped
second-domain corpus (Helsinki-NLP/opus-100 and/or
davidstap/biblenlp-corpus-mmteb, religious register); the other 9 (Shan,
Santali, Dzongkha, Tamasheq, Central Atlas Tamazight, Lao, Tigrinya, Manipuri,
Kabiyè) have no modern, ungated, non-loading-script parallel corpus available
for a second domain at all — that gap is itself a finding (the languages with
the highest token tax also have the least data to cross-validate it). Across
264 (language, domain, tokenizer) comparisons, median relative difference
from the FLORES estimate is 14% — the premium mostly replicates across
register, with some corpus-specific outliers worth a caveat in the paper
(Kannada on OPUS-100 diverges up to 106% for gpt-4o; Uyghur and Sanskrit's
Bible-corpus pairings diverge 44–72%, likely small/idiosyncratic samples in
those specific files). Results in data/results/opus_domain_check.csv.
Phase 3 (results dataset + explorer) is published:
shreyaskc/tokentax-results-v1
on Hugging Face — flores200_summary.parquet (the CI-backed long-format
table), flores200_raw.parquet (1.64M per-sentence rows), and
opus_domain_check.parquet, under CC0 for the derived statistics (no source
sentence text is redistributed). Re-publish with
scripts/publish_hf_dataset.py.
The tokentax explorer
(heatmap + "what does N tokens buy in your language" calculator) is live as
a static Space — Hugging Face requires a PRO subscription to host
Gradio/Docker Spaces even on the free CPU tier, so hf_space/ is a
Plotly.js + vanilla-JS page reading a bundled data.json/pricing.json
snapshot rather than a live Hub read. Rebuild with
scripts/build_static_explorer.py after a new results version, then
redeploy with scripts/publish_hf_space.py. A functionally identical
Gradio version (live Hub reads, no rebuild step) sits unpublished at
scripts/gradio_explorer_prototype/ for if the account upgrades to PRO.
Released on PyPI: tokentax 0.1.0.
Paper drafted: paper/main.tex (8 pages) reproduces Petrov et al. 2023
within 1.1%, reports the full 8-tokenizer sweep, the domain-robustness
check, and a cost-analysis table, with an Ethics Statement and Limitations
section. Not yet submitted to arXiv — that step needs an arXiv account and
is a manual submission, not something scripted. Regenerate the figures with
paper/scripts/make_figures.py and compile with pdflatex →
bibtex main → pdflatex × 2 from within paper/.
Not yet released: Zenodo DOI. See PLANNING.md for the full implementation
brief and remaining release checklist (Papers with Code, seed emails,
workshop poster).
Two registry notes from the real run: llama-3 resolves to the
NousResearch/Meta-Llama-3-8B mirror, not meta-llama/Meta-Llama-3-8B,
because the official repo requires Meta's manual license approval rather
than an instant click-through; mistral turned out not to be gated at all
(needs protobuf installed, not a license). Claude is excluded from the
sweep by choice, not necessity — see registry.py if you want to re-add it
with ANTHROPIC_API_KEY set.
pip install tokentaxTo hack on the library itself (and run the test suite):
git clone https://github.com/Shreyaskc/token-tax.git
cd token-tax
pip install -e ".[test,corpora]"
pytest tests/Requires Python ≥3.9. Core runtime deps: numpy, pandas, pyyaml, evalci,
tiktoken, transformers, sentencepiece, huggingface_hub. Optional extras:
corpora (Hugging Face datasets, for pulling FLORES-200) and claude
(the anthropic client, for Claude's token-count API).
Several tokenizers (Llama 3, Mistral, Gemma) and the FLORES-200 corpus
(facebook/flores) are gated on Hugging Face — a free, auto-approved license
click, not a manual review:
- Visit the dataset/model page while logged in and click "Agree and access repository".
huggingface-cli login(or setHF_TOKEN).
Claude has no downloadable tokenizer; tokentax uses Anthropic's free
token-count API instead, which needs ANTHROPIC_API_KEY.
tokentax list-tokenizerstokentax premium gpt-4o tam_Taml --corpus toy # bundled toy corpus, no network
tokentax premium gpt-4o tam_Taml --corpus flores200 # full FLORES-200 (needs the gate above)import tokentax
tok = tokentax.load_tokenizer("gpt-4o")
# per-sentence metrics
tokentax.metrics.premium_ratios(tok, tamil_sentences, english_sentences)
tokentax.metrics.bytes_per_token(tok, sentences)
tokentax.metrics.chars_per_token(tok, sentences)
tokentax.metrics.effective_context_window(context_tokens=128_000, tokens_per_word=2.4)
# CI-backed report for one (tokenizer, language) pair, or a whole corpus
tokentax.premium_report(tok, tamil_sentences, english_sentences, language="tam_Taml")
tokentax.premium_table(tok, tokentax.corpora.load_toy_corpus())
# $/token pricing (placeholder figures — see pricing.yaml)
tokentax.pricing.estimate_cost("gpt-4o", n_tokens=1_000_000)- Confidence intervals are computed by
evalci.ci(method="bootstrap"), not reimplemented — the same statistically-validated routine used across this portfolio's benchmarks. - Premium ratios are computed on FLORES-200's aligned parallel sentences (same meaning across languages), not independent monolingual corpora — the only methodologically defensible basis for a cross-language ratio.
pricing.yamlships withverified: false;tokentax.pricing.load_pricing()warns until it's checked against live provider pricing and flipped to true. Do not cite a dollar figure from an unverified snapshot.
CITATION.cff (done) → full FLORES-200 run + validation against Petrov et al. 2023 (done) → HF dataset + Space (done) → PyPI (done) → arXiv (drafted, submission pending) → peer-reviewed submission (ACL Rolling Review → Findings of ACL/EMNLP/NAACL, COLING, or a fitting workshop — MRL, LoResMT, VarDial, ComputEL; arXiv alone does not satisfy EB-1A's "scholarly articles" criterion, peer review does) → Papers with Code → Zenodo → seed emails to multilingual-NLP and AI-policy researchers → workshop poster.