Similarity Measures
Cosine similarity দিয়ে দুই text কতটা কাছাকাছি বের করা।
দুটো sentence কতটা একই মানে বহন করে — মানুষ instantly বুঝতে পারে। Computer কে এটা শেখাতে চাই একটা গণিত — যেটা দুই vector দেখে বলবে এরা কতটা কাছাকাছি। সেই গণিতের রাজা: Cosine Similarity।
Similarity Measure হলো দুই vector (text এর numerical representation) এর মধ্যে closeness measure করার গণিতিক উপায়। NLP তে সবচেয়ে জনপ্রিয়: Cosine Similarity (দুই vector এর angle এর cosine, -1 থেকে 1)। Euclidean distance, Dot product, Jaccard similarity — অন্যান্য variants।
Cosine similarity এর intuition সহজ: দুই vector কে arrow হিসেবে কল্পনা করুন। এদের মাঝে কত ডিগ্রী angle? 0° হলে cosine = 1 (perfectly similar)। 90° হলে cosine = 0 (unrelated)। 180° হলে cosine = -1 (opposite)। সবচেয়ে বড় সুবিধা — vector এর length এ effect পড়ে না, শুধু direction matter করে। মানে দুটো document এর length আলাদা হলেও cosine ঠিক compare করে।
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
documents = [
"I love Bangla NLP and machine learning",
"Machine learning is a part of artificial intelligence",
"Bangla is a beautiful language with rich literature",
"Cricket is the most popular sport in Bangladesh",
]
# Step 1: TF-IDF vectors
tfidf = TfidfVectorizer(stop_words="english")
vectors = tfidf.fit_transform(documents)
# Step 2: Cosine similarity matrix
sim_matrix = cosine_similarity(vectors)
print("Cosine Similarity Matrix:")
for i, row in enumerate(sim_matrix):
print(f"Doc{i+1}: {[round(s, 3) for s in row]}")
# Step 3: Semantic search example
query = "AI and machine learning"
query_vec = tfidf.transform([query])
sims = cosine_similarity(query_vec, vectors).flatten()
print(f"\nQuery: '{query}'")
for idx in sims.argsort()[::-1]:
print(f" Score={sims[idx]:.3f} | {documents[idx]}")
# Modern approach: sentence-transformers (semantic, not just keyword)
# pip install sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
sent1 = "The cat sits on the mat"
sent2 = "A feline rests on a rug"
emb = model.encode([sent1, sent2])
print(f"\nSemantic similarity (Transformer): {cosine_similarity([emb[0]], [emb[1]])[0][0]:.3f}")
# Compare with TF-IDF (keyword-based)
tfidf2 = TfidfVectorizer()
v = tfidf2.fit_transform([sent1, sent2])
print(f"TF-IDF similarity (keyword): {cosine_similarity(v[0], v[1])[0][0]:.3f}")sklearn এর `cosine_similarity` যেকোনো দুই vector এর মধ্যে cosine score calculate করে। লক্ষ্য করুন — TF-IDF based similarity শুধু matching word দেখে। তাই 'cat sits on mat' এবং 'feline rests on rug' এর TF-IDF similarity প্রায় 0 (একই word নেই)। কিন্তু Sentence Transformer (modern semantic model) ০.৭+ score দেয় — কারণ এটা meaning বুঝে। এটাই classical NLP থেকে modern NLP এর jump।
১৫-২০টা FAQ (প্রশ্ন এবং উত্তর) দিয়ে একটা list বানান। Sentence-Transformers (`all-MiniLM-L6-v2`) দিয়ে সব প্রশ্নের embedding pre-compute করুন। User যেকোনো প্রশ্ন করলে — সেটারও embedding বানান, সব FAQ এর সাথে cosine similarity calculate করুন, এবং top-১ এর উত্তর return করুন। যদি similarity 0.5 এর কম হয়, 'I don't know' বলুন। এটাই RAG system এর সবচেয়ে simple version — এই প্যাটার্ন পরে ChatGPT-style custom bot বানাতে কাজে দেবে।