نَغز یا naghz یک کتابخانهٔ سبک برای پردازش زبان طبیعی فارسی است که قابلیتهای مختلفی همچون نرمالسازی، توکنیزه کردن، تبدیل محاوره به رسمی، تحلیل احساس، استخراج نام موجودیتها و خلاصهسازی استخراجی را فراهم میکند. این پروژه بهگونهای طراحی شده که بتوانید از آن هم به صورت کتابخانه پایتونی و هم به صورت ابزار خط فرمان استفاده کنید.
از نسخهٔ کنونی به بعد، بسته پشتیبانی مقدماتی از برچسبگذاری نقش کلمات و تجزیهٔ وابستگی نحوی را نیز از طریق مدلهای از پیش آموزشدیدهٔ Stanza فراهم میکند.
این نسخه غیرتجاری توسط تیم توسعه RakhshAI وابسته به شرکت آریا هامان مهر پارسه ایجاد و توسعه داده شده است.
برای نصب نسخهٔ توسعهای از مخزن، وارد دایرکتوری پروژه شده و دستور زیر را اجرا کنید:
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.
ماژول naghz.normalizer با تبدیل حروف عربی به فارسی، حذف اعراب، یکسانسازی اعداد و علامتها و اصلاح فاصلهگذاری، متنی تمیز و استاندارد تولید میکند.
ماژول naghz.tokenizer متن ورودی را به جملات و کلمات تقسیم میکند. الگوهای URL، ایمیل و هشتگ به طور حداقلی شناسایی میشوند و جداگانه بهعنوان توکن برگردانده میشوند.
از طریق ماژولهای جدید میتوانید برچسبهای UPOS را برای هر توکن استخراج کنید.
تحلیلگر وابستگی خروجی استاندارد CoNLL-U را برمیگرداند و برای ابزارهای UD مناسب است.
from naghz.models.registry import resolve_pos, resolve_dep
from naghz.parsing.ud import to_conllu
# ۱) گرفتن برچسبزن نقشنما (POS) مبتنی بر Stanza از رجیستری Naghz
tagger = resolve_pos("stanza")
# ورودی باید از قبل توکنشده باشد (هر توکن یک رشته)
tokens = ["سلام", "دنیا"]
# ۲) برگرداندن برچسبهای UPOS برای هر توکن
print(tagger.tag(tokens))
# خروجی نمونه: ['INTJ', 'NOUN']
# ۳) گرفتن تحلیلگر وابستگی مبتنی بر Stanza
parser = resolve_dep("stanza")
tokens = ["من", "رفتم"]
# ۴) پارس وابستگی و تبدیل نتیجه به قالب استاندارد CoNLL-U برای سازگاری با ابزارهای UD
conllu = to_conllu(parser.parse(tokens))
print(conllu)
# خروجی نمونهٔ CoNLL-U (هر ستون توضیحش پایین آمده):
# 1\tمن\t_\tPRON\t_\t_\t2\tnsubj\t_\t_
# 2\tرفتم\t_\tVERB\t_\t_\t0\troot\t_\t_برای سنجش دقت برچسبگذاری نقش کلمات و تجزیهٔ وابستگی نحوی با Stanza میتوانید اسکریپت
examples/stanza_accuracy.py را اجرا کنید. این اسکریپت ۵۰ جملهٔ نخست مجموعهٔ آزمون
UD Persian-Seraji را پردازش کرده و دقت را گزارش میکند:
python examples/stanza_accuracy.py
# POS accuracy: 96.0%
# UAS: 86.0%
# LAS: 83.0%اعداد فوق نمونهای از خروجی اجرای اسکریپت هستند و ممکن است بسته به نسخهٔ مدل متفاوت باشند.
ماژول naghz.colloquial دارای واژهنامهای قابل توسعه از صورتهای محاورهای و معادل رسمی آنها است. با فراخوانی متد convert میتوانید عباراتی مانند «میخوام» را به «میخواهم» تبدیل کنید.
ماژول naghz.sentiment با رویکرد واژهنامهای و در نظر گرفتن واژههای نفی و شدتدهنده، برچسب مثبت، منفی یا خنثی را به متن اختصاص میدهد. واژهنامهٔ احساس در فایل data/sentiment_lexicon.json تعریف شده و بهسادگی قابل گسترش است.
ماژول naghz.stemmer توابع stem_word و lemma_word را برای سادهسازی شکلهای صرفی کلمات فراهم میکند. با استفاده از این توابع میتوانید صورتهای مختلف یک واژه را به ریشه یا مصدر مشترک برگردانید تا تحلیلهای بعدی دقیقتر شوند.
from naghz.stemmer import stem_word, lemma_word
stem_word("کتابها") # "کتاب"
lemma_word("میرویم") # "رفت"در نسخهٔ اخیر، پشتیبانی از شکلهای صرفی (لِماتیزه کردن و ریشهیابی) در ماژول تحلیل احساس افزوده شده است. در این حالت اگر واژهای در واژهنامه یافت نشود، ابتدا با استفاده از سادهسازی افعال (lemma_word) به شکل مصدر و سپس با ریشهیابی (stem_word) بررسی میشود. این امر باعث پوشش بهتر صورتهای مختلف یک کلمه (مثلاً «خوبی» در کنار «خوب» یا «بهترین» در کنار «بهتر») میشود. همچنین الگوی توکنسازی بهروز شده است تا نویسهٔ جداکنندهٔ نیمفاصله (ZWNJ) را بهعنوان بخشی از واژه تشخیص دهد؛ بنابراین کلماتی مانند «میخواهم» به صورت یک توکن واحد پردازش میشوند و pip line تحلیل احساس و تبدیل محاوره نتایج دقیقتری خواهند داشت.
علاوه بر این، واژهنامهٔ احساس گسترش یافته و صورتهای رایجتری از صفات و افعال مثبت و منفی به آن افزوده شده است (برای مثال «عالیه»، «بهترین»، «بدترین»، «دوستداشتنی»، «نفرتانگیز» و …). فهرست اسامی، سازمانها و مکانها نیز بهراحتی قابل توسعه است و در نسخهٔ فعلی، موجودیتهای تکراری در خروجی NER حذف میشود تا از بازگشت چندبارهٔ یک نام جلوگیری شود.
ماژول naghz.ner با استفاده از فهرستهای از پیش آمادهٔ نام اشخاص، سازمانها و مکانها، و قواعد ساده، موجودیتها را از متن استخراج میکند. در صورت نصب بودن کتابخانههای خارجی مانند stanza میتوانید بخش مدلهای پیشرفته را فعال کنید.
ماژول naghz.summarizer با پیادهسازی الگوریتم سادهٔ TextRank متون طولانی را به چند جملهٔ کلیدی خلاصه میکند. تعداد جملات خروجی از طریق پارامتر sentences قابل تنظیم است.
پروژه به صورت آزاد و تحت لایسنس MIT منتشر شده و از مشارکت شما استقبال میکند. لطفاً پیش از ارسال Pull Request به فایلهای data/* نگاهی بیندازید و در صورت نیاز لغتهای جدیدی بیفزایید. همچنین تستهای واحد را میتوانید در شاخهٔ tests/ پیدا کرده و توسعه دهید.
برای مشاهدهٔ نحوهٔ استفاده از هر ماژول میتوانید به پوشهٔ examples/ مراجعه کنید. در آنجا اسکریپتهای کوتاهی برای نرمالسازی، توکنیزه کردن، تبدیل محاوره به رسمی، تحلیل احساس، استخراج موجودیت و خلاصهسازی قرار دادهایم که میتوانید با اجرای آنها بهسرعت عملکرد ابزار را مشاهده کنید. برای اجرای همهٔ تستها کافی است در ریشهٔ مخزن دستور زیر را اجرا کنید:
python -m unittest discover testsاگر قصد دارید واژهنامهها، فهرست اسامی یا کلمات سازمانها/مکانها را توسعه دهید، کافی است فایلهای JSON و متنی موجود در پوشههای data/ و src/naghz/data/ را ویرایش کنید. ساختار دادهها بهگونهای طراحی شده تا هر کاربری بتواند این فهرستها را به دلخواه خود تکمیل کند. پس از اعمال تغییرات، اجرای تستها به شما اطمینان میدهد که عملکرد فعلی ابزار حفظ شده است.
| نوع تست | جزئیات | نتیجه |
|---|---|---|
| تستهای واحد | pytest |
22 passed, 2 skipped |
| دقت تحلیل احساس | 4/4 نمونهٔ آزمایشی | 100% |
| دقت تشخیص موجودیت | 3/4 موجودیت نمونه | 75% |