۱. بسم الله الرحمن الرحیم

۲. مقدمه

به نظر مسخره می‌آید که هر بار می‌خواهیم متنی فارسی که پر از لغات انگلیسی است را تایپ کنیم، مجبور هستیم مدام از کلیدهای میانبر تغییر زبان استفاده کنیم.
حتما تا به حال برای همه ی ما پیش آمده که وقتی در مرورگر یک آدرس اینترنتی را تایپ می‌کنند، پس از نگاه کردن به صفحه ی نمایشگر خود به اشتباه با چیزی شبیه به «صصص.لخخلمث.زخپ» مواجه می شویم. تصور کنید که چقدر کار راحت تر می شود اگر صفحه کلید یا رایانه خودش بفهمد که هدف ما در آنجا انگلیسی تایپ کردن بوده است و نه فارسی.
هدف این پروژه در واقع نرم افزاری است که بتوان در آن بدون نیاز به تغییر زبان کیبورد و استفاده ی مدام و خسته کننده از دکمه های میانبر صفحه کلید، فارسی و انگلیسی را با هم نوشت و خود نرم افزار تشخیص دهد که کلمه‌ی مورد نظر فرد در هر جمله و عبارت، فارسی بوده است یا انگلیسی.
این نرم افزار در درجه ی اول باعث راحتی و آسودگی کاربر می گردد و همچنین سرعت تایپ کاربر را مخصوصا در مواردی که متن مورد نظر آمیزه ای از جملات و کلمات دو زبانه می باشد،بالاتر می برد.


۳. کارهای مرتبط

شاید بتوان گفت که سایت گوگل یکی از بهترین تشخیص دهنده ها برای زبان ورودی می باشد. هنگامی که شما بدون توجه به این که صفحه کلید در چه حالتی است، مشغول به تایپ هستید و مثلا یک کلمه ی فارسی را به اشتباه به صورت انگلیسی تایپ می کنید و یا برعکس، سایت گوگل این اشتباه شما را تشخیص داده و خطای شما را در هنگام نمایش دادن نتایج، تصحیح می کند.
با اینکه این سایت از لحاظ هدف و نتیجه بسیار شبیه این پروژه می باشد اما متاسفانه منبع و مرجعی برای روش کار آن یافت نشد.

نمونه ای از تشخیص زبان ورودی کیبورد توسط سایت گوگل

از جمله کارهای مرتبط دیگر می توان به 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 استفاده کند و همه ی کلمات را باید به صورت عادی بنویسد.

  • کد ها :
    شما برای استفاده از این برنامه و مشاهده ی کدها می توانید به این لینک که در سایت گیت هاب قرار دارد مراجعه نمایید.


۶. منابع و مراجع


  1. A general language model for information retrieval , Fei Song and W.Bruce Croft

  2. All our N-gram are belong to you , Alex Franz and Thorsten Brants

تایید شده

به نام خدا
پروژه شما را مطالعه کردم. ضمن عرض خسته نباشید به عرض چند نکته بسنده می‌کنم.

  1. قراردادن کورپوس در سایت گیت‌هاب کار درستی نیست. بهتر بود کورپوس‌های خود را در جایی دیگر آپلود می‌کردید و آدرس و نحوه‌ی قراردادن آن در پروژه را در یک فایل متنی کوچک توضیح می‌دادید.

  2. استفاده از نیم‌فاصله یک عادت زیبا در فارسی‌نویسی است که در صورت رعایت آن، خواننده ترغیب بیشتری به مطالعه متن شما پیدا می‌کند.

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

محمد عبدوس

با سلام
1- در مورد "برنامه با توجه به پردازش هایی که از قبل بر روی متون فارسی و انگلیسی مختلف انجام داده است" توضیحی داده نشده است.
2- در مورد نحوه تشخیص کلمات درون یک مت توضیحی داده نشد که آیا عملیات یکسان سازی هم روی متن انجام میدهید یا خیر؟ مثلا اگر راهکار شما برای تشخیص کلمه استفاده از فاصله باشد کلماتی مانند "می آورم یا سی ان ان " را که با فاصله جدا شده اند را چند کلمه در نظر میگیرید؟
3- نحوه تشخیص صورت صحیح کلمه در قسمت "روش پیاده سازی شده" آورده نشده است. فقط به گفتن "برنامه صورت صحیح آن را تشخیص داده" اکتفا کرده اید.
4- صحبتی از ارزیابی پروژه نداشته اید. درصد دقت برنامه و صحت آن از جمله مواردی است که باید در گزارش خود قرار میدادید.
از تلاشی که انجام داده اید سپاسگزارم.

تایید شده

با عرض سلام و احترام
مسئله به خوبی توضیح و بسط داده شده بود، نکته ای که در این میان حائز اهمیت است که این استثنایی که فرمودید(در جمله بعدی به آن اشاره کرده ام) در هیچ جا از برنامه شما پیاده سازی نشده بود
"همچنین با توجه به اینکه ممکن است کلمه وجود داشته باشد که هم صورت فارسی آن و هم صورت انگلیسی آن در هر دو زبان وجود داشته باشد، کلمه ای توسط برنامه انتخاب می شود که در آن زبان پرکاربرد تر باشد."
نکته بعدی این که پرکاربرد بودن یک کلمه در دوزبان چگونه محاسبه می شود؟به این نکته اشاره نشده بود!
در این آدرس https://web.stanford.edu/class/cs124/lec/languagemodeling.pdf
قبل از روش n-gram روش bigram, Markov!Assump1on توضیح داده شده است لطفادلایل خود را برای گذر از این دو روش و انتخاب n-gram بفرمایید.
در نهایت تشکر می کنم از زحماتی که برای تحلیل و پیاده سازی این پروژه کشیدید.

تایید شده

با سلام و خسته نباشید...
کار شما تا این مرحله نسبتا خوب بوده است.هر چند دارای چند ایراد جزیی می باشد :
۱.منابعی که استفاده کرده اید خیلی کم است که شاید یک دلیل آن ساده و واضح بودن پروژه شما است اما اگر از منابع بیشتری استفاده می کردید قطعا کارتان اعتبار بیشتری پیدا می کرد.
۲.باید سعی کنید تا جایی که ممکن است از کلمات فارسی استفاده کنید و مترادف انگلیسی آن ها را در پاورقی بیاورید.( مثلا استفاده از مدل های طبیعی زبان به جای natural language model.)
۳.در منابع خود لینک یک سایت را قرار داده اید که بهتر بود آن را در بخشی با عنوان پیوند های مفید قرار می دادید.
۴.بهتر بود در قسمت پاورقی نام منابع را نمی آوردید.
۵.در متنتان به ندرت قسمتی را به یک منبع ارجاع داده اید.(مثلا قسمت هایی از بخش حل مساله را از سایتی که در منبع قرار داده اید گرفتید ولی ارجاعی وجود ندارد.)
از جمله نکات مثبت کارتان یکی رعایت سادگی و اختصار در توضیح هایتان است و دیگر اینکه کدتان به درستی کار می کند و نتیجه قابل قبولی داشته است.