Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

naghz

نَغز یا 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، ایمیل و هشتگ به طور حداقلی شناسایی می‌شوند و جداگانه به‌عنوان توکن برگردانده می‌شوند.

برچسب‌گذاری نقش کلمات (POS)

از طریق ماژول‌های جدید می‌توانید برچسب‌های UPOS را برای هر توکن استخراج کنید.

تجزیهٔ وابستگی نحوی

تحلیل‌گر وابستگی خروجی استاندارد CoNLL-U را برمی‌گرداند و برای ابزارهای UD مناسب است.

نمونهٔ استفاده از Stanza

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

برای سنجش دقت برچسب‌گذاری نقش کلمات و تجزیهٔ وابستگی نحوی با 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 حذف می‌شود تا از بازگشت چندبارهٔ یک نام جلوگیری شود.

استخراج موجودیت‌های نامدار (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%

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages