# پردازش زبان طبیعی فارسی برای spaCy کتابخانه‌ی spaCy هیچ‌گاه مدل آموزش‌دیده‌ای برای فارسی منتشر نکرده است و `spacy.blank("fa")` تنها یک توکن‌ساز و فهرست واژه‌های اضافه در اختیار می‌گذارد. این مخزن دو pipeline آموزش‌دیدهٔ فارسی را فراهم می‌کند که بر پایهٔ پیکرهٔ [UD_Persian-PerDT](https://github.com/UniversalDependencies/UD_Persian-PerDT) ساخته شده‌اند و مانند دیگر مدل‌های spaCy با pip نصب می‌شوند. ## بسته‌ها مدل `fa_dep_news_sm` دربردارندهٔ **tok2vec**، **برچسب‌گذار اجزای کلام**، **ریخت‌شناس**، **بن‌واژه‌یاب آموزش‌پذیر** و **تجزیه‌گر وابستگی** است. `fa_core_news_sm` همان اجزا به‌همراه **بازشناسی موجودیت‌های نام‌دار** را دارد. هر دو تحت لیسانس CC BY-SA ۴٫۰ منتشر شده‌اند. ```bash pip install https://huggingface.co/Phazel/fa_core_news_sm/resolve/main/fa_core_news_sm-3.8.0-py3-none-any.whl ``` ```python 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 --gpu-id `؛ دادهٔ خام در `metrics/throughput-*.json` است. | رده | پردازنده i5-7200U | کارت 940MX | کارت Tesla T4 | | --- | ---: | ---: | ---: | | `sm` | ۵٬۴۸۴ | ۱۰٬۲۳۵ | | | `md` | ۵٬۴۰۸ | ۹٬۰۵۸ | | | `lg` | ۴٬۷۱۵ | ۹٬۲۱۵ | | | `trf` | ۱۸۷ | | ۸٬۳۲۰ | ردهٔ `trf` روی یک پردازنده حدود ۲۹ برابر کندتر از `sm` است، و روی T4 نسبت به پردازندهٔ همان ماشین (۳۳۶ واژه بر ثانیه) ۲۵ برابر سریع‌تر، پس کارت گرافیک برای آن یک نیاز است نه بهینه‌سازی. فاصلهٔ رده‌های پردازنده‌ای کمتر از ۱۵ درصد است، یعنی گلوگاه جست‌وجوی tok2vec نیست بلکه تجزیه‌گر و واژه‌یاب است. پراکندگی اجراها روی لپ‌تاپ بسته به دمای دستگاه حدود ۱۰± درصد است. گام‌های تبدیل پیکره، آموزش، ارزیابی و بسته‌بندی در [`project.yml`](project.yml) تعریف شده‌اند. توضیح بیشتر دربارهٔ گزینش پیکره و پروانه‌ها در [`docs/MODELS.md`](docs/MODELS.md) و شرح انگلیسی پروژه در [`README.md`](README.md) آمده است.