Skip to main content

UzTextNorm

PyPI version Python versions License: MIT

Uzbek Text Normalization Library for TTS and NLP applications.

Features

  • Unicode Normalization: Normalizes text to NFC form
  • Cyrillic to Latin Transliteration: Automatic conversion of Uzbek Cyrillic to Latin script
  • Number Expansion: Converts numbers to Uzbek words
    • Integers: 123bir yuz yigirma uch
    • Decimals: 3.14uch butun o'n to'rt
    • Fractions: 3/4to'rtdan uch
    • Currency: 10,000 so'mo'n ming soʻm
    • Percentages: 15%o'n besh foiz
  • Punctuation Normalization: Standardizes punctuation and whitespace
  • URL/Email Preservation: Protects URLs and emails from normalization
  • Custom Rules: Support for custom pre/post processing rules

Installation

pip install uztextnorm

Usage

Basic Usage

from uztextnorm import UzbekTextNormalizer

# Create a normalizer instance
normalizer = UzbekTextNormalizer()

# Normalize text
text = "Narx: 10,000 so'm; 15% oshdi"
result = normalizer(text)
print(result)
# Output: "narx: o'n ming soʻm; o'n besh foiz oshdi"

Cyrillic to Latin Transliteration

text = "Ўзбекистон Республикаси"
result = normalizer(text)
print(result)
# Output: "o'zbekiston respublikasi"

Number Expansion

# Integers
normalizer("123")  # "bir yuz yigirma uch"

# Decimals
normalizer("3.14")  # "uch butun o'n to'rt"

# Fractions
normalizer("3/4")  # "to'rtdan uch"
normalizer("1/2")  # "yarim"
normalizer("2 3/4")  # "ikki butun to'rtdan uch"

# Currency
normalizer("10,000 so'm")  # "o'n ming soʻm"
normalizer("2,500 $")  # "ikki ming besh yuz dollar"

# Percentages
normalizer("15%")  # "o'n besh foiz"

Configuration Options

normalizer = UzbekTextNormalizer(
    to_lower=True,  # Convert to lowercase (default: True)
    transliterate_cyrillic=True,  # Transliterate Cyrillic (default: True)
    script="legacy",  # "legacy" (o'/g'/sh/ch) or "2026" (ö/ğ/ş/ç)
    speak_urls=False,  # "https://kun.uz" -> "kun nuqta uz"
    spell_leftover_digits=True,  # "A350" -> "a uch yuz ellik"
    custom_pre_rules=[],  # Custom pre-processing functions
    custom_post_rules=[]  # Custom post-processing functions
)

Custom Processing Rules

def remove_hashtags(text: str) -> str:
    return text.replace('#', '')

def add_period(text: str) -> str:
    if not text.endswith('.'):
        return text + '.'
    return text

normalizer = UzbekTextNormalizer(
    custom_pre_rules=[remove_hashtags],
    custom_post_rules=[add_period]
)

Module Structure

uztextnorm/
├── __init__.py          # Package initialization
├── constants.py         # Constants and language data
├── utils.py            # Utility functions
├── transliterator.py   # Cyrillic-to-Latin conversion
├── tokenizer.py        # Token shielding (URLs, emails)
├── numbers.py          # Number expansion
└── normalizer.py       # Main normalizer class

Requirements

  • Python >= 3.10

Development

Clone the repository and install the development dependencies:

git clone https://gitlab.com/adizbek/uztextnorm.git
cd uztextnorm
pip install -e ".[dev]"

Run the test suite:

pytest

Format and lint:

black src tests
ruff check src tests

Build the distribution artifacts:

python -m build

Links

Author

Adizbek Ergashevadizbek1998@gmail.com

License

MIT License — see LICENSE for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uztextnorm-0.5.0.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uztextnorm-0.5.0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file uztextnorm-0.5.0.tar.gz.

File metadata

  • Download URL: uztextnorm-0.5.0.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for uztextnorm-0.5.0.tar.gz
Algorithm Hash digest
SHA256 e0dc6b3a0ee845dea19f1601503bd882b0af3bd6160a7764abc159b79149c983
MD5 a41256bdc05f5c3d2126f2cf46eb3627
BLAKE2b-256 26632ef4a2e49b231aed852e39b8cd9f0eda38e6ced5bcfbd899b2a97a7fc689

See more details on using hashes here.

File details

Details for the file uztextnorm-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: uztextnorm-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for uztextnorm-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d09f11e09fb9a338ee5cbb897cfbd14b5c3a8dc6f05b7477915f6afd5f330e33
MD5 a28c099747fdb9978ed74e332d22b4dc
BLAKE2b-256 93e71309c6f64b8a50b019defc66663235c561e8cbd1b16591961116b00b08f3

See more details on using hashes here.

Release history Release notifications | RSS feed

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

This release

0.5.0 This release

2 files

0.4.1

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page