রোডম্যাপ
PHASE 2 · অধ্যায় 13

সিমিলারিটি পরিমাপ

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 করে।

বাস্তব ব্যবহার

  • Search engine ranking — query vs document এর cosine।
  • Recommendation — 'similar products', 'similar users'।
  • Plagiarism detection — দুই document কত মিল।
  • Chatbot — user question vs FAQ এর match।
  • Vector database (Pinecone, FAISS) — billion-vector এর nearest neighbor search এ cosine।
  • RAG system (ChatGPT এর custom data version) — কোন chunk relevant তা cosine দিয়ে বের করে।

ধাপে ধাপে বিশ্লেষণ

1
Step 1 — Text কে vector এ convert করুন
TF-IDF, Word2Vec, বা Sentence Transformer দিয়ে।
2
Step 2 — Cosine formula apply করুন
cos(θ) = (A·B) / (|A| × |B|)।
3
Step 3 — Score interpret করুন
1 = identical, 0 = unrelated, -1 = opposite।
4
Step 4 — Top-K সাজান
অনেক candidate এর মধ্যে highest cosine গুলো select।

Python কোড

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।

সাধারণ ভুল

  • Cosine similarity = distance ভাবা — এটা similarity, distance = 1 - similarity।
  • Negative score পেয়ে confused হওয়া — কিছু embedding এ possible, TF-IDF এ negative হয় না (সব 0+)।
  • Vector length এ confused হওয়া — cosine length-independent, এটাই এর শক্তি।
  • Keyword matching expect করে semantic similarity পেতে চাওয়া — সেজন্য Sentence Transformer ব্যবহার করুন।
  • Million vectors এ brute-force cosine চালানো — production এ FAISS, Annoy, Pinecone ব্যবহার করুন।

অনুশীলন

  1. Cosine formula হাতে calculate করুন: A=[1,2,3], B=[2,4,6] — score কী হবে? (Hint: 1)
  2. Sentence-Transformer দিয়ে ৫টা sentence এর similarity matrix বানান।
  3. Euclidean distance এবং cosine similarity এর result compare করুন একই vector pair এ।
  4. একটা FAQ list বানান (১০টা QA pair)। User একটা query দিলে cosine দিয়ে best match return করুন।

ছোট প্রজেক্ট

Mini Project: Semantic FAQ Bot

১৫-২০টা 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 বানাতে কাজে দেবে।

সারাংশ

  • Cosine Similarity = দুই vector এর angle এর cosine (1 = same, 0 = unrelated)।
  • Length-independent — তাই text length আলাদা হলেও কাজ করে।
  • TF-IDF + cosine = keyword similarity। Sentence Transformer + cosine = semantic similarity।
  • Search, recommendation, RAG, vector database — সবার heart।
  • Phase 2 complete! আপনি এখন text কে number এ convert করে compare করতে পারেন — Classical NLP এর master।