Tokenization
Text কে ছোট ছোট token-এ ভাঙা — language understanding-এর প্রথম step।
আপনি একটা বড় কেক হাতে পেলেন। মুখে পুরো ঢোকানো সম্ভব? — না। ছোট ছোট টুকরো করে খেতে হবে। NLP তেও ঠিক একই কাজ — পুরো sentence model কে এক সাথে দেওয়া যায় না, ছোট ছোট 'token' এ ভাঙতে হয়। এই 'ভেঙে ফেলার শিল্প' এর নাম Tokenization।
Tokenization হলো একটা text কে ছোট ছোট meaningful units — token এ ভাঙার process। Token হতে পারে একটা word, একটা subword (যেমন 'play' + 'ing'), অথবা একটা character। এটাই NLP pipeline এর সবচেয়ে প্রথম এবং সবচেয়ে গুরুত্বপূর্ণ step — কারণ পরের সব কাজ (embedding, model) এই token এর উপর ভিত্তি করে চলে।
ভাবুন আপনি একটা lego set ভেঙে দেখছেন কী কী piece আছে। Token হলো সেই piece। Word-level tokenization — পুরো word একসাথে নেওয়া। Subword — বড় word কে ছোট অংশে ভাঙা (modern LLM এই strategy ব্যবহার করে)। Character — একদম অক্ষর-পর্যায়ে ভাঙা। যত smart tokenization, তত ভাল NLP model।
import nltk
from nltk.tokenize import word_tokenize, sent_tokenize
nltk.download("punkt", quiet=True)
nltk.download("punkt_tab", quiet=True)
text = "Dr. Sadiq loves NLP. He works on Bangla AI! It's amazing."
# 1. Naive whitespace tokenization
naive = text.split()
print("Naive:", naive)
# 2. Smart word tokenization
words = word_tokenize(text)
print("Smart words:", words)
# 3. Sentence tokenization
sentences = sent_tokenize(text)
print("Sentences:", sentences)
# 4. Subword tokenization (modern, used in BERT/GPT)
# pip install transformers
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
subwords = tokenizer.tokenize("Tokenization is unbelievably powerful!")
print("Subwords:", subwords)
# Output: ['token', '##ization', 'is', 'un', '##believable', '##ly', 'powerful', '!']Naive split() 'Dr.' কে একটা token ধরে — ভুল। NLTK এর word_tokenize 'Dr.' কে আলাদা করে, punctuation কে আলাদা token হিসেবে রাখে। Subword tokenizer (BERT) 'unbelievably' কে ভেঙে দেয় 'un' + '##believable' + '##ly' এ — '##' মানে এটা আগের token এর সাথে যুক্ত। এই subword trick এর কারণে modern model নতুন/বিরল word ও handle করতে পারে।
একটা function `tokenize_all(text)` লিখুন যেটা return করবে একটা dictionary: {sentences: [...], words: [...], chars: [...], subwords: [...]}। User input হিসেবে যেকোনো paragraph নিয়ে চার level এ ভেঙে দেখাবে। Bonus: প্রতিটা level এর count print করুন।