در این پروژه الگوریتمی را پیاده‌سازی می‌کنیم که قادر به تشخیص توئیت‌های به زبان انگلیسی از بین مجموعه توئیت‌ها به زبان‌های مختلف باشد.

۱. مقدمه

آیا اگر یک جمله یا جملاتی داشته‌باشیم، می توانیم به سادگی زبان آن را تخشیص دهیم؟ آیا اگر یک زبان را تا حد خوبی بلد نباشیم و توانایی مکالمه یا حتی فهم آن را نداشته‌باشیم می‌توانیم جملات آن زبان را از جملات زبان مشابهی تشخیص دهیم؟ واقعیت این است که تشخیص زبان یک عبارت در زبانی خاص احتیاج به فهم آن زبان ندارد(بلکه می‌توان آن را به‌وسیله‌ی دسترسی به یک دیتاست خوب تشخیص داد!).
اهمیت مسئله از آنجایی مشخص می‌شود که قبل از هر پردازشِ زبانی شامل pars کردن، index کردن و حتی مراحل بعدی شامل کاوش معنایی متن مثلا تشخیص عواطف یا علایق از روی یک متن (مثلا یک توئیت)، ابتدا لازم است زبان متن تشخیص داده‌شود. معمولا این کار توسط کارشناس انجام می‌شود اما مطلوب، شناسایی زبان متن بدون نیاز به کارشناس است. در اینجا سعی داریم مسئله‌ی تشخیص زبان متن توئیت‌ها را که نمودی از مسئله‌ی تشخیص زبان متن است، حل کنیم.

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

چندین روش برای تشخیص زبان یک متن ارائه شده‏‌است که به اختصار از آن‌ها نام می‌بریم:

  1. براساس رشته‌های یکتای هر زبان1 :
    در هر زبان یک سری دنباله رشته‌ای خاص همان زبان وجود دارد که می‌تواند توسط یک کارشناس مشخص شده‌باشد یا از روی داده‌های آموزشی به‌دست‌آید. از اشکالات این روش این است که رشته‌های خیلی کوتاه با آن که خیلی راحت به‌دست‌می‌آیند، کمتر درستی تشخیص زبان متن مورد نظر را تضمین می‌کنند.(احتمال وجود رشته‌های کوتاه در سایر زبان‌ها زیاد است.) از طرفی هر چه طول رشته بیشتر باشد، با اطمینان بیش‍تری می‌توان زبان متن را تشخیص داد اما به همان نسبت رشته‌های یکتای طولانی در هر زبان کمیاب‌ترند.

  2. روش کلمات متواتر در هر زبان2 :
    روش قابل استفاده دیگر برای تشخیص زبان یک متن بررسی کلمات متواتر هر زبان بر اساس داده‌های برچسب‌گذاری‌شده است.البته این روش اگر tokenization در یک زبان سخت باشد روش خوبی نخواهد بود.[1]

  3. روش3 ساخت مدل N-gram:
    روش دیگر، تشخیص زبان با استفاده از مدل‌های زبانی بر پایه N-gram می باشد. N-gram در واقع قطعات N کارکتری از متن هستند. برای مثال رشته‌ی data دارای N-gram های زیر خواهد بود:
    unigrams: ,d,a,t,a,
    bigrams: d,da,at,ta,a
    trigrams: da,dat,ata,ta
    quadgrams: dat,data,ata
    5-grams: data,data
    6-grams: data

نمونه‌ای از دسته‌بندی یک رشته بر پایه N-gram ها (تصویر 1)[2]

در این روش رشته‌ها tokenize می‌شوند و از این token ها N-gram ها تولید می‌شوند. سپس بر اساس تواتر و تکرارشان مرتب شده و پرتکرارترین N-gram ها مدل زبانی ما ار خواهند ساخت. در نهایت با به‌دست‌آوردن فاصله‌ی مدل زبان مورد نظرمان نسبت به مدل‌های زبانی به‌دست‌آمده از داده‌های آموزشی زبان متن مورد نظر را پیش‌بینی می‌کنیم. [3]

نمونه‌ای از محاسبه‌ی فاصله‌ی زبان از مدل‌های به‌دست‌آمده(تصویر 2)[4]

  1. روش4 ساخت مدل N-gram برپایه گراف:
    در این مدل بین هر دو شی (مثلا بین دو کلمه) یک یال وجود دارد که نشان‌دهنده‌ی توالی آن دو خواهد بود. برای مثال دو عبارت is this a test در زبان انگلیسی و is dit een test در زبان هلندی را در نظر می‌گیریم. در این صورت تصویر زیر نشان‌دهنده گراف این دو عبارت خواهدبود.

    گراف حاصل با استفاده از trigrams (تصویر 3)

