রোডম্যাপ
PHASE 1 · অধ্যায় 8

পার্ট অফ স্পিচ ট্যাগিং

POS Tagging

প্রতিটা word noun, verb, adjective কিনা চিহ্নিত করা।

ভূমিকা

'I saw her duck' — এই sentence এর 'duck' কী? পাখি (noun)? নাকি মাথা নিচু করা (verb)? Context ছাড়া বোঝা যায় না। Computer কে এই 'কী ধরনের word' বোঝানোর কাজটাই POS Tagging।

ধারণা

POS (Part-of-Speech) Tagging হলো একটা sentence এর প্রতিটা word কে তার grammatical category — noun, verb, adjective, adverb, pronoun, preposition ইত্যাদি — চিহ্নিত করার process। Modern POS tagger ML-based এবং context দেখে tag করে।

সহজ ব্যাখ্যা

POS tag হলো word এর 'job title'। 'run' কখনো noun ('a morning run'), কখনো verb ('I run'). Tagger এর কাজ হলো surrounding context দেখে সঠিক job title দেওয়া। এটা NLP এর deep understanding এর প্রথম step — কারণ grammar বোঝা ছাড়া meaning বোঝা যায় না।

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

  • Grammar checker (Grammarly) — POS দিয়ে subject-verb agreement check করে।
  • Machine translation — noun/verb ঠিকঠাক translate করার জন্য essential।
  • Information extraction — noun phrase ই সাধারণত entity হয়।
  • Question answering — 'who' প্রশ্নে noun খুঁজতে হয়, 'when' এ time phrase।
  • Text-to-speech — শব্দের সঠিক উচ্চারণ POS এর উপর depend করে।

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

1
Step 1 — Tokenize
Word-level tokenization।
2
Step 2 — Tagger choose করুন
NLTK pos_tag (simple), spaCy (modern, fast), Stanford (academic)।
3
Step 3 — Tag set বুঝুন
Penn Treebank tags: NN (noun), VB (verb), JJ (adjective), RB (adverb)।
4
Step 4 — Output use করুন
Noun extract, verb count, entity detection — যা দরকার।

Python কোড

import nltk
from nltk.tokenize import word_tokenize
nltk.download("punkt", quiet=True)
nltk.download("punkt_tab", quiet=True)
nltk.download("averaged_perceptron_tagger_eng", quiet=True)

text = "Sadiq writes beautiful Bangla NLP tutorials every day."
tokens = word_tokenize(text)

# NLTK tagging
tagged = nltk.pos_tag(tokens)
for word, tag in tagged:
    print(f"{word:<12} -> {tag}")

# Common Penn Treebank tags
print("\nCommon tags:")
print("NN = Noun, NNS = Plural Noun, NNP = Proper Noun")
print("VB = Verb, VBD = Past, VBG = -ing form")
print("JJ = Adjective, RB = Adverb, IN = Preposition")

# spaCy — more user-friendly tags
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("She quickly wrote a fantastic novel about AI.")
print("\nspaCy output:")
for token in doc:
    print(f"{token.text:<10} POS={token.pos_:<6} TAG={token.tag_}")
ব্যাখ্যা

NLTK Penn Treebank tag set use করে — যেমন NNP (Proper Noun), VBZ (3rd person singular verb)। spaCy দুই ধরনের tag দেয় — coarse (NOUN, VERB — easy to read) এবং fine-grained (NN, VBZ — detailed)। দুটোই কাজে আসে। Modern application এ spaCy preferred কারণ এটা fast এবং accurate।

সাধারণ ভুল

  • Tag গুলো মুখস্থ করার চেষ্টা — top ১০টা জানলেই কাজ চলে।
  • Lowercase করে tag করা — 'Sadiq' lowercase হলে 'sadiq' আর proper noun (NNP) ধরা পরে না।
  • POS tag কে fully accurate ধরে নেওয়া — ambiguous case এ ভুল হতে পারে।
  • Bangla এ English POS tagger ব্যবহার — কাজ করে না, BNLP/iNLTK ব্যবহার করুন।

অনুশীলন

  1. 'I saw her duck' এবং 'I saw her duck quickly' — দুটোতে 'duck' এর tag আলাদা আসছে কিনা দেখুন।
  2. একটা paragraph থেকে শুধু noun গুলো extract করে print করুন।
  3. একটা sentence এ verb কয়টা — count করার function লিখুন।

ছোট প্রজেক্ট

Mini Project: Grammar Profile Generator

একটা function `grammar_profile(text)` লিখুন যেটা return করবে: total nouns, total verbs, total adjectives, total adverbs, এবং noun-to-verb ratio। এটা দিয়ে আপনি কোন writer descriptive (বেশি adjective) আর কোন writer action-oriented (বেশি verb) সেটা বুঝতে পারবেন। ২টা ভিন্ন article এ apply করে compare করুন।

সারাংশ

  • POS Tagging = প্রতিটা word এর grammatical role চিহ্নিত করা।
  • Context-aware — same word আলাদা context এ আলাদা tag।
  • Penn Treebank tag set most common (NN, VB, JJ, RB)।
  • spaCy = production-grade POS tagger।