FA-TOOLS — Header Component

آموزش NLP پایه با پایتون — NLTK و spaCy

رفیق برنامه‌نویس، آماده‌ای تا شیرجه بزنیم تو دنیای شگفت‌انگیز پردازش زبان طبیعی یا همون NLP؟ اگه میخوای ماشین‌ها رو به درک زبان خودمون نزدیک کنی، جای درستی اومدی. تو این مقاله، قراره قدم به قدم با پایتون و دو تا از خفن‌ترین کتابخونه‌هاش، یعنی NLTK و spaCy، پایه‌های NLP رو از صفر تا صد یاد بگیریم. از توکن‌سازی و ریشه‌یابی کلمات بگیر تا تشخیص موجودیت‌های نام‌گذاری شده، همه رو با مثال‌های عملی و کد نویسی بررسی می‌کنیم. پس اگه دنبال ابزارهای قدرتمند برای کار با متن‌ها هستی و میخوای پروژه‌های جذاب NLP بسازی، تا آخر این مطلب با من باش. راستی، اگه برای پروژه‌های NLP یا هر حوزه دیگه‌ای دنبال ابزارهای خفن و کدهای آماده می‌گردی، یه سر به فروشگاه ابزارهای FA Tools بزن و گنجینه‌ای از اسنیپت‌های کارآمد رو پیدا کن. ضرر نمی‌کنی!

نقشه راه NLP پایه با پایتون — NLTK & spaCy در یک نگاه

آموزش NLP پایه با پایتون — NLTK و spaCy — تصویر 1

💡 مفهوم NLP

تعریف، کاربردها و اهمیت پردازش زبان طبیعی

🛠️ آماده‌سازی

نصب پایتون، pip و کتابخانه‌های NLTK و spaCy

✂️ NLTK: توکن‌سازی

تقسیم متن به کلمات و جملات (Word/Sentence Tokenization)

🌱 NLTK: ریشه‌یابی

Stemming و Lemmatization برای نرمال‌سازی کلمات

🏷️ spaCy: تجزیه و تحلیل

Part-of-Speech Tagging, Named Entity Recognition

⚖️ مقایسه NLTK و spaCy

انتخاب ابزار مناسب برای پروژه‌های مختلف

پردازش زبان طبیعی (NLP) چیه و چرا مهمه؟

آموزش NLP پایه با پایتون — NLTK و spaCy — تصویر 2

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

اهمیت NLP رو میشه تو زندگی روزمره ما کاملا دید. از دستیارهای صوتی مثل سیری و گوگل اسیستنت گرفته تا مترجم‌های آنلاین و فیلترهای اسپم ایمیل، همه و همه از NLP استفاده می‌کنن. تو حوزه کسب و کار هم تحلیل نظرات مشتریان، خلاصه‌سازی اسناد طولانی، ساخت چت‌بات‌های هوشمند و کلی کاربرد دیگه با NLP ممکن میشه. پس یادگیری این حوزه نه تنها جذابه، بلکه تو بازار کار هم حسابی به دردت می‌خوره.

چرا پایتون، بهترین انتخاب برای NLP؟

حالا چرا پایتون؟ پایتون به خاطر سادگی، خوانایی بالا و اکوسیستم غنی از کتابخانه‌ها، تبدیل به زبان شماره یک برای هوش مصنوعی و به خصوص NLP شده. کتابخانه‌هایی مثل NLTK، spaCy، Gensim و Hugging Face Transformers، کار با متن رو تو پایتون به یه تجربه لذت‌بخش تبدیل کردن. همین سادگی و قدرت، باعث میشه برنامه‌نویس‌ها بتونن به جای درگیر شدن با جزئیات پایین‌سطح، روی حل مشکل اصلی تمرکز کنن.

شروع کار: نصب و آماده‌سازی محیط

آموزش NLP پایه با پایتون — NLTK و spaCy — تصویر 3

قبل از هر چیزی، باید مطمئن بشیم که محیط پایتون روی سیستممون درسته. اگه پایتون رو نصب نداری، از سایت رسمیش دانلود و نصب کن. بعدش با `pip` که مدیر بسته پایتونه، کتابخونه‌های لازم رو نصب می‌کنیم.

نصب NLTK

