رفتن به نوشته‌ها

مدل زبانی و nتایی‌ها (Language model & N-grams)

مدلسازی زبان یا مدل زبانی یا language model چیست؟

می‌توان در ساده‌ترین حالت مدل زبانی احتمال وقوع یک کلمه (گاهی اوقات یک جمله یا کاراکتر) دانست. مثلا جمله زیر را در نظر بگیرید:

علی به مدرسه …

اگر بخواهیم جای خالی (…) را پر کنیم کلماتی مثل: رفت، می‌رود یا خواهد رفت نسبت به کلماتی مثل: یخچال، مرغ و آرایشگاه محتمل‌ترند. به طور کلی در مدل‌ زبانی یا مدلسازی زبان قرار است که به یک متن (کاراکتر، کلمه یا جمله) احتمالی رو تخصیص بدهیم. که این احتمال بیشتر به معنای پرکاربرد بودن و پر استفاده‌تر بودن است. مدل زبانی کاربردهای زیادی می‌تواند داشته باشه مثلا هنگامی که در گوگل چند کلمه را تایپ می‌کنید کلماتی که بعد از شما گوگل پیشنهاد می‌دهد در واقع بر اساس همین مدل زبانی است. در واقع گوگل کلماتی را پیشنهاد می‌دهد که فکر می‌کند بعد از کلمات شما بیشترین احتمال آمدن را خواهند داشت:

 

یا مثلا در گوگل ناو (Google Now)، هنگامی که شما یک جمله رو بیان می‌کنید: “ترافیک تو همت چقدر؟” میتونه با خیلی جملات مشابه قاطی بشه که کاملا شاید بی‌معنی باشند یا اگر معنی داشته باشند هدف شما نبوده است:

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

یا مثلا هنگامی که در گوشی‌تون تایپ می‌کنید و در بالای کیبورد به شما پیشنهاداتی داده می‌شود. اینکه چه کلماتی محتمل هستند که به شما به عنوان کلمه بعدی پیشنهاد شوند مثالی دیگر از مدل زبانی است:

 

و در بسیاری از کاربردهای دیگر مثل ترجمه ماشین و تشخیص کاراکتر، بازیابی اطلاعات و … از مدل زبانی استفاده می‌شود و یکی از تسک‌‌های مهم پردازش زبان محسوب می‌شود.

به طور کلی میشه گفت در اغلب کاربردهای مدل‌زبانی از شما خواسته میشه که کدامیک (از جملات، عبارات، کلمات یا کاراکترها) محتمل‌ترند:

P(علی به مدرسه رفت) > P(علی به مدرسه یخچال)

P(بی ادب) > P (بی یخچال)

P(بیشعور) > P (بیشعوس)

 

Ngram یا nتایی‌ها:

خب ما گفتیم احتمال احتمال بیایید با هم نحوه محاسبه این احتمال رو بررسی میکنیم. ببینیم چطوری میشه محتمل بودن یک جمله، کلمه یا کاراکتر را نسبت به جملات یا کلمات دیگر را محاسبه کرد. فرض کنید می‌خواهیم احتمال یک کلمه را حساب کنیم. فرمولی که خواهیم داشت چیزی شبیه زیر است:

P(w|h)

احتمال آمدن کلمه w با شرط آمدن h. که اصطلاحا این h رو history می‌گن و میتواند تمام کلمات قبلی یا ۲ ۳ تای قبلی باشد. فرض کنید در مثال “علی به مدرسه رفت” میخواهیم احتمال کلمه “رفت” رو حساب کنیم.

P(علی به مدرسه|رفت)

یک راه برای اینکه این احتمال رو تخمین بزنیم این است که از تعداد تکرار این جلمه استفاده کنیم. به این صورت که یک پیکره (مثلا ویکی‌پدیا) در نظر میگیریم و میگیم چندبار “علی به مدرسه رفت” در این پیکره آمده و چندبار “علی به مدرسه” تکرار شده است و سپس نسبت این تعداد را به هم حساب میکنیم:

