همهٔ نوشته‌ها

تبدیل خط متن فارسی با کتابخانهٔ شکر

شکر حالا می‌تواند متن فارسی را از خط فارسیِ رایج در ایران به خط سیریلیکِ فارسیِ تاجیکستان برگرداند، و برعکس. برای این کار، مدل ByT5-small گوگل را آموزش داده‌ایم و آن را به کتابخانهٔ پایتونی شکر افزوده‌ایم. خودِ مدل هم در Hugging Face منتشر شده و هر دو جهت تبدیل را پشتیبانی می‌کند.

چرا این تبدیل خط اهمیت دارد؟

گاهی زبانی را خوب می‌دانیم، اما چون به خطی ناآشنا نوشته شده، نمی‌توانیم آن را بخوانیم. حکایت فارسی ایران و فارسی تاجیکستان همین است: دو گونهٔ بسیار نزدیک از یک زبان که یکی به خط فارسی نوشته می‌شود و دیگری به خط سیریلیک. کسی که فقط یکی از این دو خط را بلد باشد، راه چندانی به نوشته‌های آن سو ندارد. همین مسئله انگیزهٔ پژوهش ParsText هم بوده است.

تبدیل خط این فاصله را کم می‌کند: دانشجو به منابع بیشتری دسترسی پیدا می‌کند، خواننده راحت‌تر سراغ ادبیات و خبرهای آن سوی مرز می‌رود و توسعه‌دهنده می‌تواند اسناد هر دو خط را یک‌جا جست‌وجوپذیر کند. برای ما در شکر، این یکی دیگر از راه‌هایی است که فناوری زبان فارسی را برای همهٔ فارسی‌زبانان سودمندتر می‌کند.

البته تبدیل خط فقط شیوهٔ نوشتن را عوض می‌کند. واژه‌ها، اصطلاح‌های محلی و سبک نوشته لزوماً با مخاطب تازه هماهنگ نمی‌شوند. اگر قرار است متن تبدیل‌شده منتشر شود، بهتر است کسی که با گونهٔ مقصد آشناست نگاهی به آن بیندازد.

مدل ByT5 چطور با دو خط کنار می‌آید؟

اگر کار فقط جایگزین‌کردن حرف به حرف بود، به مدل نیازی نداشتیم. در خط فارسی معمولاً مصوت‌های کوتاه (زبر و زیر و پیش) نوشته نمی‌شوند، اما در خط سیریلیک تاجیکستان همهٔ مصوت‌ها روی کاغذ می‌آیند. پس مدل باید از روی بافت جمله تشخیص دهد هر واژه چگونه خوانده می‌شود؛ مثلاً «کرم» بسته به جمله می‌تواند кирм (کِرم) باشد یا карам (کَرَم).

ByT5 متن را بایت به بایت می‌خواند، یعنی در پایه‌ای‌ترین سطحی که متن در رایانه ذخیره می‌شود، و برخلاف بسیاری از مدل‌ها به واژگانِ از پیش تعیین‌شده وابسته نیست. همین ویژگی آن را برای کار با دو الفبای متفاوت مناسب می‌کند. ما این مدل را روی متن‌های متناظر فارسی ایران و تاجیکستان آموزش دادیم تا الگوهای میان دو خط را یاد بگیرد؛ یک مدل واحد هر دو جهت را انجام می‌دهد. جزئیات معماری و کاربردهای مدل در Model Card آمده است.

مدل با چه داده‌ای آموزش دیده است؟

طبق Model Card، داده‌های آموزشی از ParsText آمده‌اند؛ پیکره‌ای موازی که در آن هر جمله کنار معادلش در خط دیگر قرار گرفته است. مدل از همین جفت‌ها یاد می‌گیرد که یک متن در خط دیگر چگونه نوشته می‌شود.

نوت‌بوک آموزش داده‌ها را از فایلی ادغام‌شده به نام all_data.tsv می‌خواند. ابتدا جفت‌های خالی و جفت‌هایی که یکی از دو طرفشان بیش از ۲۰۰ نویسه دارد حذف می‌شوند، سپس حروف و فاصله‌گذاری متن‌های خط فارسی با خودِ شکر یکدست می‌شود. در پایان، از هر جفت دو نمونه ساخته می‌شود: یکی برای تبدیل به سیریلیک و دیگری برای تبدیل به خط فارسی.

به گزارش Model Card، حاصل این مراحل ۷۵۱٬۶۵۰ نمونه است؛ یعنی ۳۷۵٬۸۲۵ جفت که هر کدام دو بار، یک بار در هر جهت، به کار رفته‌اند. ۹۰ درصد این نمونه‌ها برای آموزش، ۵ درصد برای اعتبارسنجی و ۵ درصد برای آزمون کنار گذاشته شده‌اند. دقت کنید که این عدد شمار نمونه‌هاست، نه شمار جمله‌های یکتا.