NLTK (Natural Language Toolkit) یکی از قدیمی‌ترین و محبوب‌ترین کتابخانه‌های NLP تو پایتونه. برای نصبش کافیه این دستور رو تو ترمینال یا CMD بزنی:

pip install nltk

بعد از نصب، NLTK نیاز به دانلود دیتاست‌ها و مدل‌های خاصی داره. برای این کار، پایتون رو باز کن و این کدها رو اجرا کن:

import nltk
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('averaged_perceptron_tagger')
nltk.download('maxent_ne_chunker')
nltk.download('words')

(این دستورها پنجره دانلود NLTK رو باز می‌کنن که می‌تونی دیتاست‌های لازم رو انتخاب کنی و دانلودشون کنی.)

نصب spaCy

spaCy یه کتابخونه مدرن‌تر و پرفورمنس‌بالا برای NLP هست که برای محیط‌های production طراحی شده. نصبش هم مثل NLTK راحته:

pip install spacy

بعد از نصب spaCy، باید مدل‌های زبان مورد نظرت رو هم دانلود کنی. برای زبان انگلیسی، مدل `en_core_web_sm` معمولا کافیه:

python -m spacy download en_core_web_sm

(این دستور مدل کوچک زبان انگلیسی رو دانلود و نصب می‌کنه.)

غواصی در NLTK: ابزارهای پایه NLP

NLTK یه جعبه ابزار فوق‌العاده برای یادگیری مفاهیم NLP و انجام کارهای پایه روی متنه. بیایم چند تا از مهم‌ترین قابلیت‌هاش رو بررسی کنیم.

توکن‌سازی (Tokenization)

اولین قدم تو هر پروژه NLP، معمولا توکن‌سازی هست. توکن‌سازی یعنی تقسیم یه متن به واحدهای کوچکتر و معنی‌دار، مثل کلمات (Word Tokenization) یا جملات (Sentence Tokenization).

توکن‌سازی کلمات

from nltk.tokenize import word_tokenize

text = "سلام رفیق! حالت چطوره؟ ما امروز NLP رو با NLTK یاد میگیریم."
tokens = word_tokenize(text)
print(tokens)
# خروجی: ['سلام', 'رفیق', '!', 'حالت', 'چطوره', '؟', 'ما', 'امروز', 'NLP', 'رو', 'با', 'NLTK', 'یاد', 'میگیریم', '.']

توکن‌سازی جملات

from nltk.tokenize import sent_tokenize

text = "سلام رفیق! حالت چطوره؟ ما امروز NLP رو با NLTK یاد میگیریم."
sentences = sent_tokenize(text)
print(sentences)
# خروجی: ['سلام رفیق!', 'حالت چطوره؟', 'ما امروز NLP رو با NLTK یاد میگیریم.']

ریشه‌یابی و لِماتیزاسیون (Stemming & Lemmatization)

گاهی اوقات لازمه کلمات رو به ریشه یا شکل پایه خودشون برگردونیم تا بتونیم تحلیل بهتری داشته باشیم. مثلا کلمات “running”, “runs”, “ran” همگی به نوعی به ریشه “run” مربوط میشن. استمینگ و لماتیزاسیون دو روش برای این کار هستن.

استمینگ (Stemming)

استمینگ کلمات رو به ریشه لغوی خودشون برمی‌گردونه، اما ممکنه اون ریشه، یه کلمه معنی‌دار نباشه. Porter Stemmer یکی از معروف‌ترین الگوریتم‌هاست.

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
words = ["running", "runs", "runner", "easily", "fairly"]
stemmed_words = [stemmer.stem(word) for word in words]
print(stemmed_words)
# خروجی: ['run', 'run', 'runner', 'easili', 'fairli']

(همونطور که می‌بینی، “easily” و “fairly” به “easili” و “fairli” تبدیل شدن که کلمه درستی نیستن.)

لِماتیزاسیون (Lemmatization)

لماتیزاسیون هوشمندتر عمل می‌کنه و کلمات رو به ریشه صحیح و معنی‌دارشون (lemma) برمی‌گردونه. این فرآیند معمولا به اطلاعات Part-of-Speech (بخش کلام) نیاز داره.

from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet

lemmatizer = WordNetLemmatizer()

