Stemming
Word এর base root form খুঁজে বের করা।
'play', 'playing', 'played', 'plays' — চারটা আলাদা word? নাকি একটাই word এর চারটা রূপ? Computer যদি প্রতিটা কে আলাদা ধরে, তাহলে তার vocabulary বিশাল বড় হয়ে যাবে। Stemming এই সমস্যার সবচেয়ে সহজ সমাধান।
Stemming হলো একটা word এর শেষ suffix কেটে base/root form বের করার rule-based process। যেমন 'playing' → 'play', 'caring' → 'car' (notice — সবসময় meaningful হয় না, এটাই stemming এর limitation)। এটা fast কিন্তু crude — শুধু string chopping।
Stemming হলো একজন কুড়াল-হাতে কাঠুরে। সে গাছের ডালপালা কাটে দ্রুত, কিন্তু কখনো একটু বেশি কেটে ফেলে। 'studies' → 'studi' (real word না), 'better' → 'better' (কাটতে পারে না)। তাই stemming এর output সবসময় valid dictionary word হবে না — এটা শুধু matching/grouping এর জন্য ব্যবহৃত হয়।
from nltk.stem import PorterStemmer, SnowballStemmer, LancasterStemmer
from nltk.tokenize import word_tokenize
import nltk
nltk.download("punkt", quiet=True)
nltk.download("punkt_tab", quiet=True)
words = ["playing", "played", "plays", "player",
"studies", "studying", "studied",
"caring", "cared", "running", "ran",
"better", "happily", "fairly"]
porter = PorterStemmer()
snowball = SnowballStemmer("english")
lancaster = LancasterStemmer()
print(f"{'Word':<12}{'Porter':<12}{'Snowball':<12}{'Lancaster':<12}")
print("-" * 48)
for w in words:
print(f"{w:<12}{porter.stem(w):<12}{snowball.stem(w):<12}{lancaster.stem(w):<12}")
# In real pipeline
text = "The boys are playing football happily in the studied field."
tokens = word_tokenize(text.lower())
stemmed = [porter.stem(t) for t in tokens]
print("\nStemmed sentence:", stemmed)তিনটা stemmer একই word এ আলাদা result দেয় — Porter conservative, Snowball balanced, Lancaster aggressive (কখনো একদম root টা ও কেটে ফেলে)। 'studies' → 'studi', 'happily' → 'happili' — notice এগুলো actual English word না। এটাই stemming এর nature। 'better' → 'better' (irregular word handle করতে পারে না, সেজন্য পরের chapter এ Lemmatization এ যাব)।
একটা mini search system বানান — ১০টা document এর list থাকবে। User একটা query দিবে। আপনি query এবং সব document কে stem করে compare করবেন। যে document এর stemmed words এর সাথে query এর stemmed word সবচেয়ে বেশি match — সেটা return করবেন। দেখবেন 'run' search করলে 'running' আছে এমন document ও match হচ্ছে।