Skip to content

/bengali-nlp

Bengali (Bangla) text processing patterns including Unicode normalization, script detection, tokenization, conjunct handling, and Bangla-specific NLP best practices for AI applications.

BOOST
From plugin
ecc
277k200 skills71 agents112 commands8 hooks
+1
Install
$ npx -y skills add affaan-m/ECC --skill bengali-nlp --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/bengali-nlp

Context 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.

SKILL.md

bengali-nlp.SKILL.md
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

Bengali (Bangla) NLP Patterns

Best practices for processing, storing, and displaying Bengali text in software applications and AI systems.

When to Activate

  • Working with Bengali/Bangla text data
  • Building apps targeting Bengali-speaking users
  • Processing NCTB (National Curriculum and Textbook Board) educational content
  • Implementing Bengali search, autocomplete, or text input
  • Training or fine-tuning LLMs on Bengali data
  • Building Bengali chatbots or conversational AI
  • Handling mixed Bengali-English (Banglish) text

Bengali Unicode and Script Handling

Unicode Range

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 ৺

Normalization

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');
}

Conjunct Consonants (যুক্তবর্ণ)

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;
}

Bengali Digits

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)

Tokenization

Word Boundary Detection

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 pipeline

Using bnlp Toolkit

from bnlp import NLTKTokenizer

tokenizer = NLTKTokenizer()
tokens = tokenizer.word_tokenize("আমি বাংলায় গান গাই।")
# ['আমি', 'বাংলায়', 'গান', 'গাই', '।']

Handling Postpositions and Case Markers

Bengali postpositions attach to nouns. Tokenizers should be aware of common suffixes:

-এর (possessive), -তে (locative), -কে (accusative)
-র (possessive after vowel), -য় (locative variant)

Text Processing Patterns

Script Detection

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)

Stop Words

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.

Sorting and Collation

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.Coll
Read more
Ships withecc

Your 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

Get the whole plugin, auto-invoked

Other skills on ecc.