Tajik Punctuation & Capitalization Restoration (uz-punctuation-restore)
Restores sentence casing and punctuation (. , ? ! : ;) on raw lowercased, unpunctuated Tajik
text — the kind an ASR model (e.g. Parakeet / Whisper) emits. Built as the #1 readability win for
the offline Tajik STT app. Two token-classification heads on a shared xlm-roberta-base encoder:
a punctuation head (7 classes) and a casing head (LOWER / CAP / UPPER). Shipped as ONNX
so it bundles into the offline app.
Evaluation (20k held-out validation sentences)
Punctuation, per class:
| class | precision | recall | F1 | support |
|---|---|---|---|---|
| PERIOD | 0.973 | 0.992 | 0.982 | 18,886 |
| COMMA | 0.837 | 0.821 | 0.829 | 14,887 |
| QUESTION | 0.871 | 0.830 | 0.850 | 951 |
| EXCLAM | 0.658 | 0.119 | 0.202 | 437 |
| COLON | 0.712 | 0.530 | 0.608 | 706 |
| SEMICOLON | 0.636 | 0.196 | 0.299 | 143 |
- Non-O macro-F1: 0.628
- Casing accuracy: 0.984
- Sentence-initial capitalization recall: 0.998
Before → after examples
1. input: siz bilan suhbatlashib sizni qiziqtirgan ishlarni aniqlab murabbiy tayinlashadi
restored: Siz bilan suhbatlashib, sizni qiziqtirgan ishlarni aniqlab, murabbiy tayinlashadi.
gold: Siz bilan suhbatlashib, sizni qiziqtirgan ishlarni aniqlab, murabbiy tayinlashadi.
2. input: sandugʻoch dovyurak jasur ayol sifatida tasvirlanadi
restored: Sandugʻoch dovyurak, jasur ayol sifatida tasvirlanadi.
gold: Sandugʻoch dovyurak, jasur ayol sifatida tasvirlanadi.
3. input: bunda chuqur tishlov tepa tish qatori va pastki tish qatori birlashtirilganda teng birikmasligi tishlarning notoʻgʻri qiyshiq oʻsishi kuzatiladi
restored: Bunda chuqur tishlov tepa tish qatori va pastki tish qatori birlashtirilganda teng birikmasligi, tishlarning notoʻgʻri qiyshiq oʻsishi kuzatiladi.
gold: Bunda chuqur tishlov (tepa tish qatori va pastki tish qatori birlashtirilganda teng birikmasligi), tishlarning notoʻgʻri, qiyshiq oʻsishi kuzatiladi.
4. input: vaholanki mutlaqo boshqa odam haqida aytilgan
restored: Vaholanki, mutlaqo boshqa odam haqida aytilgan.
gold: Vaholanki, mutlaqo boshqa odam haqida aytilgan.
5. input: loyiha doirasida tanlangan maktablarda amaliy kimyo va biologiya laboratoriyalari tashkil etilib ularda interfaol ta’lim yoʻlga qoʻyiladi
restored: Loyiha doirasida tanlangan maktablarda amaliy kimyo va biologiya laboratoriyalari tashkil etilib, ularda interfaol ta’lim yoʻlga qoʻyiladi.
gold: Loyiha doirasida tanlangan maktablarda amaliy kimyo va biologiya laboratoriyalari tashkil etilib, ularda interfaol ta’lim yoʻlga qoʻyiladi.
6. input: samolyotni qurishda uni raqib radarlariga kamroq seziluvchi qiluvchi stels texnologiyasidan foydalanilgan
restored: Samolyotni qurishda uni raqib radarlariga kamroq seziluvchi qiluvchi Stels texnologiyasidan foydalanilgan.
gold: Samolyotni qurishda uni raqib radarlariga kamroq seziluvchi qiluvchi “stels” texnologiyasidan foydalanilgan.
7. input: bunday jarayonlar oʻsimlik va hayvonlar dunyosiga ham taalluqlidir
restored: Bunday jarayonlar oʻsimlik va hayvonlar dunyosiga ham taalluqlidir.
gold: Bunday jarayonlar oʻsimlik va hayvonlar dunyosiga ham taalluqlidir.
8. input: uning koʻngli hijron vodiysiga aylandi firoq oʻtidan devona boʻlgan oshiq oqibatda yomon nomga ega boʻldi
restored: Uning koʻngli hijron vodiysiga aylandi, firoq oʻtidan devona boʻlgan oshiq oqibatda yomon nomga ega boʻldi.
gold: Uning koʻngli hijron vodiysiga aylandi, firoq oʻtidan devona boʻlgan oshiq oqibatda yomon nomga ega boʻldi.
9. input: men ayollar tomon otilib ularni ajratishga kirishdim
restored: Men ayollar tomon otilib, ularni ajratishga kirishdim.
gold: Men ayollar tomon otilib, ularni ajratishga kirishdim.
10. input: gap turar-joylar va xoʻjalik inshootlarining kuchli shamolda shikastlanishi haqida bormoqda
restored: Gap turar-joylar va xoʻjalik inshootlarining kuchli shamolda shikastlanishi haqida bormoqda.
gold: Gap, turar-joylar va xoʻjalik inshootlarining kuchli shamolda shikastlanishi haqida bormoqda.
Usage (ONNX, CPU, offline)
from punctuate_onnx import Punctuator # ships in this repo
p = Punctuator("path/to/this/repo") # dir with model.onnx + tokenizer + head_config.json
print(p.restore("нахуствазири украина афзуд ки путин мехоҳад"))
# -> Нахуствазири Украина афзуд, ки Путин мехоҳад.
Dependencies: onnxruntime, transformers (tokenizer only). No GPU required.
Training
- Data:
3M sentences uniformly sampled from a clean, punctuated Tajik corpus (1.9B tokens). - Recipe:
xlm-roberta-base, max_len 256, first-subword label alignment, bf16, lr 3e-5, warmup 5%, summed cross-entropy over the two heads, 3 epochs on one H100. - Full record (MANIFEST, loss curve, eval json, code) kept in the Saidzoda-Lab run archive.
Gated (manual approval) per lab policy. Central-Asian NLP research — Saidzoda Lab.
Model tree for Tohirju/uz-punctuation-restore
Base model
FacebookAI/xlm-roberta-base