Home »
Blog »
AI/ML Engineer সিরিজ » Series 07 » Episode 01
Computer কীভাবে ভাষা বোঝে? Text preprocessing ও Tokenization
text-কে token-এ ভাঙা (Series 07, Episode 01)
🟢 BEGINNER
Series 07 — NLP, Transformers ও LLM
Episode 01 / 08
📑 এই পর্বে যা যা আছে
- ১. গল্প: Rahim-এর CV filter করার সমস্যা
- ২. আসল সমস্যা: computer তো text বোঝে না
- ৩. কেন text সরাসরি সংখ্যা নয়
- ৪. তিন স্তরে বোঝা: intuition → technical → engineer
- ৫. Text Preprocessing pipeline (visual)
- ৬. Tokenization কী এবং কত রকম
- ৭. Code: raw text থেকে token
- ৮. Experiment: বাংলা ও English টেক্সটে পার্থক্য
- ৯. বাস্তব উদাহরণ: বাংলাদেশের context
- ১০. AI Engineer perspective
- ১১. Boss Question
- ১২. Job Requirement Decoder: "NLP / Text Processing"
- ১৩. সাধারণ ভুল
- ১৪. Interview Prep
- ১৫. হাতে-কলমে
- ১৬. Project Connection
- ১৭. সারসংক্ষেপ ও পরবর্তী পর্ব
🧩 ১. গল্প: Rahim-এর CV filter করার সমস্যা
Rahim একটা ছোট software company-তে junior developer। একদিন তার HR টিম একটা অনুরোধ নিয়ে এল —
"আমাদের কাছে ৫০০টা CV জমা পড়েছে। এমন একটা tool বানাও যেটা automatically বলে দেবে কোন CV-তে
Python, Django বা Machine Learning-এর কথা আছে।"
Rahim ভাবল — সহজ! সে if "python" in cv_text লিখল। কিন্তু সমস্যা শুরু হলো তখনই।
একটা CV-তে লেখা "PYTHON", আরেকটাতে "Python.", তৃতীয়টাতে "python3", আরেকটাতে
"Py-thon"। তার simple string matching সব ধরতে পারছিল না।
Rahim তার সিনিয়র Nila-কে জিজ্ঞেস করল:
"আপা, computer তো এত fast, তাহলে সে 'PYTHON' আর 'python' এক জিনিস বুঝতে পারছে না কেন?"
Nila হেসে বলল: "কারণ computer আসলে ভাষা 'বোঝে' না — সে শুধু সংখ্যা নিয়ে কাজ করে। ভাষাকে
সংখ্যায় রূপান্তর করার আগে তাকে পরিষ্কার আর গোছানো করতে হয়। এই পুরো ব্যাপারটাকে বলে
text preprocessing, আর তার প্রথম গুরুত্বপূর্ণ ধাপ হলো tokenization।
এটাই NLP-র সব কিছুর ভিত্তি।"
❓ ২. আসল সমস্যা: computer তো text বোঝে না
আমরা মানুষ "চাকরি", "job", "চাকুরী" — এগুলো একই অর্থে বুঝি। কিন্তু computer-এর কাছে এগুলো শুধু
কিছু character-এর sequence। সে জানে না কোনটা important, কোনটা punctuation, কোথায় একটা শব্দ শেষ
আর আরেকটা শুরু।
NLP (Natural Language Processing) হলো সেই field যেখানে আমরা computer-কে মানুষের
ভাষা process করতে শেখাই। কিন্তু সব ML model-ই শেষ পর্যন্ত সংখ্যা (number) নিয়ে কাজ করে। তাই আমাদের
প্রথম কাজ — messy human text-কে এমন একটা পরিষ্কার রূপে আনা যাতে সেটাকে সংখ্যায় রূপান্তর করা যায়।
মূল কথা: Text → Preprocessing → Tokens → Numbers → Model।
আজ আমরা প্রথম দুই ধাপ শিখব — এগুলো ছাড়া কোনো NLP model কাজ করে না।
🎯 ৩. কেন text সরাসরি সংখ্যা নয়
একটা structured dataset-এ (যেমন house price) আমাদের কাছে আগে থেকেই সংখ্যা থাকে — area, room সংখ্যা, দাম।
কিন্তু text unstructured। "আমি Python জানি" — এই বাক্যে কোনো readymade সংখ্যা নেই। তাই আমাদের নিজেদের
এমন একটা পদ্ধতি বানাতে হয় যা text-কে ধাপে ধাপে model-এর উপযোগী করে তোলে।
এই সমস্যাটা কেন গুরুত্বপূর্ণ, বাস্তবে দেখা যাক:
| মানুষ যা দেখে | computer যা দেখে (raw) | preprocessing-এর পরে |
| Python | P, y, t, h, o, n | token: python |
| PYTHON! | P,Y,T,H,O,N,! | token: python |
| python3 | p,y,t,h,o,n,3 | token: python3 বা python |
খেয়াল করুন — preprocessing-এর পরে তিনটাই কাছাকাছি রূপে চলে আসছে। এটাই আমাদের লক্ষ্য।
🪜 ৪. তিন স্তরে বোঝা
Level 1 — সহজ intuition:
ধরুন আপনি একটা বড় paragraph পেলেন আর আপনাকে বলা হলো শব্দ গুনতে। আপনি প্রথমে কী করবেন?
বাক্যটাকে আলাদা আলাদা শব্দে ভাগ করবেন। এই "শব্দে ভাগ করা"-ই হলো tokenization। আর তার আগে
অপ্রয়োজনীয় জিনিস (extra space, punctuation, বড়-হাতের অক্ষর) পরিষ্কার করা হলো preprocessing।
Level 2 — technical:
Preprocessing-এ সাধারণত থাকে: lowercasing, punctuation সরানো, extra whitespace সরানো, এবং
প্রয়োজনে stopword (যেমন "the", "is", "এবং") বাদ দেওয়া। Tokenization হলো একটা string-কে
ছোট একক (token)-এ ভাঙা — word, subword বা character level-এ।
Level 3 — AI Engineer perspective:
Production-এ আমরা সাধারণত নিজে naive tokenizer লিখি না। আধুনিক LLM/Transformer model
subword tokenization (যেমন BPE, WordPiece) ব্যবহার করে, যা vocabulary ছোট রাখে আর
unknown শব্দও handle করতে পারে। কিন্তু classical NLP (TF-IDF ইত্যাদি)-এর জন্য word-level
tokenization এখনো দরকারি — তাই দুটোই বোঝা জরুরি।
🖼️ ৫. Text Preprocessing pipeline (visual)
Raw text: " Rahim জানে Python, Django & SQL!!! "
|
v
[1] Strip / normalize whitespace
"Rahim জানে Python, Django & SQL!!!"
|
v
[2] Lowercase (English অংশ)
"rahim জানে python, django & sql!!!"
|
v
[3] Punctuation পরিষ্কার
"rahim জানে python django sql"
|
v
[4] Tokenize (শব্দে ভাগ)
["rahim", "জানে", "python", "django", "sql"]
|
v
[5] (Optional) Stopword সরানো
["rahim", "python", "django", "sql"]
প্রতিটা ধাপ optional — কোন ধাপ লাগবে সেটা নির্ভর করে আপনি কী বানাচ্ছেন তার উপর। যেমন,
Transformer model-এ আমরা সাধারণত lowercase বা stopword removal করি না, কারণ model নিজেই context
থেকে শিখে নেয়।
✂️ ৬. Tokenization কী এবং কত রকম
Token হলো text-এর ক্ষুদ্রতম অর্থপূর্ণ একক যা দিয়ে model কাজ করে। Tokenization মূলত তিন ধরনের:
| ধরন | "unbelievable" কীভাবে ভাঙে | সুবিধা / অসুবিধা |
| Word-level | ["unbelievable"] | সহজ, কিন্তু নতুন/unknown শব্দে আটকায়; vocabulary বিশাল হয় |
| Character-level | ["u","n","b","e",...] | vocabulary ছোট, কিন্তু sequence খুব লম্বা, meaning ধরা কঠিন |
| Subword (BPE/WordPiece) | ["un","believ","able"] | ভারসাম্য — LLM/Transformer এটাই ব্যবহার করে |
গুরুত্বপূর্ণ distinction: "token" মানে সবসময় "word" নয়। GPT-এর মতো LLM-এ
একটা ইংরেজি word প্রায়ই একাধিক token হয় (গড়ে ১ word ≈ ১.৩ token)। তাই যখন শুনবেন "context window
৮০০০ token", সেটা ৮০০০ শব্দ নয় — এই পার্থক্যটা মনে রাখা জরুরি, S07E08-এ আবার দেখব।
💻 ৭. Code: raw text থেকে token
প্রথমে pure Python + regex দিয়ে একটা সহজ tokenizer বানাই। কেন regex? — কারণ punctuation আর
whitespace handle করতে এটা দ্রুত ও নির্ভরযোগ্য, কোনো external library ছাড়াই।
import re
def simple_preprocess(text: str) -> list[str]:
"""Raw text -> পরিষ্কার token list (word-level)।"""
# 1) lowercase (ইংরেজি অংশের জন্য কাজে দেয়)
text = text.lower()
# 2) শুধু অক্ষর, সংখ্যা আর whitespace রাখি; বাকি সরাই
# \w বাংলা unicode-ও ধরে (re.UNICODE default in py3)
text = re.sub(r"[^\w\s]", " ", text)
# 3) একাধিক space -> একটা space, তারপর split
tokens = text.split()
return tokens
sample = " Rahim জানে Python, Django & SQL!!! "
print(simple_preprocess(sample))
# ['rahim', 'জানে', 'python', 'django', 'sql']
এবার আসল NLP library দিয়ে — nltk। কেন library? কারণ এটা "Mr. Rahim's degree is B.Sc."
-এর মতো জটিল ক্ষেত্রে (সংক্ষিপ্ত রূপ, সময়, decimal) অনেক বেশি নির্ভুল, যেটা naive regex ভুল করে।
# pip install nltk
import nltk
nltk.download("punkt_tab") # প্রথমবার একবারই লাগে
from nltk.tokenize import word_tokenize, sent_tokenize
text = "Rahim knows Python. He also uses FastAPI!"
# বাক্যে ভাগ
print(sent_tokenize(text))
# ['Rahim knows Python.', 'He also uses FastAPI!']
# শব্দে ভাগ (punctuation আলাদা token হিসেবে আসে)
print(word_tokenize(text))
# ['Rahim', 'knows', 'Python', '.', 'He', 'also', 'uses', 'FastAPI', '!']
এবং modern subword tokenizer — যেটা Transformer model আসলে ব্যবহার করে:
# pip install transformers
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("bert-base-uncased")
out = tok.tokenize("unbelievable tokenization")
print(out)
# ['un', '##bel', '##ie', '##va', '##ble', 'token', '##ization']
# '##' মানে: আগের token-এর সাথে জোড়া (subword)
🔬 ৮. Experiment: বাংলা ও English টেক্সটে পার্থক্য
নিচের experiment নিজে চালিয়ে দেখুন — একই শব্দ কীভাবে ভিন্ন ভিন্ন সংখ্যক token-এ ভাঙে:
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("bert-base-multilingual-cased")
for s in ["Python", "চাকরি", "মেশিন লার্নিং", "unbelievable"]:
ids = tok.encode(s, add_special_tokens=False)
print(f"{s:15} -> {len(ids)} tokens -> {tok.convert_ids_to_tokens(ids)}")
যা লক্ষ্য করবেন: বাংলা শব্দ প্রায়ই ইংরেজির চেয়ে বেশি token-এ ভাঙে, কারণ বেশিরভাগ
model মূলত ইংরেজি data-তে বেশি train করা। এটাই একটা বাস্তব সমস্যা — বাংলা NLP application-এ
একই কাজ করতে বেশি token লাগে, মানে বেশি খরচ ও latency। AI Engineer হিসেবে এই খরচের হিসাব রাখা জরুরি।
🇧🇩 ৯. বাস্তব উদাহরণ: বাংলাদেশের context
- Daraz / e-commerce: product review ("খুব ভালো!!!", "faltu product 😡")
preprocess করে sentiment বের করা।
- bKash / Nagad support: customer message tokenize করে বোঝা সে কী সমস্যায় আছে।
- Job portal (bdjobs): CV আর job description থেকে skill token বের করে match করা —
ঠিক Rahim-এর সমস্যাটাই।
👷 ১০. AI Engineer perspective
একজন junior "tokenizer" শব্দটা শুনলে ভয় পায়। একজন engineer জানে — এটা কেবল একটা tool, আর মূল দক্ষতা হলো
সঠিক tokenizer বেছে নেওয়া:
Must Know (চাকরির আগে): preprocessing কেন লাগে, word vs subword tokenization-এর
পার্থক্য, nltk/transformers দিয়ে tokenize করা।
Good to Know: stemming vs lemmatization, stopword-এর প্রভাব, বাংলা normalization।
Learn Later (চাকরির পরেও চলবে): নিজে থেকে BPE tokenizer train করা, custom vocabulary।
💼 ১১. Boss Question
Boss: "ঠিক আছে, শব্দ ভাঙা শিখলে। কিন্তু আমার business-এ এই tokenization কোথায় কাজে লাগবে?"
উত্তর: আমাদের support team প্রতিদিন হাজার হাজার customer message পায়। tokenization ছাড়া
আমরা automatically বুঝতে পারব না কোন message জরুরি, কোনটা complaint, কোনটা refund চাইছে। এটা প্রথম ধাপ —
এর উপরেই পরে auto-routing, spam filter আর chatbot দাঁড়াবে। মানে: কম manpower, দ্রুত response — সরাসরি খরচ কমানো।
🔎 ১২. Job Requirement Decoder: "NLP / Text Processing"
JD-তে দেখবেন:
"Experience with NLP and text preprocessing techniques."
| প্রশ্ন | উত্তর |
| কী বোঝায়? | raw text পরিষ্কার করে model-এর উপযোগী করতে পারা — tokenization, cleaning, normalization। |
| কেন চায়? | প্রায় সব NLP/LLM project text ঘেঁটে শুরু হয়; নোংরা input মানে খারাপ output। |
| কোন সমস্যা সমাধান করে? | inconsistent text (case, punctuation, encoding) থেকে reliable feature বের করা। |
| junior-এর কী জানা লাগে? | nltk/regex দিয়ে clean+tokenize, word vs subword পার্থক্য, একটা text pipeline লেখা। |
| এখনই কী master লাগে না? | custom tokenizer training, multilingual normalization-এর গভীর তত্ত্ব। |
| GitHub-এ কীভাবে দেখাবেন? | একটা preprocess.py module + README-তে before/after উদাহরণ। |
| Interview-তে? | "tokenization কী?", "word vs subword?", "stopword কখন সরাবেন, কখন না?" |
⚠️ ১৩. সাধারণ ভুল
ভুল ১: সব ক্ষেত্রে stopword সরিয়ে ফেলা। → sentiment বা LLM-এ "not good"-এর "not"
সরালে অর্থ উল্টে যায়!
ভুল ২: token = word ধরে নেওয়া। → LLM-এ token সাধারণত subword; খরচ হিসাব ভুল হবে।
ভুল ৩: বাংলা text-এ শুধু .split() ব্যবহার। → যুক্তাক্ষর, punctuation ঠিকমতো handle হয় না।
ভুল ৪: train আর inference-এ ভিন্ন preprocessing। → model খারাপ করবে; একই pipeline দুই জায়গায় লাগান।
🎤 ১৪. Interview Prep
প্রশ্ন ১: Tokenization কী?
উত্তর: text-কে ছোট একক (token — word/subword/character)-এ ভাঙা, যাতে model সেটাকে সংখ্যায়
রূপান্তর করে process করতে পারে।
প্রশ্ন ২: Subword tokenization কেন LLM-এ ব্যবহৃত হয়?
উত্তর: vocabulary ছোট রাখে, unknown/rare শব্দ handle করে, আর word ও character-এর মাঝামাঝি
একটা ভারসাম্য দেয়।
প্রশ্ন ৩: Stemming আর lemmatization-এর পার্থক্য?
উত্তর: stemming নিয়ম মেনে শব্দের শেষ কেটে দেয় (running→run, কিন্তু কখনো ভুল রূপ); lemmatization
অভিধান/grammar দেখে আসল রূপে আনে (better→good), বেশি নির্ভুল কিন্তু ধীর।
✍️ ১৫. হাতে-কলমে
১. উপরের simple_preprocess ফাংশনটা নিন। এটাকে upgrade করুন যাতে এটা stopword-এর একটা
ছোট list (["the","is","a","এবং","একটি"]) বাদ দেয়।
২. একটা বাংলা ও একটা ইংরেজি বাক্য নিয়ে bert-base-multilingual-cased দিয়ে token সংখ্যা তুলনা করুন।
৩. নিজের ভাষায় লিখুন: কেন sentiment analysis-এ stopword সরানো বিপজ্জনক হতে পারে?
🚀 ১৬. Project Connection
আমাদের flagship "Bangladesh Tech Career Assistant" এই পর্ব থেকে V5 (NLP)
পর্যায়ে ঢুকছে। এতদিন আমরা job description-কে structured data হিসেবে দেখেছি; এবার আমরা raw JD text
নিয়ে কাজ শুরু করব।
আজকের preprocess.py module-টাই আমাদের project-এর প্রথম NLP building block। পরের পর্বে
(TF-IDF) এই token-গুলো দিয়েই আমরা JD থেকে skill খুঁজে বের করা ও document-এর মধ্যে similarity মাপা শুরু করব।
📌 ১৭. সারসংক্ষেপ ও পরবর্তী পর্ব
এই পর্বে শিখলাম:
✓ Computer ভাষা "বোঝে" না — সব শেষে সংখ্যা নিয়ে কাজ করে, তাই preprocessing দরকার
✓ Text preprocessing pipeline: clean → normalize → tokenize → (optional) stopword removal
✓ Tokenization তিন রকম: word / character / subword; LLM ব্যবহার করে subword
✓ token ≠ word — এই পার্থক্য খরচ ও context window বুঝতে জরুরি
✓ regex, nltk ও transformers দিয়ে হাতে-কলমে tokenize করা
✓ বাংলা text প্রায়ই বেশি token নেয় — এটা বাস্তব খরচের ব্যাপার
পরবর্তী পর্ব (S07E02): token তো পেলাম, কিন্তু এগুলোকে সংখ্যায় রূপান্তর করে model-এ
দেব কীভাবে? পরের পর্বে আমরা Bag of Words ও TF-IDF শিখব — classical NLP-র সেই পদ্ধতি
যা দিয়ে আমরা প্রথম text classifier (Project P5) বানাব।