def get_wordnet_pos(word):
    """Map NLTK POS tag to WordNet POS tag"""
    tag = nltk.pos_tag([word])[0][1][0].upper()
    tag_dict = {"J": wordnet.ADJ,
                "N": wordnet.NOUN,
                "V": wordnet.VERB,
                "R": wordnet.ADV}
    return tag_dict.get(tag, wordnet.NOUN)

words = ["running", "runs", "runner", "easily", "fairly"]
lemmatized_words = [lemmatizer.lemmatize(word, get_wordnet_pos(word)) for word in words]
print(lemmatized_words)
# خروجی: ['run', 'run', 'runner', 'easily', 'fairly']

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

معرفی spaCy: قدرت و سرعت در NLP

spaCy به عنوان یه کتابخونه NLP مدرن، برای سرعت و کارایی بالا تو پروژه‌های واقعی طراحی شده. برخلاف NLTK که بیشتر یه ابزار آموزشیه، spaCy بیشتر روی کاربردهای عملی تمرکز داره و پردازش‌های NLP رو به صورت خط لوله (pipeline) انجام می‌ده.

پردازش متن با spaCy

تو spaCy، اولین کاری که می‌کنی، بارگذاری یه مدل زبانیه. بعدش متنت رو به اون مدل می‌دی و یه شیء `Doc` می‌گیری که تمام اطلاعات پردازشی (توکن‌ها، بخش‌های کلام، موجودیت‌ها و…) رو تو خودش داره.

import spacy

# بارگذاری مدل زبان انگلیسی
nlp = spacy.load("en_core_web_sm")

text = "Apple is looking at buying U.K. startup for $1 billion."
doc = nlp(text)

# توکن‌سازی (خودکار انجام میشه)
print("Tokens:")
for token in doc:
    print(f"{token.text:<10} {token.lemma_:<10} {token.pos_:<10} {token.is_stop:<10}")

# خروجی (با ستون‌های متن، لمای، بخش کلام، و توقف‌واژه):
# Tokens:
# Apple      Apple      PROPN      False     
# is         be         AUX        True      
# looking    look       VERB       False     
# at         at         ADP        True      
# buying     buy        VERB       False     
# U.K.       U.K.       PROPN      False     
# startup    startup    NOUN       False     
# for        for        ADP        True      
# $          $          SYM        False     
# 1          1          NUM        False     
# billion    billion    NUM        False     
# .          .          PUNCT      False     

(همونطور که می‌بینی، spaCy به صورت خودکار توکن‌سازی، لماتیزاسیون، POS tagging و تشخیص توقف‌واژه رو انجام می‌ده.)

تشخیص موجودیت‌های نام‌گذاری شده (Named Entity Recognition – NER)

NER یکی از قابلیت‌های فوق‌العاده spaCy هست که می‌تونه موجودیت‌های خاص (مثل اسامی اشخاص، سازمان‌ها، مکان‌ها، تاریخ‌ها و …) رو تو متن تشخیص بده. این قابلیت تو تحلیل داده‌های بدون ساختار مثل خبرها یا پست‌های شبکه‌های اجتماعی خیلی کاربردیه.

import spacy
nlp = spacy.load("en_core_web_sm")

text = "Google CEO Sundar Pichai visited London last week to discuss AI with the Prime Minister."
doc = nlp(text)

print("Named Entities:")
for ent in doc.ents:
    print(f"  {ent.text:<20} {ent.label_:<10} {spacy.explain(ent.label_)}")

# خروجی:
# Named Entities:
#   Google               ORG        Companies, agencies, institutions, etc.
#   Sundar Pichai        PERSON     People, including fictional.
#   London               GPE        Countries, cities, states.
#   last week            DATE       Absolute or relative dates or periods.
#   Prime Minister       ORG        Companies, agencies, institutions, etc.

تجزیه وابستگی (Dependency Parsing)

تجزیه وابستگی بهت نشون می‌ده که کلمات تو یه جمله از نظر گرامری چطور به هم مرتبط هستن. این اطلاعات برای استخراج رابطه بین کلمات و درک عمیق‌تر ساختار جمله خیلی مفیده.

import spacy
nlp = spacy.load("en_core_web_sm")

text = "Apple is looking at buying U.K. startup."
doc = nlp(text)

print("Dependency Parsing:")
for token in doc:
    print(f"  {token.text:<10} {token.dep_:<10} {token.head.text:<10} {token.head.pos_:<10} {token.pos_:<10}")