این مدل بر اساس احتمال و آمار کلاسیک ساخته خواهد شد و بر اساس روابط موجود در یک مدل حاصل از زبان‌های موجود در داده‌های آموزشی زبان یک متن جدید قابل پیش‌بینی خواهد بود.[5]

۳. آزمایش ها

برای حل این مسئله از الگوریتم روش ساخت مدل N-gram استفاده می‌کنیم. در مرحله‌ی اول سعی می‌شود عباراتی از متن توئیت‌ها که نباید تاثیری در تشخیص زبان داشته‌باشند، از آن‌ها حذف شوند. برای مثال لینک‌ها و ... . کد این فرایند به صورت جداگانه نوشته شده تا تنها یک بار روی مجموعه داده‌ی آموزشی اجرا شود. و در آن علاوه بر لینک‌ها، رشته‌های آغاز شده با @ (که قبل از نام‌های کاربری و برای مخاطب قرار دادن افراد استفاده می‌شوند5) و # (برچسب‌ها6) از متن توئیت‌ها حذف خواهندشد. چرا که زبان این رشته‌ها لزوماً با زبان اصلی توئیت یکسان نیست.
در مرحله‌ی بعد با توجه به داده‌های آموزشی‌مان مدل N-gram داده‌های دارای برچسب انگلیسی را تهیه می‌کنیم. به این‌صورت که ابتدا تمامی N-gram های موجود در داده‌های آموزشی را به دست آورده و بر اساس تواتر آن‌ها را مرتب می‌کنیم. سپس تعداد مشخصی از متواترترین N-gramها مدل را تشکیل می‌دهند.
قبل از پردازش روی هر توئیت جدید (که هدف‌مان تعیین زبان آن است) مرحله‌ی پیش‌پردازش (شامل حذف رشته‌های غیرمرتبط با زبان توئیت) را روی آن اجرا می‌کنیم. در مرحله‌‌ی بعدی برای آن تمامی N-gram ها را به دست آورده و بر اساس تواترشان در یک مرتب و تعداد مشخصی از پرتکرارترین‌ها را انتخاب می‌کنیم. سپس به‌ازای هر عنصر در لیست N-gram های توئیت مورد نظر، فاصله‌ی جایگاه عنصر را در دو لیست به‌دست‌می‌آوریم. فاصله‌ی توئیت مورد نظر از مدل زبان انگلیسی به صورت زیر محاسبه می‌شود:

OutOfPlaceMeasure / L_{1}*L_{2}

که در آن OutOfPlaceMeasure در واقع مجموع فواصل جایگاه هر عنصر در دو لیست (تصویر 2)، و مخرج حاصل‌ضرب طول دو لیست می‌باشد. در این‌جا اگر فاصله‌ی توئیت مورد نظر از مدل زبان انگلیسی کوچک‌تر از حدی باشد زبان آن توئیت را انگلیسی پیش‌بینی می‌کنیم. (بهترین حد مورد نظر طی آزمایش‌ها و با آزمون و خطا، 9 به دست آمد.)

پیاده‌سازی این الگوریتم به زبان پایتون از این‌طریق قابل دسترسی می‌باشد. برای آموزش و ارزیابی کد در این مرحله، از مجموعه داده‌ی tweetLID استفاده شده‌است که شامل حدود 35 هزار توئیت برچسب‌زده‌شده می‌باشد. از این مجموعه داده 300 توئیت به عنوان داده‌ی آزمایشی و بقیه‌ی داده‌ها به عنوان داده‌ی آموزشی استفاده شده‌اند.
برای ارزیابی از سه معیار دقت7،فراخوانی8 و معیار F9 استفاده شده است که هر کدام به صورت زیر محاسبه می‌شوند:

Recall = TP / (TP+FN)
Precision = TP / (TP+FP)
F = 2*Precision*Recall / (Precision+Recall)

که در آن‌ها P نمایان‌گر برچسب انگلیسی و N نمایان‌گر برچسب غیرانگلیسی است. همچنین T و F به ترتیب موارد پیش‌بینی‌شده به زبان انگلیسی و غیرانگلیسی و مجاورت حروف نماد اشتراک آن‌هاست.
آزمایش برای N-gram های مختلف شامل {1,2,3,4,5} = N انجام شده و نتایج آن به صورت زیر می‌باشد.

نمودار معیارهای ارزیابی در N های مختلف

در این آزمایش‌ها احتمالا به‌دلیل کافی نبودن داده‌های آموزشی به دقت‌های چندان بالایی دست نیافتیم.با این حال به نظر می‌رسد الگوریتم برای 4=N نسبتاً نتایج بهتری دارد.هم‌چنین با استفاده از مجموعه‌ی داده‌های بزرگ‌تر احتمالا نتایج بهتری حاصل خواهدشد.[6]

۴. کارهای آینده

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

