accessibility
Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android…
Bengali (Bangla) text processing patterns including Unicode normalization, script detection, tokenization, conjunct handling, and Bangla-specific NLP best practices for AI applications.
$ npx -y skills add affaan-m/ECC --skill bengali-nlp --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/bengali-nlpContext preview
The summary Claude sees to decide when to auto-load this skill.
Bengali (Bangla) text processing patterns including Unicode normalization, script detection, tokenization, conjunct handling, and Bangla-specific NLP best practices for AI applications.
name: bengali-nlp description: Bengali (Bangla) text processing patterns including Unicode normalization, script detection, tokenization, conjunct handling, and Bangla-specific NLP best practices for AI applications. metadata: origin: ECC
Best practices for processing, storing, and displaying Bengali text in software applications and AI systems.
Bengali script occupies U+0980–U+09FF. Key character classes:
U+0981–U+0983 Chandrabindu, Anusvara, Visarga U+0985–U+0994 Independent vowels (অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ) U+0995–U+09B0 Consonants (ক–র) U+09B2 ল U+09B6–U+09B9 শ ষ স হ U+09DC, U+09DD, U+09DF Additional consonants (ড়, ঢ়, য়) U+09BC Nukta U+09BE–U+09C8 Dependent vowel signs (কার): া ি ী ু ূ ৃ ে ৈ U+09CB–U+09CC Dependent vowel signs: ো ৌ U+09CD Hasanta (virama) — forms conjuncts U+09CE Khanda Ta (ৎ) U+09D7 AU length mark U+09E0–U+09E3 Extended vowels U+09E6–U+09EF Bengali digits: ০১২৩৪৫৬৭৮৯ U+09F0–U+09F1 Assamese letters: ৰ (ra with middle diagonal), ৱ (ra with lower diagonal) U+09F2–U+09F3 Rupee mark ৲ and rupee sign ৳ U+09F4–U+09F9 Historic currency numerators ৴ ৵ ৶ ৷ ৸ and denominator ৹ U+09FA Isshar ৺
Always normalize Bengali text to NFC before comparison, storage, or search:
import unicodedata
def normalize_bangla(text: str) -> str:
"""Normalize Bengali text to NFC form."""
return unicodedata.normalize("NFC", text)
# NFC composes characters: base + combining marks -> precomposed
text_nfd = "ক\u09C7\u09BE" # decomposed form of "কো"
text_nfc = normalize_bangla(text_nfd)
assert text_nfc == "কো"
assert text_nfc == normalize_bangla(text_nfc) # idempotent// JavaScript
function normalizeBangla(text) {
return text.normalize('NFC');
}Bengali conjuncts are formed with Hasanta (্) between consonants:
ক + ্ + ষ = ক্ষ (ksha) স + ্ + ত = স্ত (sta) ন + ্ + ত + ্ + র = ন্ত্র (ntra)
**Never split strings in the middle of a conjunct.** Use grapheme cluster boundaries:
import regex # pip install regex
def grapheme_length(text: str) -> int:
"""Count user-perceived characters (grapheme clusters)."""
return len(regex.findall(r"\X", text))
# "ক্ষ" is 1 grapheme but 3 code points (ক + ্ + ষ)
assert grapheme_length("ক্ষ") == 1
assert len("ক্ষ") == 3 # code point count — wrong for display// JavaScript — use Intl.Segmenter for grapheme-safe operations
function graphemeLength(text) {
const segmenter = new Intl.Segmenter('bn', { granularity: 'grapheme' });
return [...segmenter.segment(text)].length;
}Handle both Bengali (০-৯) and ASCII (0-9) digits:
BANGLA_DIGITS = "০১২৩৪৫৬৭৮৯"
ASCII_DIGITS = "0123456789"
def bangla_to_ascii_digits(text: str) -> str:
table = str.maketrans(BANGLA_DIGITS, ASCII_DIGITS)
return text.translate(table)
def ascii_to_bangla_digits(text: str) -> str:
table = str.maketrans(ASCII_DIGITS, BANGLA_DIGITS)
return text.translate(table)Bengali uses spaces between words, but compound words and postpositions can complicate tokenization:
import re
def tokenize_bangla(text: str) -> list[str]:
"""Basic Bengali tokenizer — split on whitespace and punctuation."""
# Remove Bengali and ASCII punctuation, but preserve decimal points
text = re.sub(r'(?<!\d)\.|\.(?!\d)|[।,;:!?\-\'"()\[\]{}]', ' ', text)
return [token for token in text.split() if token]
# For production, use a trained tokenizer:
# - bnlp (pip install bnlp_toolkit)
# - stanza with Bengali model
# - spaCy with Bengali pipelinefrom bnlp import NLTKTokenizer
tokenizer = NLTKTokenizer()
tokens = tokenizer.word_tokenize("আমি বাংলায় গান গাই।")
# ['আমি', 'বাংলায়', 'গান', 'গাই', '।']Bengali postpositions attach to nouns. Tokenizers should be aware of common suffixes:
-এর (possessive), -তে (locative), -কে (accusative) -র (possessive after vowel), -য় (locative variant)
import re
def is_bangla(text: str) -> bool:
"""Check if text contains Bengali script characters."""
return bool(re.search(r'[\u0980-\u09FF]', text))
def bangla_ratio(text: str) -> float:
"""Return the ratio of Bengali characters in text."""
if not text:
return 0.0
bangla_chars = len(re.findall(r'[\u0980-\u09FF]', text))
return bangla_chars / len(text)Common Bengali stop words to filter in search/NLP pipelines:
BANGLA_STOP_WORDS = {
"এবং", "ও", "এ", "এই", "সেই", "তার", "যে", "একটি",
"করে", "হয়", "আর", "কিন্তু", "তবে", "যদি", "তাহলে",
"আমি", "তুমি", "সে", "আমরা", "তোমরা", "তারা",
"হবে", "ছিল", "আছে", "থেকে", "জন্য", "সাথে",
"পর", "আগে", "উপর", "নিচে", "মধ্যে", "দিয়ে",
"কি", "কে", "কোন", "কোথায়", "কেন", "কিভাবে",
"হ্যাঁ", "অনেক", "কিছু", "সব", "প্রতি",
}Keep negators such as `না`, `নয়`, and `নেই` out of a generic stop-word list. They change intent and sentiment, so remove them only for a task that explicitly models negation elsewhere.
Bengali has a defined sort order (স্বরবর্ণ before ব্যঞ্জনবর্ণ). Use locale-aware sorting:
# Preferred: use PyICU for reliable Bengali collation (pip install PyICU)
try:
import icu
collator = icu.CollYour agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills
Repo: affaan-m/ECC
Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android…
Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for…
Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks…
Design and optimize AI agent action spaces, tool definitions, and observation formatting for…
Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained…
Security hardening guidance for AI agent frameworks that process untrusted content, invoke…