# خروجی:
# Dependency Parsing:
#   Apple      nsubj      looking    VERB       PROPN     
#   is         aux        looking    VERB       AUX       
#   looking    ROOT       looking    VERB       VERB      
#   at         prt        looking    VERB       ADP       
#   buying     advcl      looking    VERB       VERB      
#   U.K.       compound   startup    NOUN       PROPN     
#   startup    dobj       buying     VERB       NOUN      
#   .          punct      looking    VERB       PUNCT     

(برای دیدن کدهای HTML کاربردی می‌تونی از این بخش سایت استفاده کنی.)

NLTK در مقابل spaCy: کدوم رو انتخاب کنم؟

این سوالیه که خیلی از برنامه‌نویس‌ها می‌پرسن. واقعیت اینه که هر دو کتابخونه عالی هستن، اما برای کاربردهای متفاوت. یه مقایسه سریع بهت کمک می‌کنه تا انتخاب بهتری داشته باشی:

ویژگی NLTK spaCy
هدف اصلی آموزش و پژوهش تولید و کارایی بالا
سرعت متوسط بسیار سریع
مدل‌های از پیش آموزش‌دیده نیاز به دانلود جداگانه، کمتر بهینه شده همراه با نصب مدل‌ها، بسیار بهینه و دقیق
سادگی API انعطاف‌پذیر، اما گاهی پیچیده ساده و یکپارچه
پشتیبانی زبان‌ها گسترده، اما با کیفیت‌های متفاوت چندین زبان اصلی با کیفیت بالا (مانند انگلیسی، آلمانی، اسپانیایی)
ابزارهای جانبی شامل مجموعه وسیعی از الگوریتم‌ها بیشتر بر خط لوله و اجزای پیشرفته تمرکز دارد

خلاصه کلام اینکه، اگه تازه داری وارد دنیای NLP میشی و می‌خوای مفاهیم رو عمیق یاد بگیری و با الگوریتم‌های مختلف بازی کنی، NLTK انتخاب خوبیه. اما اگه دنبال ساخت یه سیستم واقعی با کارایی بالا و سرعت خوب هستی، spaCy گزینه برتره.

کاربردهای عملی و مثال‌های پیشرفته‌تر

با NLTK و spaCy، می‌تونی پروژه‌های خیلی متنوعی رو انجام بدی. مثلا:

  • **تحلیل احساسات (Sentiment Analysis):** تشخیص اینکه یک متن (مثلا نظر مشتری) دارای احساسات مثبت، منفی یا خنثی هست.
  • **ساخت چت‌بات (Chatbot Development):** فهمیدن منظور کاربر و پاسخ دادن مناسب به اون.
  • **خلاصه‌سازی متن (Text Summarization):** تولید یه خلاصه کوتاه و مفید از یه متن طولانی.
  • **سیستم‌های پرسش و پاسخ (Question Answering Systems):** جواب دادن به سوالات کاربر بر اساس یه دیتابیس متنی.
  • **استخراج اطلاعات (Information Extraction):** پیدا کردن و بیرون کشیدن اطلاعات خاص و ساختاریافته از متن‌های بدون ساختار.

اینا فقط چند تا از کاربردهای پایه NLP بودن. با پیشرفت تو این حوزه و ترکیب با یادگیری ماشین و یادگیری عمیق، مرزهای امکانات به شکل باورنکردنی گسترش پیدا می‌کنن. اگر به دنبال کدهای آماده در حوزه‌های مختلف هستید، سر زدن به بخش اسنیپت‌ها خالی از لطف نیست.

عیب‌یابی سریع (Troubleshooting)

ممکنه تو مسیر یادگیری و کار با NLTK و spaCy به چند تا مشکل رایج بربخوری. نگران نباش، ایناهاش راه‌حل‌هاشون:

مشکل 1: `Resource ‘punkt’ not found.` (در NLTK)

**دلیل:** دیتاست `punkt` که برای توکن‌سازی جملات استفاده میشه، دانلود نشده.

**راه‌حل:** تو پایتون دستور `nltk.download(‘punkt’)` رو اجرا کن. مطمئن شو که اینترنت داری و دانلود کامل میشه.

مشکل 2: `OSError: [E050] Can’t find model ‘en_core_web_sm’.` (در spaCy)

**دلیل:** مدل زبان انگلیسی `en_core_web_sm` برای spaCy نصب نشده یا به درستی لینک نشده.

**راه‌حل:** دستور `python -m spacy download en_core_web_sm` رو تو ترمینال اجرا کن تا مدل دانلود و نصب بشه. اگه قبلا نصب کردی و باز هم مشکل داری، ممکنه نیاز باشه اون رو دوباره لینک کنی با `python -m spacy link en_core_web_sm en`.

مشکل 3: کندی پردازش یا مصرف زیاد رم (در هر دو)

**دلیل:** پردازش متن‌های خیلی بزرگ یا نبود منابع کافی.

**راه‌حل:**

  • **برای NLTK:** مطمئن شو که فقط ماژول‌های لازم رو وارد (import) می‌کنی. برای متون فارسی ممکنه NLTK بهترین عملکرد رو نداشته باشه و نیاز به پیش‌پردازش‌های خاصی داشته باشه.
  • **برای spaCy:** اگه نیازی به همه قابلیت‌های خط لوله نداری، می‌تونی اون‌ها رو غیرفعال کنی تا سرعت بالا بره. مثلا اگه فقط NER میخوای، می‌تونی بقیه اجزا رو غیرفعال کنی:
    nlp = spacy.load("en_core_web_sm", disable=["parser", "tagger"])
  • **هر دو:** برای حجم‌های خیلی زیاد، پردازش رو به تکه‌های کوچکتر تقسیم کن (batch processing) یا از ماشین‌های قوی‌تر استفاده کن.

مشکل 4: خروجی‌های غیرمنتظره در زبان فارسی

**دلیل:** NLTK و spaCy به صورت پیش‌فرض برای زبان انگلیسی بهینه‌سازی شده‌اند و برای فارسی نیاز به مدل‌ها و ابزارهای خاص دارند.

**راه‌حل:**

  • **برای NLTK:** NLTK برای زبان فارسی مدل‌های آماده کمتری دارد. باید از ابزارهایی مانند Hazm استفاده کنی که به طور خاص برای پردازش فارسی طراحی شده. Hazm می‌تواند با NLTK ترکیب شود.
  • **برای spaCy:** spaCy مدل‌های آزمایشی (experimental) برای فارسی دارد، اما بهتر است از مدل‌های جامعه (community models) یا ابزارهای مشابه Hazm استفاده کنی و نتایج را به فرمت spaCy تبدیل کنی.
  • **عمومی:** پیش‌پردازش متن فارسی شامل نرمال‌سازی (یکسان‌سازی حروف ی و ک، نیم‌فاصله و…)، حذف علائم نگارشی و اعداد فارسی بسیار مهم است.

به یاد داشته باش، دنیای NLP وسیعه و ممکنه چالش‌های خاصی برای زبان فارسی وجود داشته باشه که نیاز به رویکردهای خاص خودش داره. اما با همین ابزارهای پایه، می‌تونی شروع خوبی داشته باشی.

حرف آخر: مسیرت تازه شروع شده!

خب، رفیق برنامه‌نویس، تبریک می‌گم! تو با موفقیت پایه‌های NLP رو با پایتون، NLTK و spaCy یاد گرفتی. حالا دیگه می‌تونی متن‌ها رو توکن‌سازی کنی، ریشه‌یابی کنی و موجودیت‌های مهم رو تشخیص بدی. این تازه اول راهه؛ دنیای NLP پر از مباحث هیجان‌انگیز دیگه مثل یادگیری عمیق برای زبان، مدل‌های ترنسفورمر، و شبکه‌های عصبی هست که می‌تونی سراغشون بری و پروژه‌های پیچیده‌تری رو انجام بدی.

یادت نره که بهترین راه برای تسلط، تمرین کردنه. پس دست به کار شو و با دیتاست‌های مختلف (مثلا توی Kaggle) بازی کن و ایده‌های خودت رو پیاده‌سازی کن. اگه تو مسیرت به کدهای آماده، اسنیپت‌های CSS، JS یا هر چیز دیگه‌ای نیاز داشتی، FA Tools همیشه در کنارته. سوالی داشتی یا خواستی نظر بدی، حتما با من در میون بزار. موفق باشی!

برای مشاوره تخصصی و پروژه‌های خاص، با ما تماس بگیر: 09202232789

Table of Contents

آخرین نوشته‌ها