[1] M.Martino, R.Paulsen, Natural language determination using partial words. US Pat. 6216102B1,1996
[2] www.slideshare.net/shuyo/language-detection-library-for-java
[3] William B. CAVNAR, John M.TRENKLE, N-Gram-Based Text Categorization,In Proceedings of SDAIR-94, 3rd Annual Symposium on Document Analysis and Information Retrieval , 1994
[4] Tomáš ÖLVECKÝ,N-Gram Based Statistics Aimed at Language Identification
[5] Erik TROMP ,Mykola PECHENIZKIY, Graph-based n-gram language identification on short texts, Proc. 20th Machine Learning conference of Belgium and The Netherlands, 2011
[6] Iosu Mendizabal , Jeroni Carandell ,Daniel Horowitz, TweetSafa: Tweet language identification

۶. پیوندهای مفید


  1. Unique character strings

  2. Frequent Words Method

  3. N-gram Method

  4. Graph-based N-gram Method

  5. Mentions

  6. Hashtags

  7. Precision

  8. Recall

  9. F measure

تایید شده

در کل خوب بود ولی بهتر بود چند مورد صحیح و همین طور چند موردی که پیاده سازی شما به اشتباه تشخیص داده است هم آورده می شد اما بخش مقدمه و کارهای مرتبط خوب بود.

رد شده

سلام
مطالب مناسبی در مورد این موضوع و حل این مسأله بیان کرده اید.
بهتر است نتایج آزمایش در بخش نتایج ذکر شود.
نموداری که رسم کرده اید،نتایج را بهتر نمایش می دهد.
سعی کنید قواعد نشانه گذاری مثل ویرگول و خطاهای املایی خود را برطرف نمایید.
بهتر است در فاز بعدی،دقت آزمایش خود را بهبود ببخشید.

محسن ایمانی

همین که توانسته‌اید روی مجموعه داده واقعی پیاده‌سازی اولیه داشته باشید و این پیاده‌سازی را ارزیابی کرده‌اید، هدف این فاز را محقق کرده‌اید.
اما دقت‌های مدل پیاده‌سازی شده برای شما نیاز به بهبود دارد که ان‌شاءالله در فاز آینده تلاش خود را برای بهبود دقت مدل و یا پیاده‌سازی روش‌های باکیفیت‌تر انجام داده و نتایج را ارتقاء دهید.
در متن اشاره نکرده‌اید حد معیار فاصله (که ۹ قرار داده شده است) را چگونه بدست آورده‌اید. می‌توانستید با انجام مجموعه‌ای از آزمایش‌ها و ترسیم نمودار (مانند آن‌جه که برای پیدا کردن مقدار بهینه پارامتر N در ngram صورت گرفت) دلیل تعیین عدد ۹ به عنوان معیار را شرح بدهید.
همچنین بهتر بود به جای این که فقط برای یک زبان فاصله ngram ها را محاسبه کرده و آن را با حد معیار مقایسه کنید، برای چندین زبان مدل Ngram را تولید کرده، این فاصله را برای همه آن‌ها محاسبه نموده و زبانی که به دارای کم‌ترین فاصله است را به عنوان زبان متن تشخیص داده می‌شد.
در پیاده‌سازی نیاز به مراحل پیرایش و پیش‌پردازش بیشتری روی متن احساس می‌شود. برای مثال در N=4 پر تکرار ترین رشته رشته‌ای حاوی یک جای خالی و سه علامت دلار پشت سر هم است و بسیاری از رشته‌های پرتکرار حاوی کاراکترهای غیر مجاز نظیر فاصله, $, ', ! و ... هستند که در مرحله پیش‌پردازش این کاراکترها باید از جمله حذف شوند و یا این که همه کاراکترها به صورت کوچک (lowercase) تبدیل شوند تا نتایج بهتری داشته باشید.
همچنین بهتر بود منبع روش و پیاده‌سازی مربوط به آن را هم در متن خود ذکر می‌کردید.
برای فاز آینده و برای ارتقاء دقت مدل می‌توانید روی مجموعه داده‌های متنی زبان انگلیسی بزرگ‌تر مدل خود را آموزش دهید که در بهبود دقت تاثیر خواهد داشت.
همچنین می‌توانید از مدل‌های زبانی (Language model) برای آموزش استفاده کنید که در صورت آموزش روی یک مجموعه داده بزرگ، می‌تواند نتایج را بهبود دهند. برای آشنایی با مدل‌های زبانی می‌توانید این منبع را مطالعه کنید و برای پیاده‌سازی هم می‌توانید از کتابخانه NLTK استفاده کنید.
همچنین بهتر است برای فاز آینده مقایسه‌ای روی ابزارهای آماده تشخیص زبان مانند cld2 و Langid هم داشته و روی مجموعه داده مربوطه آن‌ها را نیز ارزیابی کنید.