۱. بسم الله الرحمن الرحیم
۲. مقدمه
به نظر مسخره میآید که هر بار میخواهیم متنی فارسی که پر از لغات انگلیسی است را تایپ کنیم، مجبور هستیم مدام از کلیدهای میانبر تغییر زبان استفاده کنیم.
حتما تا به حال برای همه ی ما پیش آمده که وقتی در مرورگر یک آدرس اینترنتی را تایپ میکنند، پس از نگاه کردن به صفحه ی نمایشگر خود به اشتباه با چیزی شبیه به «صصص.لخخلمث.زخپ» مواجه می شویم. تصور کنید که چقدر کار راحت تر می شود اگر صفحه کلید یا رایانه خودش بفهمد که هدف ما در آنجا انگلیسی تایپ کردن بوده است و نه فارسی.
هدف این پروژه در واقع نرم افزاری است که بتوان در آن بدون نیاز به تغییر زبان کیبورد و استفاده ی مدام و خسته کننده از دکمه های میانبر صفحه کلید، فارسی و انگلیسی را با هم نوشت و خود نرم افزار تشخیص دهد که کلمهی مورد نظر فرد در هر جمله و عبارت، فارسی بوده است یا انگلیسی.
این نرم افزار در درجه ی اول باعث راحتی و آسودگی کاربر می گردد و همچنین سرعت تایپ کاربر را مخصوصا در مواردی که متن مورد نظر آمیزه ای از جملات و کلمات دو زبانه می باشد،بالاتر می برد.
۳. کارهای مرتبط
شاید بتوان گفت که سایت گوگل یکی از بهترین تشخیص دهنده ها برای زبان ورودی می باشد. هنگامی که شما بدون توجه به این که صفحه کلید در چه حالتی است، مشغول به تایپ هستید و مثلا یک کلمه ی فارسی را به اشتباه به صورت انگلیسی تایپ می کنید و یا برعکس، سایت گوگل این اشتباه شما را تشخیص داده و خطای شما را در هنگام نمایش دادن نتایج، تصحیح می کند.
با اینکه این سایت از لحاظ هدف و نتیجه بسیار شبیه این پروژه می باشد اما متاسفانه منبع و مرجعی برای روش کار آن یافت نشد.
از جمله کارهای مرتبط دیگر می توان به Ninja Keyboard و Key Switcher اشاره کرد.این نرم افزار ها که بر روی ویندوز نصب می شوند، کلمات ورودی کاربر در برنامه های مختلف رو کنترل کرده و اگر کاربر فراموش کرده باشد که حالت صفحه کلید خود را تعویض کند، به صورت خودکار این کار را برای کاربر انجام می دهند.
اما دونکته قابل توجه وجود دارد : اولا اینکه این نرم افزارها از زبان فارسی پشتیبانی نمی کنند و به تعداد کمی از زبان ها محدود می شوند. ثانیا روش کار خود را برای پیاده سازی پروژه توضیح نداده اند و مشخص نیست که از چه روشی برای انجام پروژه ی شان استفاده کرده اند.
مواردی که در بالا ذکر شد، نمونه هایی از انجام این پروژه بودند. اما با توجه به اینکه هیچکدام روش کار خود را توضیح نداده و روش حل مسئله را در اختیار عموم قرار نداده بودند، بنابراین در انجام این پروژه نمی توان از آنها استفاده کرد و یا کمک گرفت.
۴. حل مسئله
با توجه به اینکه مسائلی که به زبان طبیعی انسان و یا نوشتار مربوط هستند عموما با Language Modeling حل می شوند، به نظر می رسد برای حل این مسئله نیز باید از تکنیک های Language Modeling بهره گرفت. حال به تعریف مختصری از این عبارت می پردازیم 1 :
Natural Language Model:
به زبانی می گویند که بین انسان ها رایج است و انسان ها می توانند از آن برای ارتباط با یکدیگر به صورت های نوشتن، حرف زدن، خواندن و ... استفاده کنند. وقتی می گوییم مدل سازی زبان طبیعی، یعنی بیاییم و روابط و قواعد زبان را به طور هدفمند، ساده کنیم تا به ابزاری برسیم که بتوان از آن برای بررسی زبان و یا استفاده یا حتی تولید آن استفاده کرد. بسیاری از این مدل ها از یک پس زمینه ریاضی برخوردار هستند،مانند گراف، احتمالات و ... .
برای کسب اطلاعات بیشتر در این زمینه می توانید به اینجا یا اینجا مراجعه کنید.
یکی از مدل هایی که مبتنی بر زبان های طبیعی می باشد و می توان در این پروژه از آن استفاده کرد مدل n-gram 2 می باشد :
در این مدل، از آمار کلاسیک و احتمال بهره گرفته شده است. فرض کنید که یک سری اشیا یا نشانه ها و یا هر چیز دیگری داشته باشیم. هر کدام از این ها را به صورت یک رأس در گراف تصور کنید که می تواند به رأس دیگری یال جهت دار داشته باشد. این یال جهت دار، نشان دهنده یک نوع رابطه است که با توجه به مورد دلخواه ما می تواند معانی متفاوتی داشته باشد. مثلاً در مورد زبان، می تواند توالی دو کلمه باشد (اگر کلمه ای بعد از کلمه دیگری بیاید، یک یال از اولی به دومی وجود دارد). به یک توالی n تایی از این رأس ها، n-gram می گوییم (توالی های 3gram، 2gram و ... داریم). در این مدل، یک مجموعه داده های آماری بسیار بزرگ نیاز داریم که هر کدام مجموعه ای از این نشانه ها به همراه روابط بین آن ها است. برای مثال، در مورد یک زبان خاص، یک سری متن در آن زبان می باشد.
روابطی در این مدل تعریف می شود که می توان با استفاده از آن، درستی یک توالی خواص از این نشانه ها را بررسی کرد.
حال به توضیح مختصری در مورد روابط این مدل می پردازیم :
فرض کنید می خواهیم درستی عبارت
حال احتمال های 3gram ، 2gram و ... به صورت زیر تعریف می شوند :
هر کدام از عبارت های بالا یعنی احتمال آمدن آخرین حرف مورد نظر بعد از حروف قبلی که مقدار آن برابر است با :
در عبارت بالا، تابع C یعنی تعداد تکرار توالی مورد نظر در داده های آماری.
در حالت کلی، احتمال درستی عبارت بالا در مدل n-gram به صورت رابطه زیر است :
در این جا، تنها یک مشکل باقی می ماند و آن هم این است که اگر تنها یکی از این احتمال ها صفر شود، احتمال کل صفر خواهد شد. در حالی که می دانیم داده های آماری ما محدودیت دارند و ممکن است بالاخره یکی از توالی ها، مخصوصاً اگر تعداد آن زیاد باشد، در داده ها وجود نداشته باشد. راه حل این است که به هر کدام، یک مقدار ثابت (مثلاً 1) اضافه کنیم.
برای آشنایی بیشتر با این مدل می توانید به اینجا مراجعه کنید.
این مدل می تواند در انجام این پروژه به ما بسیار کمک کند. زیرا با استفاده از آن می توان فهمید که هر کلمه که در متن آمده است، اساسا صحیح نوشته شده و مورد نظر نویسنده بوده و یا صرفا به خاطر صحیح نبودن حالت صفحه کلید، به آن شکل خاص نوشته شده است.
۵. آزمایش ها
در فاز دوم، پیاده سازی این پروژه با استفاده از زبان جاوا صورت گرفته است. اساس و پایه ی این پیاده سازی به این صورت است که هنگامی که یک متن برای پردازش به برنامه داده می شود، برنامه با توجه به پردازش هایی که از قبل بر روی متون فارسی و انگلیسی مختلف انجام داده است، صورت صحیح یک کلمه را تشخیص داده و آن را به خروجی برنامه اضافه می کند. در واقع برنامه این را بررسی می کند که صورت فارسی یک رشته از کاراکترها بیشتر در متون پردازش شده وجود داشته است یا صورت انگلیسی آن. سپس با توجه به احتمالی که هرکدام از کلمات داشته اند، هر کلمه ای را که احتمالش بیشتر باشد به عنوان پاسخ مسئله در نظر می گیرد.
داده های مورد استفاده :
همانطور که گفته شد، در انجام این پروژه از متون فارسی و انگلیسی مختلفی استفاده شده است تا بتوان هنگامی که یک کلمه به برنامه داده شد، صورت صحیح آن را تشخیص دهد.
داده های انگلیسی این پروژه از متون مختلفی جمع آوری شده است که بالغ بر 1,000,000 کلمه می باشد. از طریق این لینک می توانید به این داده ها دست پیدا کنید.
همچنین از دادگان پرسیکا که شامل بر 10,000 خبر از خبرگزاری ایسنا می باشد استفاده شده است که البته برای اینکه حجم داده های فارسی و انگلیسی مورد بررسی یکسان باشد، تنها از 2500 خبر آن استفاده شده است.روش پیاده سازی شده :
در این قسمت به توضیح مختصری در خصوص برنامه ی پیاده سازی شده می پردازیم :
برنامه به طوری نوشته شده است که ابتدا به بررسی دو فایلbig.txt
وbigfa.txt
می پردازد و بر اساس آنها یک hashmap می سازد. hashmap در واقع ساختمان داده ای می باشد که کارکرد آن نگهداری لیستی از مقادیر است که هرکدام از آنها توسط یک کلید قابل تشخیص و بازیابی می باشد. در این hashmap کلید ها همان کلمات درون هر فایل متنی است و مقادیر بر اساس تکرار هر کلمه در هر یک از متن ها مقداردهی می شود.
چون این فرآیند نسبتا زمان بر است، بعد از این که یکبار این کار انجام می شود hashmap های ساخته شده درون یک فایل ذخیره می شوند که بتواند به سرعت مورد بازیابی قرار گیرد. البته یک انتخاب درون برنامه وجود دارد که میتواند این hashmap ها را به روز رسانی کند.
بعد از ساختن این دو hashmap که یکی مربوط به کلمات زبان فارسی و دیگری مربوط به کلمات زبان انگلیسی است ورودی از کاربر گرفته شده و تک تک کلمات بررسی می شوند. اگر کلمه ای به صورتی که در ورودی داده شده است، در متونی که از قبل پردازش شده است وجود داشته باشد، آن کلمه به همان صورت که داده شده است به خروجی منتقل می شود ولی اگر اینچنین نباشد و کاربر بدون توجه به زبان صفحه کلید کلمه ای را تایپ کرده باشد، برنامه صورت صحیح آن را تشخیص داده و سپس به خروجی منتقل می کند.
همچنین با توجه به اینکه ممکن است کلمه وجود داشته باشد که هم صورت فارسی آن و هم صورت انگلیسی آن در هر دو زبان وجود داشته باشد، کلمه ای توسط برنامه انتخاب می شود که در آن زبان پرکاربرد تر باشد.روش کار با برنامه :
هر کاربر برای استفاده از این برنامه کافی ست که ورودی و متنی را که می خواهد مورد پردازش قرار بگیرد را درون فایلvoroodi.txt
تایپ کرده و سپس از طریق یک IDE برنامه را RUN کند. برنامه به کاربر دو انتخاب می دهد که با انتخاب گزینه ی دوم برنامه اجرا شده و خروجی هم بر روی کنسول IDE و هم درون فایلkhorooji.txt
قابل مشاهده خواهد بود.
نکته : با توجه به تنظیماتی که برای یک فایل txt. وجود دارد، ورودی باید از خط دوم در فایل مربوطه نوشته شود.
در زیر می توان نمونه ای از پزدازش یک متن را توسط برنامه مشاهده کرد :
متن ورودی برنامه :
hdk d; jsj dh d; فثسف fvhd hdk hsj ;i ببینیم حقخلقشئ nvsj ;hv می ;kn ؟
hdk \v,Ci باید بتواند که d; ;gli thvsd و ثدلمهسا را از هم تشخیص دهد
فاشدن غخع lja;vl
متن خروجی برنامه :
این یک تست یا یک test برای این است که ببینیم program درست کار می کند ؟
این پروژه باید بتواند که یک کلمه فارسی و english را از هم تشخیص دهد
thank you متشکرم
اما محدودیت ها و ضعف هایی که قابل مشاهده است این است که خروجی به صورت پشت سر هم چاپ شده و مثلا اگر کاربر در متن ورودی به خط بعد رفته باشد، این امر در خروجی نادیده گرفته می شود. همچنین کاربر نباید مثلا اگر کلمه ای انگلیسی مد نظر اوست و در اول جمله آمده است و می خواهد حرف اول آن را بزرگ بنویسد از دکمه ی Shift استفاده کند و همه ی کلمات را باید به صورت عادی بنویسد.
کد ها :
شما برای استفاده از این برنامه و مشاهده ی کدها می توانید به این لینک که در سایت گیت هاب قرار دارد مراجعه نمایید.
۶. منابع و مراجع
Third international joint on conference on Natural Language Processing , January 2008
Natural Language Processing , Raymond J. Mooney
A general language model for information retrieval , Fei Song and W.Bruce Croft
All our N-gram are belong to you , Alex Franz and Thorsten Brants