معرفی سیستم استپ وان: ریشه‌یابی و قطعه‌بندی (توکنایز) متون فارسی

«استپ وان» یکی از پروژه های آزمایشگاه پردازش زبان طبیعی دانشگاه شهید بهشتی تهران است. دو کاربرد اصلی این ابزار، یکی ریشه یابی (استمینگ) واژه ها است و دیگری قطعه بندی (توکنایز کردن) متن ها. هر دو ابزار برای زبان فارسی کار می کنند. با توجه به کمبود ابزار پردازش زبان فارسی، چنین سیستمی که به رایگان قابل استفاده است و API هم دارد، می تواند خیلی مفید باشد.این ابزار با زبان C# نوشته شده و علاوه بر دو کاربرد اصلی در هر بار فراخوانی، کارهای دیگری هم می کند. در معرفی این ابزار از دو نسخه ی «قبلی» و «جدید» صحبت شده اما API هر دو یکی هستند. در این معرفی هم از فرم خود سایت (نسخه ی جدید) استفاده می کنم و هم از API. برای ارسال و دریافت اطلاعات از و به API از افزونه ی RESTED Client در مرورگر کروم استفاده می کنم. ریشه یابیبخش ریشه یابی این ابزار برای واژه ها کار می کند. برای مثال بیایید ریشه ی «بگیرید» را پیدا کنیم:یافتن ریشه ی «بگیرید» در وب سایت استپ وانمشخص است که برای این واژه سه حالت پیدا شده است. در یک حالت «بگیر» ریشه تشخیص داده شده و در دو حالت دیگر «گیر». همین کار را با ارسال این واژه به عنوان پارامتر inputString به صورت پست به نشانی http://nlp.sbu.ac.ir:40101/Api/Client/Stem می توان انجام داد.ارسال «بگیرید» به API استپ وانخروجی این تابع به صورت جیسون است و فیلدهای زیادی دارد. به نظر می رسد وبسایت از دو فیلد output و stemmer_Morph استفاده می کند. برای هر حالت پیدا شده، خود واژه، پیشوندها و پسوندها، ریشه، تگ، نوع واژه، زمان دستوری (tense)، بسامد، حالت آوایی (فونتیک)، «داشتن ضمیر مفعولی چسبیده»، «ضمیر مفعولی چسبیده بودن» و شماره برگردانده می شود. در جایی از سایت فهرستی از تگ ها نیافتم و همچنین نمی دانم بسامد هر واژه در چه پیکره ای شمارش شده است. شماره (num) را هم نمی دانم چیست.{ &quotmessage&quot: &quotباموفقیت انجام شد&quot, &quotresult&quot: true, &quotdata&quot: { &quotoutput&quot: &quotبگیر|گیر|گیر&quot, &quotstemmer_Morph&quot: &quotنوع: صفت + فعل دوم شخص جمع\r\nصورت واجی ریشه: begir\r\nبسامد ریشه:1\r\nبگیر + ید\r\n\r\n********************************\r\n\r\nزمان: فعل حال التزامی\r\nنوع: دوم شخص جمع\r\nصورت واجی ریشه: gir\r\nبسامد ریشه: 5000\r\nب + گیر + ید\r\n\r\n********************************\r\n\r\nنوع: ب + صفت + فعل دوم شخص جمع\r\nصورت واجی ریشه: gir\r\nبسامد ریشه: 165\r\nب + گیر + ید\r\n\r\n********************************\r\n\r\n&quot, &quotmorphs&quot: [ { &quotword&quot: &quotبگیرید&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [ &quotید&quot ], &quotstem&quot: &quotبگیر&quot, &quottag&quot: &quotA0&quot, &quotkind&quot: &quotصفت + فعل دوم شخص جمع&quot, &quottense&quot: &quot&quot, &quotfrequency&quot: 1, &quotphonetic&quot: &quotbegir&quot, &quothasZamir_mafooli_chasbide&quot: false, &quotzamir_mafooli_chasbide&quot: &quot&quot, &quotnum&quot: 0 }, { &quotword&quot: &quotبگیرید&quot, &quotprefixs&quot: [ &quotب&quot ], &quotpostfixs&quot: [ &quotید&quot ], &quotstem&quot: &quotگیر&quot, &quottag&quot: &quotV1&quot, &quotkind&quot: &quotدوم شخص جمع&quot, &quottense&quot: &quotفعل حال التزامی&quot, &quotfrequency&quot: 5000, &quotphonetic&quot: &quotgir&quot, &quothasZamir_mafooli_chasbide&quot: false, &quotzamir_mafooli_chasbide&quot: &quot&quot, &quotnum&quot: 0 }, { &quotword&quot: &quotبگیرید&quot, &quotprefixs&quot: [ &quotب&quot ], &quotpostfixs&quot: [ &quotید&quot ], &quotstem&quot: &quotگیر&quot, &quottag&quot: &quotA0&quot, &quotkind&quot: &quotب + صفت + فعل دوم شخص جمع&quot, &quottense&quot: &quot&quot, &quotfrequency&quot: 165, &quotphonetic&quot: &quotgir&quot, &quothasZamir_mafooli_chasbide&quot: false, &quotzamir_mafooli_chasbide&quot: &quot&quot, &quotnum&quot: 0 } ] } }من واژه های دیگری را هم تست کردم. خیلی از واژه ها به خوبی ریشه یابی شدند. مثلن در جدانویسی «می» در بعضی افعال (استفاده نکردن از نیم فاصله). که در بعضی موارد، ابزار درست عمل نکرد. مثلن:واژه های محاوره ای ریشه یابی نمی شوند.بعضی واژه ها ریشه یابی نشدند. مثل: نیم فاصلهبرای بعضی واژه ها ریشه های عجیبی یافت شد. مثل ریشه ی «سلیم» برای واژه ی «سلیمانی».افعال مرکب ریشه یابی نمی شوند.بعضی جمع های مکسر به درستی ریشه یابی نشدند. مثل «امثال» و «خزائن».قطعه بندیدر بخش قطعه بندی استپ وان می توان یک متن فارسی را توکنایز کرد. من از یک جمله ی ساده («متغیرها از نظر مقیاس هم با هم متفاوتند.») استفاده کردم.توکنایز کردن یک جمله ی ساده در وبسایت استپ وانبا ارسال این جمله به API با نتیجه ای مشابه زیر روبرو می شویم (بخشی از نتایج را برای کوتاه شدن حذف کردم):{ &quotmessage&quot: &quotباموفقیت انجام شد&quot, &quotresult&quot: true, &quotdata&quot: { &quotinputString&quot: &quotمتغیرها از نظر مقیاس هم با هم متفاوتند.&quot, &quottokenOutput&quot: &quotمتغیرها از نظر مقیاس هم با هم متفاوتند. &quot, &quottaggedSubstrings&quot: [ { &quotkind&quot: &quotصفت + علامت جمع&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [ &quotها&quot ], &quotword&quot: &quotمتغیرها&quot, &quotfrequency&quot: 45, &quotphonetic&quot: &quotmotaqayyer&quot, &quotnum&quot: 0, &quotstem&quot: &quotمتغیر&quot, &quottag&quot: &quotA0&quot, &quottense&quot: &quot&quot, &quotzamirMafoliChasbide&quot: &quot&quot }, { &quotkind&quot: &quotقید&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [], &quotword&quot: &quotهم&quot, &quotfrequency&quot: 7500, &quotphonetic&quot: &quotham&quot, &quotnum&quot: 0, &quotstem&quot: &quotهم&quot, &quottag&quot: &quotAd&quot, &quottense&quot: &quot&quot, &quotzamirMafoliChasbide&quot: &quot&quot }, { &quotkind&quot: &quotحرف اضافه&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [], &quotword&quot: &quotبا&quot, &quotfrequency&quot: 87825, &quotphonetic&quot: &quotbA&quot, &quotnum&quot: 0, &quotstem&quot: &quotبا&quot, &quottag&quot: &quotPr&quot, &quottense&quot: &quot&quot, &quotzamirMafoliChasbide&quot: &quot&quot }, { &quotkind&quot: &quotصفت + فعل سوم شخص جمع&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [ &quotند&quot ], &quotword&quot: &quotمتفاوتند&quot, &quotfrequency&quot: 270, &quotphonetic&quot: &quotmotafAvet&quot, &quotnum&quot: 0, &quotstem&quot: &quotمتفاوت&quot, &quottag&quot: &quotA0&quot, &quottense&quot: &quot&quot, &quotzamirMafoliChasbide&quot: &quot&quot }, { &quotkind&quot: &quotعلامت&quot, &quotprefixs&quot: [], &quotpostfixs&quot: [], &quotword&quot: &quot &quot, &quotfrequency&quot: 0, &quotphonetic&quot: &quot&quot, &quotnum&quot: 0, &quotstem&quot: &quot&quot, &quottag&quot: &quotSi&quot, &quottense&quot: &quot&quot, &quotzamirMafoliChasbide&quot: &quot&quot } ], &quotsentences&quot: [ &quotمتغیرها از نظر مقیاس هم با هم متفاوتند.&quot, &quot &quot ], &quotwords&quot: [ &quotمتغیرها&quot, &quot &quot, &quotاز&quot, &quot &quot, &quotنظر&quot, &quot &quot, &quotمقیاس&quot, &quot &quot, &quotهم&quot, &quot &quot, &quotبا&quot, &quot &quot, &quotهم&quot, &quot &quot, &quotمتفاوتند&quot, &quot.&quot, &quot &quot ] } }در این جا هم فیلدهای زیادی برگردانده می شوند. فرق inputString و tokenOutput را متوجه نشدم (مشابه بودند). فیلدهای موجود برای هر واژه هم تقریبن مشابه بخش ریشه یابی هستند. نکته ی جالب این است که همه ی فاصله ها هم برچسب می خورند که باعث طولانی شدن نتایج شده است. همچنین به نظر نمی آید محدودیتی از نظر تعداد کاراکتر ارسالی وجود داشته باشد. من یک متن طولانی را در سایت وارد کردم و مشکلی پیش نیامد (به جز زمان طولانی پاسخ گویی).نتیجه گیریدر این نوشته دو بخش اصلی ابزار استپ وان را که یک ابزار رایگان برای پردازش متون فارسی است بررسی کردیم: ریشه یابیو قطعه بندی. این ابزار برای توسعه ی ابزارهای مرتبط با پردازش زبان فارسی و پیکره های زبانی می تواند بسیار مفید باشد.