aztext
Lightweight, dependency-free Azerbaijani text-processing toolkit — the small utilities every
Azerbaijani NLP project re-implements, done once and done correctly. Pure Python standard library, no
numpy/torch/regex required.
Built as part of an open Azerbaijani LLM stack (tokenizer → dataset → model → evals).
Why
Azerbaijani (Latin script) adds ə ğ ı i ö ş ç ü beyond ASCII, and the dotted/dotless i distinction
(i≠ı, İ≠I) is meaningful — but Python's str.lower()/upper() get it wrong, people type without
diacritics, and Azerbaijani is easily confused with Turkish. aztext handles these correctly.
Install
pip install -e aztext # from this repo
Usage
import aztext
# Correct Turkic-i-aware casing (Python's str.upper gets this wrong)
aztext.az_upper("işıq") # -> "İŞIQ"
aztext.az_lower("İSTİQLAL") # -> "istiqlal"
# Restore diacritics to ASCII-typed text (best-effort, dictionary-based)
aztext.deasciify("ucun cixis") # -> "üçün çıxış"
aztext.ascii_fold("gözəl çıxış") # -> "gozel cixis"
# Azerbaijani vs Turkish language ID (heuristic; ə is the key signal)
aztext.is_azerbaijani("Mən kitab oxuyuram.") # -> True
aztext.detect_language("Ben kitap okuyorum.") # -> ("tr", 0.87)
# Numbers to Azerbaijani words
aztext.num_to_words(1234) # -> "min iki yüz otuz dörd"
aztext.num_to_words(-5) # -> "mənfi beş"
# Normalization, tokenization, script detection
aztext.normalize("Gözəl şəhər — “Bakı”.") # NFC, quotes/dashes, whitespace
aztext.word_tokenize("Bakı, paytaxtdır.") # -> ["Bakı", "paytaxtdır"]
aztext.sent_tokenize("Bir. İki! Üç?") # -> ["Bir.", "İki!", "Üç?"]
aztext.is_latin_azerbaijani("Azərbaycan dili") # -> True
API
| function | does |
|---|---|
normalize(text) |
NFC, mojibake repair, zero-width strip, quote/dash + whitespace cleanup (preserves casing & Az letters; idempotent) |
deasciify(text) |
restore Azerbaijani diacritics on ASCII-typed text (dictionary best-effort) |
ascii_fold(text) |
strip diacritics (ə→e, ş→s, …) |
is_azerbaijani(text) / detect_language(text) |
Az-vs-Tr-vs-other heuristic ID |
num_to_words(n) |
Azerbaijani cardinal spelling (0 … < 10¹², negatives) |
word_tokenize / sent_tokenize |
explicit-alphabet word/sentence tokenizers |
is_latin_azerbaijani / script_ratios |
Latin-vs-Cyrillic/Arabic script detection |
az_lower / az_upper |
Turkic-i-aware case mapping |
Limitations (honest)
deasciifyis dictionary-based best-effort. It restores common words; unknown words pass through unchanged, and genuinely ambiguous folds (e.g.el→ el "people" vs əl "hand") resolve to a single listed form. It is not a language model.detect_languageis a lightweight heuristic, not a trained classifier — tuned for the Az/Tr split. An optionalfasttextmodel is used as a tiebreaker only ifAZTEXT_FASTTEXT_MODELpoints to one.- Latin-script Modern (North) Azerbaijani only; Cyrillic/Perso-Arabic are detected but not transliterated.
Tests
python -m pytest aztext/tests -q # or, dependency-free:
python aztext/tests/test_aztext.py
License
MIT.
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support