6.3 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 که ParsBERT را ریزتنظیم میکند در همهجا جلو است مگر در واژهیابی و مرزبندی جمله، که
lg با واژهیاب درختویرایش روی زیرواژههای floret همچنان بهتر عمل میکند. تنها ردهٔای است که از
مرجع 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 به ۸٬۳۲۰ میرسد و روی پردازندهٔ همان ماشین ۳۳۶، یعنی شتاب ۲۵
برابری. پس کارت گرافیک برای این رده یک نیاز است نه یک بهینهسازی. کارت 940MX اصلاً trf را
اجرا نمیکند، چون نسخههای امروزی PyTorch پشتیبانی از معماری sm_50 را کنار گذاشتهاند.
فاصلهٔ sm و md و lg روی پردازنده کمتر از ۱۵ درصد است، یعنی کمتر از آنچه تفاوت اندازهٔ
جدول بردارها نشان میدهد: گلوگاه tok2vec نیست، تجزیهگر و واژهیاب است. پراکندگی اجراها روی
لپتاپ بسته به دمای دستگاه حدود ۱۰± درصد است، پس تفاوتهای کمتر از آن نویز شمرده میشوند.
گامهای تبدیل پیکره، آموزش، ارزیابی و بستهبندی در project.yml تعریف شدهاند.
توضیح بیشتر دربارهٔ گزینش پیکره و پروانهها در docs/MODELS.md و شرح انگلیسی
پروژه در README.md آمده است.