پردازش زبان فارسی یکی از حوزههای حیاتی در توسعه فناوری اطلاعات بومی است که طی سالهای اخیر توجه بیشتری را به خود جلب کرده است. زبان فارسی بهعنوان زبانی با منابع محدود در حوزهٔ پردازش زبان طبیعی (Natural Language Processing – NLP) شناخته میشود و نسبت به برخی زبانهای رایج کمتر ابزارهای تخصصی برای آن توسعه یافته است .
«نَغز» یک کتابخانهٔ سبک برای پردازش زبان فارسی است که توسط تیم توسعهٔ دهندگان رخشای طراحی شده و با هدف سادهسازی و تسریع پردازش متون فارسی عرضه میگردد. در ادامه به معرفی ویژگیها، روش استفاده و کاربردهای این ابزار میپردازیم.
کتابخانهٔ «نَغز» با تمرکز بر ارائهٔ امکانات پایهای و کاربردی پردازش متن و برای زبان فارسی، طراحی شده است. مهمترین ویژگیها و قابلیتهای این ابزار عبارتاند از:
- سبک و کمحجم: «نَغز» به صورت بهینه و کموابستگی پیادهسازی شده است؛ بدون اتکا بر مدلهای یادگیری عمیق حجیم، که این امر اجرای سریع و حتی آفلاین را امکانپذیر میکند . این ویژگی به توسعهدهندگان اجازه میدهد تا در محیطهای کممنابع یا برنامههای کاربردی وب، پردازش زبان فارسی را با سرعت و سهولت انجام دهند.
- نرمالسازی متن: این کتابخانهٔ امکانات نرمالسازی متن فارسی را فراهم میکند؛ از جمله یکسانسازی حروف (مانند تبدیل ی عربی به ی فارسی)، حذف یا اصلاح علائم نگارشی اضافه و رعایت نیمفاصلهها و فاصلههای استاندارد. نرمالسازی متن باعث میشود کلمات با اشکال نوشتاری مختلف به فرم یکدست تبدیل شوند و پردازشهای بعدی با دقت بیشتری انجام شوند.
- توکنسازی (واژهبندی و جملهبندی): «نَغز» قادر است متون ورودی را به واحدهای کوچکتر زبانی تفکیک کند. این شامل تقسیم متن به جملات و شکستن هر جمله به توکنهای کلمهای است. توکنسازی صحیح، گام نخست بسیاری از پردازشهای متنی است و این ابزار با در نظر گرفتن ویژگیهای زبان فارسی (مانند تشخیص صحیح مرز کلمات در حضور پسوندها و پیشوندها) عمل توکنسازی را انجام میدهد.
- حذف توقفواژهها: یکی دیگر از امکانات کلیدی این کتابخانهٔ، شناسایی و حذف توقفواژهها (Stop Words) در متن است. توقفواژهها کلماتی مانند حروف اضافه، ضمایر یا کلمات پرکاربردی هستند که بار معنایی کمی داشته و حذف آنها به بهبود دقت پردازشهای بعدی (مثلاً در جستجوی اطلاعات یا طبقهبندی متن) کمک میکند. کتابخانهٔ «نَغز» دارای یک فهرست پیشفرض از پرتکرارترین توقفواژههای فارسی است و امکان پاکسازی متن از این کلمات را بهسادگی فراهم میکند.
- ریشهیابی کلمات: برای کاهش انواع مختلف یک کلمه به بنیان مشترک، «نَغز» عملیات ریشهیابی (Stemming) را ارائه میدهد. این قابلیت پسوندهای جمع یا صرفی را از کلمات حذف کرده و صورت پایهٔ واژه را استخراج میکند. به عنوان مثال، کلمهٔ «کتابها» پس از ریشهیابی به «کتاب» تبدیل میشود. ریشهیابی کلمات میتواند در یکسانسازی واژههای همریشه (مثل دوست، دوستی، دوستها) و نیز کاهش پیچیدگی مدلهای آماری مفید باشد.
- تبدیل محاوره به رسمی: ماژول
naghz.colloquial
دارای واژهنامهای قابل توسعه از صورتهای محاورهای و معادل رسمی آنها است. با فراخوانی متدconvert
میتوانید عباراتی مانند «میخوام» را به «میخواهم» تبدیل کنید. - تحلیل احساس: ماژول
naghz.sentiment
با رویکرد واژهنامهای و در نظر گرفتن واژههای نفی و شدتدهنده، برچسب مثبت، منفی یا خنثی را به متن اختصاص میدهد. واژهنامهٔ احساس در فایلdata/sentiment_lexicon.json
تعریف شده و بهسادگی قابل گسترش است. - برچسبگذاری نقش کلمات (POS): از طریق ماژولهای جدید میتوانید برچسبهای UPOS را برای هر توکن استخراج کنید.
- تجزیهٔ وابستگی نحوی: تحلیلگر وابستگی خروجی استاندارد CoNLL-U را برمیگرداند و برای ابزارهای UD مناسب است.
- تحلیل احساس: ماژول
naghz.sentiment
با رویکرد واژهنامهای و در نظر گرفتن واژههای نفی و شدتدهنده، برچسب مثبت، منفی یا خنثی را به متن اختصاص میدهد. واژهنامهٔ احساس در فایلdata/sentiment_lexicon.json
تعریف شده و بهسادگی قابل گسترش است. - ریشهیابی کلمات: ماژول
naghz.stemmer
توابعstem_word
وlemma_word
را برای سادهسازی شکلهای صرفی کلمات فراهم میکند. با استفاده از این توابع میتوانید صورتهای مختلف یک واژه را به ریشه یا مصدر مشترک برگردانید تا تحلیلهای بعدی دقیقتر شوند. - استخراج موجودیتهای نامدار (NER): ماژول
naghz.ner
با استفاده از فهرستهای از پیش آمادهٔ نام اشخاص، سازمانها و مکانها، و قواعد ساده، موجودیتها را از متن استخراج میکند. در صورت نصب بودن کتابخانههای خارجی مانندstanza
میتوانید بخش مدلهای پیشرفته را فعال کنید. - خلاصهسازی متون طولانی : ماژول
naghz.summarizer
با پیادهسازی الگوریتم سادهٔ TextRank متون طولانی را به چند جملهٔ کلیدی خلاصه میکند. تعداد جملات خروجی از طریق پارامترsentences
قابل تنظیم است.
علاوه بر موارد فوق، رابط برنامهنویسی این کتابخانهٔ ساده و قابل فهم طراحی شده است؛ بهگونهای که توسعهدهندگان بتوانند با کمترین دانش قبلی از پردازش زبان، از امکانات آن استفاده کرده و در صورت نیاز، آنرا در پروژههای خود ادغام کنند.
بهبود دقت و کیفیت مدلها
در نسخهٔ اخیر، پشتیبانی از شکلهای صرفی (لِماتیزه کردن و ریشهیابی) در ماژول تحلیل احساس افزوده شده است. در این حالت اگر واژهای در واژهنامه یافت نشود، ابتدا با استفاده از سادهسازی افعال (lemma_word
) به شکل مصدر و سپس با ریشهیابی (stem_word
) بررسی میشود. این امر باعث پوشش بهتر صورتهای مختلف یک کلمه (مثلاً «خوبی» در کنار «خوب» یا «بهترین» در کنار «بهتر») میشود. همچنین الگوی توکنسازی بهروز شده است تا نویسهٔ جداکنندهٔ نیمفاصله (ZWNJ) را بهعنوان بخشی از واژه تشخیص دهد؛ بنابراین کلماتی مانند «میخواهم» به صورت یک توکن واحد پردازش میشوند و pip line تحلیل احساس و تبدیل محاوره نتایج دقیقتری خواهند داشت.
علاوه بر این، واژهنامهٔ احساس گسترش یافته و صورتهای رایجتری از صفات و افعال مثبت و منفی به آن افزوده شده است (برای مثال «عالیه»، «بهترین»، «بدترین»، «دوستداشتنی»، «نفرتانگیز» و …). فهرست اسامی، سازمانها و مکانها نیز بهراحتی قابل توسعه است و در نسخهٔ فعلی، موجودیتهای تکراری در خروجی NER حذف میشود تا از بازگشت چندبارهٔ یک نام جلوگیری شود.
نصب کتابخانهٔ پردازش زبان طبیعی فارسی نَغز – Naghz
برای نصب نسخهٔ توسعهای از مخزن، وارد دایرکتوری پروژه شده و دستور زیر را اجرا کنید:
pip install .
این فرمان وابستگیهای لازم را نیز نصب میکند. برای استفاده از مدلهای اختیاری میتوانید یکی از extras را نصب کنید:
pip install .[stanza]
# یا نصب مدلهای دیگر
pip install .[pos-crf]
pip install .[pos-nn]
برای استفاده از دستورات CLI کافی است پس از نصب، دستور naghz
را در خط فرمان فراخوانی کنید.
استفادهٔ سریع
در مثال زیر از کلاسهای کتابخانه برای اجرای یک pip line ساده شامل نرمالسازی و توکنیزه کردن استفاده شده است:
from naghz.pipeline import Pipeline
from naghz.normalizer import Normalizer
from naghz.tokenizer import Tokenizer
pipeline = Pipeline(steps=[Normalizer()])
pipeline.add_step(Tokenizer().tokenize_words)
result = pipeline.run("سلام! میخوام برم خونه.")
print(result)
# ['سلام', '!', 'میخواهم', 'برم', 'خانه', '.']
مثالهای بیشتری را میتوانید در پوشهٔ examples/
بیابید. همچنین مستندات کاملتر در آینده در قالب صفحات GitHub Pages در دسترس خواهد بود.
استفاده از خط فرمان
پس از نصب میتوانید با فراخوانی دستور naghz
از قابلیتهای مختلف بسته در خط فرمان بهره ببرید. برخی زیرفرمانهای رایج عبارتاند از:
naghz normalize "متنی برای نرمالسازی"
naghz tokenize --input input.txt
naghz colloquial "میخوام برم خونه"
naghz sentiment "امروز خیلی خوشحالم"
naghz ner "علی در تهران کار میکند"
naghz summarise -k 2 --input article.txt
naghz pos "متنی برای برچسبگذاری"
naghz parse "متنی برای تجزیه نحوی"
برای مشاهدهٔ گزینهها و راهنمای هر زیرفرمان از --help
استفاده کنید؛ برای مثال naghz sentiment --help
.
ارزیابی دقت Stanza
برای سنجش دقت برچسبگذاری نقش کلمات و تجزیهٔ وابستگی نحوی با Stanza میتوانید اسکریپت examples/stanza_accuracy.py
را اجرا کنید. این اسکریپت ۵۰ جملهٔ نخست مجموعهٔ آزمون UD Persian-Seraji را پردازش کرده و دقت را گزارش میکند:
python examples/stanza_accuracy.py
# POS accuracy: 96.0%
# UAS: 86.0%
# LAS: 83.0%
اعداد فوق نمونهای از خروجی اجرای اسکریپت هستند و ممکن است بسته به نسخهٔ مدل متفاوت باشند.
نتایج تست و دقت
نوع تست | جزئیات | نتیجه |
---|---|---|
تستهای واحد | pytest | 22 passed, 2 skipped |
دقت تحلیل احساس | 4/4 نمونهٔ آزمایشی | 100% |
دقت تشخیص موجودیت | 3/4 موجودیت نمونه | 75% |
برای دریافت و استفاده از کتابخانهٔ پردازش زبان طبیعی فارسی نَغز – Naghz به سایت جامعه متن باز – بازپردازش مراجعه کنید :