Count(علی به مدرسه رفت)/Count (علی به مدرسه)

و به این ترتیبی عددی که ما میدهد تخمینی از محتمل بودن جمله‌ی “علی به مدرسه رفت” میدهد. در حالی که روش بالا شاید در بسیاری از جاها خوب کار کنه ولی یک سوالی که پیش میاد این است که خیلی از جملات ممکن است در پیکره ما وجود نداشته باشند یا به عبارت دیگر پیکره ما اونقدری بزرگ نباشد که تمام این حالت‌های مختلف جمله را دربربگیرد ( یا به قولی we are creative in language generation). برای همین روش هوشمندانه‌تری رو در پردازش زبان طبیعی به کار میگیرند تا این احتمالات رو حساب کنند.

برای اینکه احتمال یک جمله به طول n رو حساب کنن از chain rule استفاده میکنند. به عنوان مثال برای محاسبه یک جلمه n خواهیم داشت:
که در واقع این معادله میگه برای محاسبه جمله “علی به مدرسه رفت” شما بیا جمله اتو بشکون به احتمالات کوچکتر و سپس اونها رو حساب کن. یعنی بیا احتمالات زیر رو حساب کن:

P(علی)* P(علی|به)* P(علی به | مدرسه) * P(علی به مدرسه|رفت)

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

P(علی به مدرسه|رفت)

حساب کنی بیا احتمال

P(مدرسه|رفت)

رو حساب کن. واضح است که محاسبه این احتمال خیلی راحت‌تر از قبل است و از طرفی یک تقریب نسبتا خوب برای حدس زدن کلمه رفت میدهد. به طور رسمی تر میان:

این فرضیه که میگه برای محاسبه احتمال یک کلمه تنها به یک (گاهی اوقات چندتا) کلمه قبلش وابسته است و نه تمام کلمات قبلش اصطاحا فرضیه مارکوف گفته میشود. در مثال بالا احتمال کلمه رفت تنها به کلمه مدرسه وابسته است (تنها یک کلمه قبلش) که به این حالت خاص اصلاحا bigram یا دوتایی اطلاق میشود. میتوانیم اندکی مدل را بهتر کنیم و بگیم برای حدس هر کلمه به ۲تا کلمه قبلش وابسته باشه (trigram) و بنویسیم:

P(به مدرسه|رفت)


 

تا به اینجا آمدیم احتمال رو ساده کردیم ولی اینکه چگونه احتمال رو تقریب بزنیم صحبتی نکردیم. برای اینکه بخواهیم احتمال دوتایی (bigram) رو حساب کنیم میتونیم بگیم:

که در واقع به این معناست که تعداد کل “مدرسه رفت” رو حساب کن و یکبار هم تعداد “مدرسه” رو حساب کن و اونوقت این دوتارو به هم تقسیم کن:

P(مدرسه|رفت) = Count (مدرسه رفت) / Count (مدرسه)

با همین تکنیک میتونیم احتمال عبارت‌های طولانی‌تر رو حساب کنیم به عنوان مثال با فرض داشتن احتمالات bigram برای جمله I want english food به صورت زیر (<s> توکن شروع)‌:


میتونیم احتمال جمله رو به صورت زیر حساب کنیم:


اگر دقت کرده باشید در احتمال بالا ( I want english food) اگر یکی از احتمالات صفر بشه کل احتمال صفر خواهد شد که برای رفع این مشکل از تکنیکی به نام هموارسازی یا smoothing استفاده میشود. تکنیک هموارسازی مفصل بوده و در اینجا به آن نمیپردازیم ولی به طور خلاصه میتوان گفت این تکنیک از صفر شدن احتمالات (بخاطر کلماتی که در هنگام ساخت مدل وجود نداشته‌اند) جلوگیری میکند.

برای مطالعه بیشتر میتونید به فصل چهارم کتاب آقای جورافسکی در اینجا مراجعه کنید.

منتشر شده در پردازش زبان طبیعی

اولین باشید که نظر می دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *