5.6 KiB
پردازش زبان طبیعی فارسی برای spaCy
کتابخانهی spaCy هیچگاه مدل آموزشدیدهای برای فارسی منتشر نکرده است و spacy.blank("fa") تنها یک
توکنساز و فهرست واژههای اضافه در اختیار میگذارد. این مخزن دو pipeline آموزشدیدهٔ فارسی را
فراهم میکند که بر پایهٔ پیکرهٔ UD_Persian-PerDT
ساخته شدهاند و مانند دیگر مدلهای spaCy با pip نصب میشوند.
بستهها
مدل fa_dep_news_sm دربردارندهٔ tok2vec، برچسبگذار اجزای کلام، ریختشناس،
بنواژهیاب آموزشپذیر و تجزیهگر وابستگی است. fa_core_news_sm همان اجزا بههمراه
بازشناسی موجودیتهای نامدار را دارد. هر دو تحت لیسانس CC BY-SA ۴٫۰ منتشر شدهاند.
pip install https://huggingface.co/Phazel/fa_core_news_sm/resolve/main/fa_core_news_sm-3.8.0-py3-none-any.whl
import spacy
nlp = spacy.load("fa_core_news_sm")
doc = nlp("محمدرضا شجریان در مشهد به دنیا آمد.")
print(doc.ents) # (محمدرضا شجریان, مشهد)
کارایی
ارزیابی با spacy benchmark accuracy روی بخش آزمون همان پیکره انجام شده است:
| سنجه | sm |
md |
lg |
trf |
مرجع |
|---|---|---|---|---|---|
TOKEN_ACC / TOKEN_F |
۹۹٫۹۶ / ۹۹٫۱۱ | ۹۹٫۹۶ / ۹۹٫۱۱ | ۹۹٫۹۶ / ۹۹٫۱۱ | ۹۹٫۹۶ / ۹۹٫۱۱ | |
TAG_ACC (XPOS) |
۹۵٫۹۶ | ۹۶٫۲۵ | ۹۶٫۵۵ | ۹۷٫۶۲ | |
POS_ACC (UPOS) |
۹۶٫۲۴ | ۹۶٫۶۴ | ۹۶٫۶۸ | ۹۷٫۶۳ | |
MORPH_ACC |
۹۶٫۲۹ | ۹۶٫۶۴ | ۹۶٫۷۰ | ۹۷٫۸۲ | |
LEMMA_ACC |
۹۷٫۹۱ | ۹۷٫۹۶ | ۹۸٫۰۸ | ۹۷٫۳۱ | |
SENTS_F |
۹۹٫۲۵ | ۹۹٫۲۸ | ۹۹٫۱۸ | ۹۷٫۳۵ | |
DEP_UAS |
۸۹٫۶۹ | ۹۰٫۵۲ | ۹۰٫۹۶ | ۹۳٫۸۷ | hazm+ParsBERT: ۹۲٫۴۶ |
DEP_LAS |
۸۵٫۱۵ | ۸۶٫۳۴ | ۸۶٫۶۰ | ۹۰٫۷۹ | hazm+ParsBERT: ۸۹٫۳۴ |
ENTS_P |
۷۷٫۶۷ | ۷۶٫۵۶ | ۸۱٫۵۱ | ۸۴٫۰۶ | |
ENTS_R |
۶۶٫۸۷ | ۷۲٫۹۵ | ۷۱٫۰۹ | ۸۱٫۷۶ | |
ENTS_F |
۷۱٫۸۷ | ۷۴٫۷۱ | ۷۵٫۹۴ | ۸۲٫۸۹ | |
| سرعت (940MX، دستهٔ ۳۲) | ۱۰٬۲۳۵ | ۹٬۰۵۸ | ۹٬۲۱۵ | بخش توان عملیاتی | |
| حجم بستهٔ نصب | ۱۳٫۵ مگابایت | ۶۸٫۵ مگابایت | ۲۳۵ مگابایت | ۶۰۸ مگابایت |
ردهٔ trf در همهجا جلو است مگر در واژهیابی و مرزبندی جمله، و تنها ردهٔای است که از مرجع
DEP_LAS برابر ۸۹٫۳۴ عبور میکند. به کارت گرافیک نیاز دارد و مدل پایهٔ آن پروانهٔ مشخصی ندارد،
پس قابل بازانتشار نیست (docs/MODELS.md بخش ۸).
برچسبهای موجودیت «نقرهای» هستند: از لایهای در خود پیکره میآیند که با برچسبزن Beheshti-NER
تولید و سپس دستی اصلاح شده است. بنابراین ENTS_F تا اندازهای همخوانی با آن برچسبزن را
میسنجد؛ دیگر سنجههای جدول در برابر دادهٔ طلایی سنجیده شدهاند.
آموزش روی یک پردازندهٔ چهارهستهای i5-7200U و بدون کارت گرافیک انجام شده است: ۱ ساعت و ۲۷ دقیقه برای اجزای نحوی و ۱۷ دقیقه برای NER. این دو اجرا مستقلاند و میتوانند همزمان انجام شوند.
توان عملیاتی
میانهٔ چند اجرای پیاپی nlp.pipe روی ۱۴۶ سند بخش آزمون PerDT (۲۳٬۸۲۵ توکن). تنها زمان خودِ
pipe اندازهگیری شده و اجرای گرمکردن کنار گذاشته میشود. برای بازتولید:
python scripts/benchmark_throughput.py <model> --gpu-id <n>؛ دادهٔ خام در
metrics/throughput-*.json است.
| رده | پردازنده i5-7200U | کارت 940MX | کارت Tesla T4 |
|---|---|---|---|
sm |
۵٬۴۸۴ | ۱۰٬۲۳۵ | |
md |
۵٬۴۰۸ | ۹٬۰۵۸ | |
lg |
۴٬۷۱۵ | ۹٬۲۱۵ | |
trf |
۱۸۷ | ۱٬۱۵۸ | ۸٬۳۲۰ |
ردهٔ trf روی یک پردازنده ۲۹ برابر کندتر از sm است. عددهای T4 و Xeon از یک ماشین Colab
میآیند، یعنی شتاب ۲۵ برابری. روی 940MX دستهٔ ۳۲ در ۲ گیگابایت جا میشود و torch باید نسخهٔ
cu126 باشد، چون هستهٔ sm_50 از نسخههای cu128/cu129 در torch 2.8 حذف شده است. فاصلهٔ
ردههای پردازندهای کمتر از ۱۵ درصد است، پس گلوگاه تجزیهگر و واژهیاب است نه جستوجوی tok2vec.
پراکندگی اجراها روی لپتاپ حدود ۱۰± درصد است.
گامهای تبدیل پیکره، آموزش، ارزیابی و بستهبندی در project.yml تعریف شدهاند.
توضیح بیشتر دربارهٔ گزینش پیکره و پروانهها در docs/MODELS.md و شرح انگلیسی
پروژه در README.md آمده است.