Text Utilities#
Unicode normalisation, script detection, and character utilities for Bangla text.
from bornomala import normalize, is_bangla, is_pure_bangla, bangla_char_countnormalize(text)#
Clean and normalise Bangla Unicode text. Applies three fixes in order:
- NFC normalisation — canonical Unicode composition (the standard form for storing and comparing Bangla text).
- daari repair — replaces the ASCII pipe
|with the Bangla daari।when it appears in a Bangla context. This is a common OCR artefact in scanned documents. - Whitespace collapse — collapses consecutive spaces (including no-break spaces U+00A0) to a single space, and strips leading/trailing whitespace.
Signature
def normalize(text: str) -> strExamples#
# Collapse extra spaces
normalize("আমার সোনার বাংলা") # 'আমার সোনার বাংলা'
# Strip leading/trailing whitespace
normalize(" বাংলা ") # 'বাংলা'
# Pipe → daari (Bangla context)
normalize("এক|দুই") # 'এক।দুই'
# Pipe NOT replaced in Latin context
normalize("a|b") # 'a|b'
# No-break space → regular space
normalize("এক\u00a0দুই") # 'এক দুই'
# NFC normalisation (NFD → NFC)
import unicodedata
nfd = unicodedata.normalize("NFD", "বাংলা")
normalize(nfd) == "বাংলা" # True
# Already clean text is returned unchanged
normalize("আমার সোনার বাংলা।") # 'আমার সোনার বাংলা।'Common use cases#
# Clean user input before processing
user_input = request.POST.get("name", "").strip()
clean_name = normalize(user_input)
# Normalise before comparison
def names_match(a, b):
return normalize(a) == normalize(b)
names_match("রাফি আহমেদ", "রাফি আহমেদ") # True
# Pre-process OCR output
ocr_text = "বাংলাদেশ|ভারত|মিয়ানমার"
clean = normalize(ocr_text)
# 'বাংলাদেশ।ভারত।মিয়ানমার'is_bangla(text)#
Return True if text contains at least one character in the Bangla Unicode block (U+0980–U+09FF).
Signature
def is_bangla(text: str) -> boolExamples#
is_bangla("আমি") # True
is_bangla("hello") # False
is_bangla("hello আমি") # True
is_bangla("১২৩") # True ← Bangla digits are in the Bangla block
is_bangla("123") # False
is_bangla("") # FalseUse cases#
# Route language-specific processing
def process(text):
if is_bangla(text):
return normalize(text)
return text.strip()
# Filter mixed lists
texts = ["hello", "আমি", "world", "বাংলা"]
bangla_only = [t for t in texts if is_bangla(t)]
# ['আমি', 'বাংলা']is_pure_bangla(text)#
Return True if text contains only Bangla characters, Bangla digits, standard punctuation (। , ; : ! ? - – — ( ) [ ] " ' " " ' '), and whitespace — no Latin letters, Arabic digits, or other scripts.
Signature
def is_pure_bangla(text: str) -> boolExamples#
is_pure_bangla("আমার বাংলা।") # True
is_pure_bangla("hello আমি") # False ← Latin letters
is_pure_bangla("আমি ১০ জন।") # True ← Bangla digits OK
is_pure_bangla("আমি 10 জন।") # False ← Arabic/Western digits
is_pure_bangla("") # False
is_pure_bangla(" ") # FalseUse case: content validation#
def validate_bangla_field(value):
if not value.strip():
raise ValueError("Field cannot be empty")
if not is_pure_bangla(value):
raise ValueError("Field must contain only Bangla text")
return normalize(value)bangla_char_count(text)#
Count the number of Bangla Unicode characters (U+0980–U+09FF) in text. Spaces, punctuation, and other scripts are not counted.
Signature
def bangla_char_count(text: str) -> intExamples#
bangla_char_count("আমি") # 3
bangla_char_count("hello") # 0
bangla_char_count("hello আমি") # 3
bangla_char_count("") # 0
bangla_char_count("আমার বাংলা") # 9 ← space not counted
bangla_char_count("১২৩") # 3 ← Bangla digits are countedUse cases#
# Enforce minimum Bangla content
def has_enough_bangla(text, min_chars=10):
return bangla_char_count(text) >= min_chars
# Text statistics
def text_stats(text):
total = len(text)
bangla = bangla_char_count(text)
return {
"total_chars": total,
"bangla_chars": bangla,
"bangla_ratio": bangla / total if total else 0,
}
stats = text_stats("আমার বাংলা — my language")
# {'total_chars': 24, 'bangla_chars': 9, 'bangla_ratio': 0.375}Combining utilities#
from bornomala import normalize, is_bangla, is_pure_bangla, bangla_char_count
def process_bangla_input(raw: str) -> dict:
"""Full pipeline: clean → validate → analyse."""
clean = normalize(raw)
return {
"text": clean,
"has_bangla": is_bangla(clean),
"pure_bangla": is_pure_bangla(clean),
"bangla_chars": bangla_char_count(clean),
}
process_bangla_input(" আমার সোনার বাংলা। ")
# {
# 'text': 'আমার সোনার বাংলা।',
# 'has_bangla': True,
# 'pure_bangla': True,
# 'bangla_chars': 17,
# }