Natural Language Processingপড়তে ১০ মিনিট লাগবে

টেক্সট রিপ্রেজেন্টেশন (Text Representation)

যেকোনো শব্দকে এমন সংখ্যায় রূপান্তর করা যা কম্পিউটার পড়তে পারে
scope:কোর কনসেপ্ট (মূল ধারণা)difficulty:বিগিনার (Beginner)

শব্দেরও ঠিকানার প্রয়োজন হয় (Words Need Addresses)

কম্পিউটার মূলত সংখ্যা নিয়ে কাজ করে। এটি চোখের পলকে যোগ, গুণ এবং বিভিন্ন সংখ্যার তুলনা করতে পারে। কিন্তু কম্পিউটার কখনোই "cat" বা বিড়াল শব্দটির ওপর কোনো গাণিতিক অপারেশন চালাতে পারে না। তাহলে একটি কম্পিউটারকে আপনি ভাষা বুঝবেন কীভাবে?

এর সমাধান হলো প্রতিটি শব্দকে একটি সংখ্যায় রূপান্তর করা। আরও ভালো হয় যদি শব্দগুলোকে সংখ্যার একটি তালিকায় রূপান্তর করা যায়।

ব্যাপারটিকে একটি শহরের মতো চিন্তা করুন। প্রতিটি শব্দেরই একটি নিজস্ব ঠিকানা আছে। একই ধরনের শব্দগুলো একই রাস্তা বা পাড়ায় বসবাস করে। যেমন: "King" এবং "queen" হলো একে অপরের প্রতিবেশী। আবার "Cat" এবং "dog" একই পাড়ায় থাকে। অন্যদিকে "Pizza" এবং "democracy" শহরের দুই ভিন্ন মেরুতে থাকে।

আর এটিই হলো মূলত টেক্সট রিপ্রেজেন্টেশন (text representation) — অর্থাৎ প্রতিটি শব্দকে এমন সংখ্যায় রূপান্তর করার কৌশল যা তাদের আসল অর্থ ধরে রাখতে পারে।

সবচেয়ে সহজ উপায়: ওয়ান-হট এনকোডিং (One-Hot Encoding)

ধরা যাক, আপনার শব্দভাণ্ডারে মাত্র ৪টি শব্দ আছে: [cat, dog, fish, bird]। এবং আপনি এগুলোর প্রতিটিকে নিচের মতো করে উপস্থাপন করলেন:

  • cat = [1, 0, 0, 0]
  • dog = [0, 1, 0, 0]
  • fish = [0, 0, 1, 0]
  • bird = [0, 0, 0, 1]

এটি বুঝতে খুব সহজ হলেও শব্দের প্রকৃত অর্থ বোঝার ক্ষেত্রে এটি একেবারেই অকেজো। কারণ এর প্রতিটি শব্দই একে অপরের থেকে ঠিক সমান দূরের। যেমন: "democracy" থেকে "cat" ঠিক যতটা ভিন্ন, "dog" থেকেও সে ঠিক ততটাই আলাদা বা ভিন্ন। তাই আমাদের এর চেয়েও বেশি বুদ্ধিমান কোনো পদ্ধতি দরকার।

ব্যাগ অব ওয়ার্ডস (Bag of Words): গুণে দেখা এবং ভুলে যাওয়া

আগেরটির চেয়ে একটু উন্নত সংস্করণ হলো: কোনো ডকুমেন্টে কোন শব্দটি ঠিক কতবার আছে, তা গুনে বের করার মাধ্যমে ওই ডকুমেন্টটিকে রিপ্রেজেন্ট বা উপস্থাপন করা। যেমন: "The cat sat on the mat"-কে শব্দের সংখ্যার একটি ভেক্টরে রূপান্তর করা। এটি খুবই সহজ একটি উপায় আর বেসিক বা সাধারণ কিছু ক্লাসিফিকেশন কাজের ক্ষেত্রে এটি বেশ ভালোভাবেই কাজ করে।

কিন্তু এর একটি বড় সমস্যা হলো এটি শব্দের ক্রম বা সিকুয়েন্স মনে রাখতে পারে না। যেমন: "Dog bites man" এবং "Man bites dog"-এর অর্থ সম্পূর্ণ আলাদা হওয়া সত্ত্বেও ব্যাগ অব ওয়ার্ডস-এ দুটোর রিপ্রেজেন্টেশন একে অপরের একদম হুবহু বা আইডেন্টিক্যাল (identical) হবে।

