ویژگی تصویر

مقدمه: کتابخانه NLTK در پایتون چیست و چرا مهم است

  /  پایتون   /  کتابخانه nltk در پایتون
بنر تبلیغاتی الف

کتابخانه NLTK (Natural Language Toolkit) یکی از محبوب‌ترین ابزارهای پردازش زبان طبیعی (NLP) در پایتون است. این کتابخانه مجموعه‌ای از ماژول‌ها، داده‌ها (corpora) و الگوریتم‌ها برای تحلیل متون، برچسب‌زنی دستوری، بازیابی اطلاعات و ساخت مدل‌های پایه را فراهم می‌کند. NLTK به‌خاطر مستندات کامل، آموزش‌ها و سهولت استفاده برای پژوهشگران و دانشجویان بسیار مناسب است.

کاربردها و موارد استفاده

  • پیش‌پردازش متن: توکنایز کردن، حذف توقف‌کلمات، ریشه‌یابی و لماتیزه کردن
  • تحلیل دستوری: برچسب‌گذاری قسم‌کلام (POS tagging) و شناسایی موجودیت‌های اسمی (NER)
  • تحلیل آماری: توزیع فراوانی، هم‌آیی (collocations) و concordance
  • شبکه‌های معنایی: استفاده از WordNet برای یافتن مترادف‌ها و روابط معنایی
  • آموزش مدل‌های پایه: طبقه‌بندی با Naive Bayes، استخراج ویژگی و پایپ‌لاین‌های ساده

نصب و راه‌اندازی

pip install nltk
python -m nltk.downloader popular

در خط اول NLTK نصب می‌شود و در خط دوم بسته‌های رایج (مانند punkt، stopwords، wordnet) دانلود می‌گردد. این روش برای شروع سریع مناسب است.

توکنایزینگ، حذف توقف‌کلمات و ریشه‌یابی

from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer

text = "NLTK is a powerful toolkit for natural language processing in Python."
tokens = word_tokenize(text)
stops = set(stopwords.words('english'))
filtered = [t for t in tokens if t.lower() not in stops]
ps = PorterStemmer()
stems = [ps.stem(t) for t in filtered]

print(tokens)
print(filtered)
print(stems)

کد بالا متن را به توکن‌ها تقسیم می‌کند، توقف‌کلمات انگلیسی را حذف می‌کند و سپس روی توکن‌های باقی‌مانده ریشه‌یابی (stemming) انجام می‌دهد. اگر نیاز به دقت معنایی بیشتر دارید، به‌جای ریشه‌یابی از لماتیزه‌کننده استفاده کنید.

لماتیزه کردن با POS مناسب (بهینه‌سازی)

from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
from nltk import pos_tag, word_tokenize

def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return wordnet.NOUN

text = "The striped bats are hanging on their feet and are happily eating fishes."
tokens = word_tokenize(text)
pos_tags = pos_tag(tokens)
wnl = WordNetLemmatizer()
lemmas = [wnl.lemmatize(tok, get_wordnet_pos(tag)) for tok, tag in pos_tags]

print(pos_tags)
print(lemmas)

در این مثال از تابع کمکی برای تبدیل برچسب‌های Treebank (خروجی pos_tag) به فرمت WordNet استفاده کرده‌ایم تا لماتیزه دقیق‌تر انجام شود. این به‌ویژه برای افعال و صفات اهمیت دارد.

برچسب‌گذاری قسم‌کلام و شناسایی موجودیت‌ها

from nltk import pos_tag, ne_chunk
from nltk.tokenize import word_tokenize

sentence = "Apple is looking at buying U.K. startup for $1 billion"
tokens = word_tokenize(sentence)
pos = pos_tag(tokens)
chunks = ne_chunk(pos)

print(pos)
print(chunks)

این قطعه ابتدا توکن‌ها را برچسب‌گذاری دستوری می‌کند و سپس ساختاری درختی برای موجودیت‌های اسمی تولید می‌کند. خروجی ne_chunk می‌تواند موجودیت‌هایی مانند سازمان‌ها، مکان‌ها و اشخاص را مشخص کند.

کار با WordNet: مترادف‌ها و مثال‌ها

from nltk.corpus import wordnet as wn

synsets = wn.synsets('bank')
for s in synsets[:5]:
    print(s.name(), s.definition())

WordNet یک پایگاه معنایی است که برای هر کلمه مجموعه‌ای از سین‌ست‌ها (synsets) شامل تعریف و مثال ارائه می‌دهد. این ابزار برای استخراج مترادف‌ها، هایپرنیم‌ها (hypernyms) و روابط مفید است.

خلاصه ماژول‌ها و توابع کاربردی

ماژول/تابعکاربرد
tokenizeتقسیم متن به کلمات یا جملات
corpus (stopwords, wordnet)دیتاست‌ها و لغت‌نامه‌های آماده
stem, lemmatizeکاهش کلمات به ریشه یا صورت پایه
pos_tag, ne_chunkتحلیل نحوی و شناسایی موجودیت
FreqDist, collocationsتحلیل آماری واژگان

مثال عملی: طبقه‌بندی متن با Naive Bayes

import nltk
from nltk.corpus import movie_reviews
import random

documents = [(list(movie_reviews.words(fileid)), category)
             for category in movie_reviews.categories()
             for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)

all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = list(all_words)[:2000]

def document_features(doc):
    doc_words = set(w.lower() for w in doc)
    return {f'contains({w})': (w in doc_words) for w in word_features}

feature_sets = [(document_features(d), c) for (d, c) in documents]
train_set, test_set = feature_sets[100:], feature_sets[:100]
classifier = nltk.NaiveBayesClassifier.train(train_set)

print(nltk.classify.accuracy(classifier, test_set))
classifier.show_most_informative_features(10)

در این نمونه از دیتاست movie_reviews برای آموزش یک طبقه‌بند ساده Naive Bayes استفاده شد. ابتدا ویژگی‌های رایج استخراج می‌شوند و سپس مدل آموزش داده شده و دقت آن اندازه‌گیری می‌شود. این روش برای پروتوتایپینگ سریع مفید است اما برای کاربردهای بزرگ معمولاً باید از ویژگی‌های پیچیده‌تر یا مدل‌های پیشرفته‌تر استفاده کرد.

نکات پیشرفته و بهترین شیوه‌ها

  • برای متن‌های غیرانگلیسی منابع NLTK محدودتر است؛ در چنین مواردی از spaCy یا مدل‌های اختصاصی زبان استفاده کنید.
  • برای کار با حجم بزرگ داده، NLTK به‌تنهایی کند است؛ تبدیل مراحل پیش‌پردازش به پردازش برداری یا استفاده از کتابخانه‌های موازی‌سازی پیشنهاد می‌شود.
  • لماتیزه‌سازی با POS مناسب کیفیت را افزایش می‌دهد (همان‌طور که نشان داده شد).
  • برای تولید ویژگی بهتر از n-grams، TF-IDF و واژه‌های از پیش‌آموزش‌دیده استفاده کنید.

نتیجه‌گیری

NLTK ابزار آموزشی و پژوهشی قدرتمندی برای پردازش زبان طبیعی در پایتون است. با داشتن مجموعه‌ای از توکنایزرها، ابزارهای ریشه‌یابی و لماتیزه، منابع واژگانی مانند WordNet و امکانات ساده برای طبقه‌بندی، NLTK نقطه شروع عالی برای یادگیری و توسعه نمونه‌های اولیه است. با این حال برای پروژه‌های صنعتی و پردازش در مقیاس بزرگ ممکن است لازم باشد آن را با ابزارهای مدرن‌تر ترکیب کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: