کتابخانه spacy در پایتون
spaCy یکی از قدرتمندترین و پرطرفدارترین کتابخانههای پردازش زبان طبیعی (NLP) برای پایتون است. هدف اصلی آن ارائه ابزارهایی سریع، قابل اتکا و آمادهبرای-تولید (production-ready) برای تحلیل متن، استخراج اطلاعات و ساخت مدلهای NLP است. در این مقاله به جنبههای کلیدی spaCy، نحوه استفاده، مثالهای عملی و نکات مربوط به زبان فارسی میپردازیم.
ویژگیهای کلیدی spaCy
- سرعت و کارآیی: طراحی شده برای پردازش دستهای و استفاده در محیطهای عملیاتی.
- لولهکاری (Pipeline): اجزای از پیشساخته مثل توکنایزر، POS tagger، NER و dependency parser.
- ادغام با مدلهای ترنسفورمر: پشتیبانی از spacy-transformers برای استفاده از BERT و مدلهای مشابه.
- قابلیت سفارشیسازی: افزودن یا جایگزینی کامپوننتهای pipeline و ساخت مدلهای اختصاصی.
- API ساده و مستندات کامل: مناسب برای توسعهدهندگان و پژوهشگران.
نصب و آمادهسازی
pip install spacy
python -m spacy download en_core_web_smکد بالا نصب پایه spaCy و مدل کوچک انگلیسی را نشان میدهد. برای استفاده از مدلهای دیگر یا مدلهای ترنسفورمر، بستههای مرتبط مانند spacy-transformers لازم است. در مورد زبان فارسی، مدلهای رسمی spaCy برای فارسی در دسترس محدود هستند؛ معمولاً از مدلهای چندزبانه مثل xx_ent_wiki_sm یا مدلهای اختصاصی جامعهٔ متنباز استفاده میشود.
مثال پایه: پردازش متن و استخراج اطلاعات
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple is looking at buying U.K. startup for $1 billion.")
for token in doc:
print(token.text, token.pos_, token.dep_)
for ent in doc.ents:
print(ent.text, ent.label_)این کد مدل انگلیسی را بارگذاری و جملهای را پردازش میکند. سپس توکنها همراه با برچسب قسمت گفتار (POS) و وابستگی نحوی چاپ میشوند و نهایتاً موجودیتهای نامدار (NER) تشخیص داده شده نمایش داده میشوند. برای متون فارسی باید به نکات بعدی توجه کنید.
تطبیق spaCy با زبان فارسی
spaCy به صورت پیشفرض برای فارسی امکانات جامع ندارد؛ اما راهکارهای عملی عبارتند از:
- استفاده از مدل چندزبانه (
xx_ent_wiki_sm) برای NER پایه. - یکپارچهسازی توکنایزر و لِماتایزر فارسی از کتابخانههایی مانند Hazm یا Stanza با pipeline اسپَسی.
- آموزش مدل سفارشی با دادههای تگخوردهٔ فارسی یا انتقال یادگیری از مدلهای چندزبانه/ترنسفورمر.
نمونه: ادغام Hazm برای پیشپردازش فارسی
# Example integration: using Hazm for tokenization, then spaCy for pipeline
from hazm import Normalizer, word_tokenize
import spacy
normalizer = Normalizer()
nlp = spacy.blank("fa") # create an empty spaCy pipeline for Persian
def hazm_tokenizer(text):
norm = normalizer.normalize(text)
return [tok for tok in word_tokenize(norm)]
# A simple custom component to add tokens from Hazm
def hazm_component(doc):
tokens = hazm_tokenizer(doc.text)
# Attach tokens as new attribute or rebuild Doc if needed
doc.user_data["hazm_tokens"] = tokens
return doc
nlp.add_pipe(hazm_component, name="hazm_tokenizer", first=True)
doc = nlp("این یک تست برای پردازش زبان فارسی است.")
print(doc.user_data["hazm_tokens"])در این نمونه، از Hazm برای نرمالسازی و توکنایز کردن متن فارسی استفاده شده و سپس یک کامپوننت ساده به pipeline spaCy اضافه شده تا توکنها در متادیتای سند نگهداری شوند. این رویکرد برای حفظ قابلیتهای فارسیساز مانند تصحیح فاصلهها و نرمالسازی حروف مفید است. برای پردازش عمیقتر لازم است توکنها در قالب spaCy Doc بازسازی شوند یا از مدلهای فارسی آموزشدادهشده استفاده کنید.
آموزش مدلهای سفارشی و انتقال یادگیری
spaCy قابلیت آموزش مدلهای جدید برای وظایفی مثل NER یا POS را دارد و از نیروی GPU هم پشتیبانی میکند. برای فارسی معمولاً بایدِ:
- دادهٔ برچسبخوردهٔ با کیفیت تهیه کنید (مثلاً برچسبهای NER یا جفتهای وابستگی).
- ساختار pipeline را مشخص و کامپوننتهای دلخواه را اضافه کنید.
- اگر دادهٔ محدود است، از مدلهای ترنسفورمر چندزبانه (مانند mBERT یا XLM-R) برای انتقال یادگیری بهره ببرید.
مثال کوتاه آموزش NER (نمادین)
# Pseudocode for training NER (conceptual)
import spacy
from spacy.training import Example
nlp = spacy.blank("en") # or use a transformer model
ner = nlp.add_pipe("ner")
ner.add_label("MY_LABEL")
# training loop (very simplified)
for epoch in range(10):
for text, annotations in TRAIN_DATA:
doc = nlp.make_doc(text)
example = Example.from_dict(doc, annotations)
nlp.update([example], sgd=optimizer)این کد چارچوب کلی آموزش NER را نشان میدهد. برای فارسی باید متنها و برچسبها به زبان فارسی باشند و بهتر است از یک مدل پایهٔ ترنسفورمر برای کمک به دقت استفاده شود.
نکات عملی و بهینهسازی
- پردازش دستهای (batch): هنگام پردازش حجم زیاد متن از nlp.pipe استفاده کنید تا حافظه و سرعت بهینه باشد.
- استفاده از GPU: برای آموزش یا inference مدلهای بزرگتر (مثل ترنسفورمرها) حتماً از GPU بهره ببرید.
- پیشپردازش فارسی: نرمالسازی فاصلهها، تبدیل اعداد، حذف یا نگهداری علائم نگارشی بسته به کاربرد مهم است.
- ارزیابی و خطاکاوی: برای هر مدل معیارهایی مثل F1، precision و recall را محاسبه و خطاها را آنالیز کنید.
یک جدول مقایسه کوتاه
| ویژگی | spaCy | دیگر ابزارها (مثلاً NLTK, Stanza) |
|---|---|---|
| مناسب برای تولید | بله (سرعت بالا) | متغیر (بعضی برای تحقیق بهتر) |
| پشتیبانی از فارسی | محدود، نیاز به ادغام یا مدلهای جامعه | Stanza نسبتاً بهتر برای چند زبان، Hazm مخصوص فارسی |
| ادغام با ترنسفورمرها | قوی (spacy-transformers) | نیاز به تنظیمات جداگانه |
موارد کاربرد واقعی
- استخراج موجودیتهای نامدار از اخبار و اسناد برای سامانههای جستجو و تحلیل رسانه
- آنالیز نظرات کاربران و دستهبندی احساس (sentiment) با ترکیب spaCy و مدلهای ترنسفورمر
- ساخت چتبات و پردازش پرسش-پاسخ با pipeline سفارشی
- استخراج روابط و اطلاعات ساختاری از قراردادها و متون قانونی
جمعبندی و توصیههای عملی
spaCy یک گزینه بسیار مناسب برای توسعهٔ سامانههای NLP در پایتون است؛ اما برای زبان فارسی باید توجه ویژهای به پیشپردازش و تأمین مدلهای مناسب داشته باشید. ترکیب spaCy با ابزارهای مخصوص فارسی (مثل Hazm) و یا استفاده از مدلهای ترنسفورمر چندزبانه، بهترین راهکار برای دستیابی به نتایج مطلوب است. در پروژههای جدی، روی آمادهسازی دادهٔ فارسی با کیفیت، آزمایش مدلهای مختلف و تحلیل خطا سرمایهگذاری کنید.
در صورت نیاز میتوان نمونهکدهای پیشرفتهتر (مثلاً بازسازی Doc با توکنهای Hazm، آموزش کامل NER با spacy-transformers یا نمونههای تبدیل فرمت دادهها) را تهیه و توضیح داد.
آیا این مطلب برای شما مفید بود ؟




