Word Embeddings (Word2Vec, GloVe)
Word কে geometry তে রূপান্তর — meaning কে গাণিতিক ভাবে capture।
TF-IDF এর কাছে 'king' আর 'queen' সম্পূর্ণ unrelated word। কিন্তু মানুষ জানে এদের একটা গভীর সম্পর্ক আছে। Word2Vec এর জন্ম এই rocking discovery থেকে — 'king - man + woman ≈ queen'। Words যে geometry তে বসবাস করে, সেই space কে বলে Embedding Space।
Word Embedding হলো প্রতিটা word কে একটা dense numeric vector (সাধারণত ৫০-৩০০ dimension) এ map করার technique, যেখানে similar meaning এর word গুলো vector space এ কাছাকাছি থাকে। Word2Vec (Mikolov, 2013) এবং GloVe (Stanford, 2014) — দুটো সবচেয়ে famous classical embedding model।
ভাবুন একটা ৩০০-dimensional space যেখানে প্রতিটা word একটা point। 'king' এবং 'queen' কাছাকাছি। 'cat' এবং 'dog' কাছাকাছি। কিন্তু 'cat' এবং 'computer' দূরে। আশ্চর্যের ব্যাপার — vector arithmetic ও কাজ করে: vec('king') - vec('man') + vec('woman') ≈ vec('queen')। এই geometric relationship ই embedding এর জাদু। Word2Vec দুই version: CBOW (context থেকে word predict) এবং Skip-gram (word থেকে context predict)।
# pip install gensim
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess
# Tiny corpus (in real life, use millions of sentences)
corpus = [
"the king rules the kingdom",
"the queen is wise and kind",
"a man works hard every day",
"a woman manages the home and work",
"the prince will become king one day",
"the princess will become queen",
"cats and dogs are common pets",
"machine learning powers modern ai",
"deep learning is a subfield of ml",
]
# Preprocess
tokenized = [simple_preprocess(s) for s in corpus]
# Train Word2Vec (Skip-gram)
model = Word2Vec(
sentences=tokenized,
vector_size=50, # 50-dimensional embedding
window=3, # context window
min_count=1,
sg=1, # 1=Skip-gram, 0=CBOW
epochs=200,
)
# Vector for a word
print("Vector for 'king' (first 5 dims):", model.wv["king"][:5])
print("Vector size:", model.wv["king"].shape)
# Most similar words
print("\nMost similar to 'king':", model.wv.most_similar("king", topn=3))
print("Most similar to 'learning':", model.wv.most_similar("learning", topn=3))
# Similarity score
print("\nSimilarity king vs queen:", model.wv.similarity("king", "queen"))
print("Similarity king vs dog:", model.wv.similarity("king", "dog"))
# Famous analogy (works best with large pre-trained models)
try:
result = model.wv.most_similar(positive=["king", "woman"], negative=["man"], topn=1)
print("\nking - man + woman ≈", result)
except KeyError as e:
print("Word not in vocab:", e)Gensim এর Word2Vec class দিয়ে আমরা ছোট একটা embedding train করলাম। `vector_size=50` মানে প্রতিটা word একটা ৫০-dimensional vector। `sg=1` = Skip-gram (slower, but better for rare words), `sg=0` = CBOW (faster)। ছোট corpus এ analogy কাজ করবে না — সেজন্য large pre-trained model (Google News 300d, GloVe) ব্যবহার করতে হয়। `model.wv.most_similar()` দিয়ে কাছের word, এবং `similarity()` দিয়ে দুই word এর closeness পাই।
Gensim এর pre-trained 'glove-wiki-gigaword-100' download করুন (`api.load`)। একটা CLI tool বানান যেখানে user একটা word দিলে output দিবে: top-৫ similar words, vector এর first ১০ dimension, এবং user দুটো word দিলে similarity score। Bonus: একটা analogy mode — user 3 words দিলে চতুর্থটা predict করবে (king - man + woman = ?)।