یک نکته هم دربارهٔ خاستگاه داده‌ها: مقالهٔ اصلی ParsText که Rayyan Merchant و Kevin Tang در سال ۲۰۲۴ منتشر کردند، ۲٬۸۱۳ جفت‌جمله از وبلاگ‌ها و خبرها را معرفی می‌کند. فایلی که برای آموزش این مدل به کار رفته بسیار بزرگ‌تر است و منابعش در نوت‌بوک یک‌به‌یک مستند نشده‌اند؛ پس اندازهٔ آن را نباید به نسخهٔ اولیهٔ ParsText نسبت داد.

مدل چقدر خوب کار می‌کند؟

Model Card نتایج زیر را روی ۳۷٬۵۸۲ نمونهٔ آزمون گزارش کرده است. در امتیاز chrF++ و تطابق کامل، عدد بالاتر بهتر است و در نرخ خطای نویسه، عدد پایین‌تر.

نتایج گزارش‌شدهٔ آزمون ByT5
جهتتعداد نمونهchrF++نرخ خطای نویسهتطابق کامل
خط فارسی به سیریلیک۱۸٬۷۰۵۸۷٫۹۰۴٫۶۷٪۴۲٫۳٪
سیریلیک به خط فارسی۱۸٬۸۷۷۹۱٫۷۶۲٫۸۳٪۶۴٫۹٪
مجموع۳۷٬۵۸۲۸۹٫۶۸۳٫۸۲٪۵۳٫۷٪

chrF++ میزان شباهت خروجی به متن مرجع را می‌سنجد و برای این کار هم نویسه‌ها را در نظر می‌گیرد و هم واژه‌ها را؛ بنابراین امتیاز ۸۹٫۶۸ به معنای «۸۹٫۶۸ درصد دقت» نیست. نرخ خطای نویسه نشان می‌دهد چند ویرایش نویسه‌ای لازم است تا خروجی به متن مرجع برسد. تطابق کامل از همه سخت‌گیرتر است و تنها یک پرسش دارد: آیا کل خروجی دقیقاً همان متن مرجع است؟

به همین دلیل، خروجی‌ها می‌توانند به مرجع بسیار نزدیک باشند و باز هم سهم کمتری از آن‌ها بی‌کم‌وکاست درست از آب درآید؛ گاهی یک حرف نادرست کافی است تا تطابق کامل از دست برود. تبدیل از خط فارسی به سیریلیک جهت دشوارتر است، که با لزوم حدس‌زدن مصوت‌های نانوشته جور درمی‌آید. نام‌های خاص، وام‌واژه‌های کم‌کاربرد و متن‌هایی که با داده‌های آموزشی فاصله دارند هنوز به دقت بیشتری نیاز دارند.

این اعداد را چطور باید خواند؟ در نوت‌بوک، تقسیم داده‌ها پس از ساختن نمونه‌های دوطرفه انجام شده است؛ یعنی ممکن است مدل جفتی را که در مجموعهٔ آزمون است، در جهت معکوس در دادهٔ آموزش دیده باشد. پس این نتایج را باید گزارشی در سطح نمونه دانست، نه آزمونی روی جفت‌متن‌های کاملاً تازه. افزون بر این، ارزیابی با جست‌وجوی پرتویی چهارتایی (beam search) انجام شده، در حالی که شکر به‌طور پیش‌فرض تنها یک پرتو به کار می‌برد. Model Card هم ارزیابی جداگانه‌ای برای نسخهٔ فشردهٔ کتابخانه ارائه نکرده است.

تبدیل خط را در شکر امتحان کنید

ابتدا کتابخانهٔ شکر را با pip install shekar نصب کنید. بعد، بسته به جهت تبدیل، یکی از این دو کلاس را به کار ببرید:

from shekar import FarsiToTajik, TajikToFarsi

to_tajik = FarsiToTajik()
to_persian = TajikToFarsi()

print(to_tajik("ایران مادر است!"))
# Эрон модар аст!

print(to_persian("Донишгоҳи Теҳрон"))
# دانشگاه تهران

این مثال‌ها از Model Card برداشته شده‌اند. شکر از نسخهٔ فشردهٔ ONNX مدل استفاده می‌کند که روی CPU و بدون نیاز به PyTorch اجرا می‌شود. برای متن‌های بلند، بهتر است متن را به جمله‌های کوتاه بشکنید و هر جمله را جدا تبدیل کنید، چون نمونه‌های آموزشی در هر طرف حداکثر ۲۰۰ نویسه داشته‌اند.

مدل با مجوز MIT منتشر شده است. می‌توانید وزن‌ها و Model Card را ببینید، راهنمای استفاده از کتابخانه را دنبال کنید یا برای آشنایی با جزئیات ساخت مدل سری به نوت‌بوک آموزش بزنید. امیدواریم این ابزار به خوانندگان و توسعه‌دهندگان بیشتری کمک کند تا از مرز میان این دو خط بگذرند.

ارجاع به شکر

اگر از شکر در پژوهش خود استفاده می‌کنید، لطفاً به مقالهٔ آن ارجاع دهید:

“Amirivojdan, A. (2025). Shekar: A Python Toolkit for Persian Natural Language Processing. Journal of Open Source Software, 10(114), 9128. DOI: 10.21105/joss.09128.”