টিএফ-আইডিএফ (TF-IDF): কখন একটি শব্দ স্পেশাল হয়ে ওঠে?

টিএফ-আইডিএফ বা TF-IDF (Term Frequency - Inverse Document Frequency) মূলত ওই ব্যাগ অব ওয়ার্ডস-এর একটি ভালো সংস্করণ। এটি "the"-এর মতো খুব সাধারণ শব্দগুলোকে কম স্কোর দেয় (কারণ এগুলো প্রায় সব জায়গাতেই ব্যবহার করা হয়)। অন্যদিকে "mitochondria"-এর মতো বিরল এবং স্বকীয় বা ডিস্টিঙ্কটিভ (distinctive) শব্দগুলোকে এটি বেশ হাই বা উচ্চ স্কোর দেয় (কারণ এগুলো কেবল নির্দিষ্ট কিছু ডকুমেন্টের জন্যই ইউনিক হয়ে থাকে)।

এটি অনেকটা বইয়ে কালার মার্ক করা বা হাইলাইট করার মতো: সাধারণ শব্দগুলো চোখে পড়ে না, কিন্তু আলাদা বা স্বতন্ত্র শব্দগুলো অনেক উজ্জ্বলভাবে দেখা যায়।

ওয়ার্ড এমবেডিংস (Word Embeddings): আসল ব্রেকথ্রু বা যুগান্তকারী ধাপ

২০১৩ সালে গুগলের (Google) একটি দল Word2Vec প্রকাশ করে, আর এর পরেই সবকিছু বদলে যায়। এই মডেলে স্পার্স (sparse) বা অর্থহীন ভেক্টরের বদলে প্রতিটি শব্দ ১০০-৩০০ সংখ্যার একটি ডেন্স ভেক্টর (dense vector) বা ঘন ভেক্টরে পরিণত হয়, এবং এই অসংখ্য ডেটা বা ডকুমেন্টের ওপর ট্রেইনিং করিয়েই একে শেখানো হয়।

আর এর পেছনের ম্যাজিক বা জাদুকরী ব্যাপারটি হলো: একই ধরনের অর্থ আছে এমন শব্দগুলো নিজেদের জন্য প্রায় একই রকমের ভেক্টর তৈরি করে। এর চেয়েও অবাক করার মতো বিষয় হলো, আপনি চাইলে এর অর্থ দিয়ে গাণিতিক হিসাব বা অ্যারিথমেটিক অপারেশন (arithmetic) করতে পারবেন:

King - Man + Woman ≈ Queen

"king" থেকে "man" বিয়োগ করে তার সাথে "woman" যোগ করলে আপনি ঠিক "queen"-এর কাছেই পৌঁছে যাবেন। এই মডেলটি নিজে থেকেই শিখে নিয়েছে যে রাজকীয়তা এবং লিঙ্গ (gender) মূলত অর্থের সম্পূর্ণ ভিন্ন দুটি ডাইমেনশন বা মাত্রা।

টেক্সট রিপ্রেজেন্টেশন: ব্যাগ অব ওয়ার্ডস থেকে টিএফ-আইডিএফ (TF-IDF)

from collections import Counter
import math
def bag_of_words(doc, vocab):
"""শব্দগুলো কতবার আছে সেটি গোনা।"""
words = doc.lower().split()
counts = Counter(words)
return [counts.get(w, 0) for w in vocab]
def tf_idf(docs, vocab):
"""প্রতিটি ডকুমেন্টের জন্য TF-IDF হিসাব করা।"""
n_docs = len(docs)
results = []
# ডকুমেন্ট ফ্রিকোয়েন্সি (Document frequency): প্রতিটি শব্দ কতগুলো ডকুমেন্টে আছে
df = {}
for w in vocab:
df[w] = sum(1 for d in docs if w in d.lower())
for doc in docs:
words = doc.lower().split()
n_words = len(words)
counts = Counter(words)
tfidf = []
for w in vocab:
tf = counts.get(w, 0) / n_words
idf = math.log(n_docs / (1 + df[w]))
tfidf.append(round(tf * idf, 3))
results.append(tfidf)
return results
# উদাহরণের জন্য কয়েকটি ডকুমেন্টস
docs = [
"the cat sat on the mat",
"the dog chased the cat",
"the bird flew over the mat"
]
vocab = ["cat", "dog", "bird", "mat", "the"]
print("ব্যাগ অব ওয়ার্ডস (Bag of Words):")
for i, doc in enumerate(docs):
print(f" ডক (Doc) {i+1}: {bag_of_words(doc, vocab)}")
print("\nটিএফ-আইডিএফ বা TF-IDF (খেয়াল করুন 'the'-এর স্কোর বেশ কম):")
for i, vec in enumerate(tf_idf(docs, vocab)):
print(f" ডক (Doc) {i+1}: {vec}")
Output
ব্যাগ অব ওয়ার্ডস (Bag of Words):
  ডক 1: [1, 0, 0, 1, 2]
  ডক 2: [1, 1, 0, 0, 2]
  ডক 3: [0, 0, 1, 1, 2]

টিএফ-আইডিএফ বা TF-IDF (খেয়াল করুন 'the'-এর স্কোর বেশ কম):
  ডক 1: [0.034, 0.0, 0.0, 0.034, -0.234]
  ডক 2: [0.041, 0.22, 0.0, 0.0, -0.281]
  ডক 3: [0.0, 0.0, 0.183, 0.034, -0.234]
Note: King - Man + Woman = Queen: Word2Vec-এর এই বিখ্যাত উদাহরণটি আমাদের দেখিয়ে দিয়েছে যে ওয়ার্ড এমবেডিংগুলো গভীর কোনো শব্দের অর্থ বা সিম্যান্টিক রিলেশনশিপও (semantic relationships) ধরে রাখতে পারে। মডেলটিকে কখনোই লিঙ্গ (gender) বা রাজকীয়তা সম্পর্কে কিছুই আলাদা করে শেখানো হয়নি — এটি বিলিয়ন বিলিয়ন শব্দের প্যাটার্ন পর্যবেক্ষণ করেই এই ধারণাগুলো একা একা আবিষ্কার করেছে। এনএলপি (NLP)-এর জগতে এটি ছিল এক যুগান্তকারী মুহূর্ত বা পিভোটাল মোমেন্ট (pivotal moment), যা প্রমাণ করেছিল যে নিছক পরিসংখ্যান বা স্ট্যাটিস্টিকস (statistics) থেকেও কোনো শব্দের আসল অর্থ বের করে আনা সম্ভব।

আধুনিক টেক্সট রিপ্রেজেন্টেশন (Modern Text Representation)

আজকের দিনে টেক্সট রিপ্রেজেন্টেশন আরও অনেক দূর এগিয়ে গেছে:

  • Word2Vec / GloVe — প্রতিটি শব্দের জন্য কেবল একটি নির্দিষ্ট ভেক্টর। নদীর পাড় নাকি কোনো অর্থনৈতিক ব্যাংক, সেটির মানে যাই হোক না কেন "Bank"-এর জন্য এটি একই ভেক্টরই ব্যবহার করে।
  • ELMo — প্রসঙ্গের ওপর নির্ভর করে কনটেক্সট-ডিপেন্ডেন্ট (context-dependent) এমবেডিং তৈরি করে। যেমন: "river bank" এবং "bank account"-এর জন্য "Bank" আলাদা আলাদা ভেক্টর তৈরি করে নেয়।
  • BERT / GPT — ট্রান্সফরমার-ভিত্তিক (transformer-based) মডেলগুলো পুরো বাক্যের জন্যই এমবেডিংস তৈরি করতে পারে, যা আগের যেকোনো উপায়ের চেয়ে অনেক ভালোভাবে প্রসঙ্গ (context), সূক্ষ্ম পার্থক্য (nuance) এবং অর্থ বুঝতে সাহায্য করে।

এখানে মূল ট্রেন্ডটি বেশ পরিষ্কার: শব্দের সংখ্যা গণনা করা থেকে শুরু করে প্রসঙ্গের ওপর নির্ভর করে আরও অর্থপূর্ণ রিপ্রেজেন্টেশন তৈরি করা পর্যন্ত এর ব্যাপ্তি এগিয়েছে। এর প্রতিটি উন্নত সংস্করণই নতুন নতুন ক্ষমতার দরজা খুলে দিয়েছে — যেমন আরও উন্নত সার্চ, দারুণ সব ট্রান্সলেশন বা অনুবাদ, অসাধারণ চ্যাটবট এবং সবশেষে বর্তমানে আমরা যেমন লার্জ ল্যাঙ্গুয়েজ মডেল বা এলএলএম (LLMs) ব্যবহার করছি, ঠিক তার মতো জিনিস।

ছোট কুইজ

শব্দের জন্য ওয়ান-হট এনকোডিং (one-hot encoding) ব্যবহারের সবচেয়ে বড় সমস্যা কী?
Challenge

পড়া চালিয়ে যান