بازیابی پاسخ

تغییرات پروژه از تاریخ 1394/04/10 تا حالا
**بسم الله الرحمن الرحیم**

# مقدمه
امروزه فضای وب امکانات زیادی را برای یافتن پاسخ پرسش های گوناگون کاربران در زمینه های مختلف فراهم کرده . یکی از روش های کارآمد و پرطرفدار ، استفاده از سایت های پرسش و پاسخ است ؛ بدین صورت که کاربر سوال موردنظر خود را مطرح کرده و بقیه افراد می توانند به آن پاسخ دهند . همچنین کاربر می تواند جواب سوال خود را از میان سوال و جواب هایی که در گذشته مطرح شده اند به دست بیاورد .از  نمونه‌های بسیار موفق این نوع سایت‌ها [stack overflow](http://stackoverflow.com) می‌باشد.    
![سایت های پرسش و پاسخ ](http://www.best-upload.ir/upload/r0qa9g2az27pysrmb40.png)


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

# کارهای مرتبط

در تمام روش هایی که در زیر به آنها اشاره شده است ، بایستی ابتدا  سوال کاربر و همچنین مجموعه سوال ها و پاسخ ها به صورت قابل استفاده ای ذخیره شوند ؛ بدین منظور ابتدا هر سوال یا جواب را به صورت مجموعه ای از کلمات در می آوریم و سپس کلمات توقف (stop word) را از بین آنها حذف کرده و با استفاده از تابع porter stemmer به جای هر کلمه ، ریشه ی آن را قرار می دهیم . در نتیجه به ازای هر سوال مطرح شده از طرف کاربر و همچنین هر سوال یا جواب در  پایگاه داده  ، مجموعه ای از ریشه های کلمات موجود در آنها را در اختیار داریم .

امروزه متداول ترین روش هایی که برای بازیابی پاسخ ( Q&A retrieval) وجود دارد ، براساس   [Bag-of-words_model](http://en.wikipedia.org/wiki/Bag-of-words_model)) BOW)  می باشد . BOW مدل ساده ای است که در پردازش زبان های طبیعی و بازیابی اطلاعات به کار می رود . در این مدل به متن به صورت کیسه ای پر از کلمات نگاه می شود ، بدون توجه به دستور زبان و یا ترتیب کلمات ، اما تعداد دفعات تکرار هر کلمه ( فرکانس ) حائز اهمیت است . 
از جمله مدل های از جنس BOW  که در مساله بازیابی پاسخ به کار می روند دو مدل مختلف بازیابی از طریق وزن دهی الفاظ ، tf-idf  و BM25 می باشند که در ادامه به اختصار توضیح داده خواهند شد .


+ **روش  term frequency-inverse document frequency)[tf-idf](http://en.wikipedia.org/wiki/Tf%E2%80%93idf))**

در این روش ، Tf-idf  در واقع یک آمار عددی است که نشان می دهد  هر کلمه موجود در یک سند  ، در میان مجموعه ای از اسناد چه قدر اهمیت دارد . این مقدار معمولا به عنوان فاکتور وزنی در بازیابی اطلاعات به کار می رود . 

مقدارtf  در ساده ترین حالت نشان دهنده ی فرکانس خام یک کلمه(t) در یک سند(d) است (تعداد دفعات رخداد کلمه در سند ). 
$$ tf(t,d)=0.5+\frac { 0.5\quad \times \quad f(t,d) }{ max\{ f(w,d)\quad :\quad w\in d\}  }   $$  

مقدار idf نیز نشان دهنده این است که چه مقدار اطلاعات درباره یک سند(D) ،توسط یک کلمه فراهم می شود یعنی کلمه در سند بارها تکرار شده یا به ندرت .(N تعداد اسناد را نشان می دهد .)
$$idf(t,D)=\log { \frac { N }{ \left| d\in D\quad :\quad t\in d \right|  }  } $$ 

حاصلضرب این دو مقدار معیاری فراهم می کند که میزان اهمیت یک کلمه (وزن هر کلمه) را مشخص می کند .
$$tfidf(t,d,D)=tf(t,d)\times idf(t,D)$$

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


+ **روش Best Match)  [BM25](http://en.wikipedia.org/wiki/Okapi_BM25))**

روش BM25 یک نیز الگوی وزنی است که در واقع از همان tf-idf مشتق شده و فقط فرمول متفاوتی دارد ، روند کلی حل مساله همانند روش قبلی است  . فرمول آن برای امتیاز یک کلمه در یک سند صورت زیر است .
$$ score(D,Q)=\sum _{ i=1 }^{ n }{ idf({ q }_{ i })\cdot \frac { f({ q }_{ i },D)\cdot ({ k }_{ 1 }+1) }{ f({ q }_{ i },D)\quad +\quad { k }_{ 1 }.(1-b+b.\frac { \left| D \right|  }{ avgdl } ) }  } $$  
 
  در اکثر موارد (بدون بهینه سازی های خاص):
$$b=0.75$$  
$${ k }_{ 1 }\in \left\{ 1.2,2 \right\}  $$ 


+ روش دیگری که برای بازیابی پاسخ بررسی شده [3] شبیه روش های BOW می باشد اما تا حدودی بهبود یافته تر می باشد . در این روش ابتدا هر سوال (چه کوئری چه سوال های موجود در پایگاه داده ) تحلیل می شود به طوری که سه مساله در مورد آن مشخص شود :
     نوع جواب : مکان ، تاریخ و ...       
     تمرکز سوال : کلمه ای که معمولا در نزدیکی لفظ استفهامی (چرا ، چگونه و ...) قرار می گیرد .     
     موجودیت های نامدار : نام مکان ها ، افراد و ...
 پس از مشخص کردن این سه مورد درباره ی هر سوال نوبت به بازیابی اطلاعات (پاسخ) می رسد . در این مرحله برای هر سوال موجود در آرشیو یک امتیاز محاسبه می شود (با در نظر گرفتن مشخصات سوال مطرح شده و سوال آرشیو شده) . این امتیاز (فاکتور وزنی) با اختصاص یک ضریب به هر یک از سه مشخصه ،با توجه به میزان اهمیت هر کدام ، محاسبه می شود . ضریب 2 برای موجودیت های نامدار و ضریب 1 برای تمرکز و نوع .


در سه روش ای که در بالا به آنها اشاره شد ، به هر کلمه به صورت جداگانه نگاه می شود . از آنجایی که کاربران اکثرا سوال های کوتاهی مطرح می کنند ، تعداد کمی کلمه برای پیدا کردن سوال مناسب در اختیار سیستم قرار می گیرد که باعث می شود در اکثر موارد جواب های کافی و درست  ارائه نشوند . توسط این مدل ها رخداد همزمان کلمات (word co-occurance) ( یعنی دو یا چند کلمه که معنای یکسانی دارند اما از لحاظ ظاهری متفاوتند ) یا  زمینه اطلاعاتی به اشتراک گذاشته شده (context shared info) مناسبی برای اندازه گیری تشابه به صورت کارامد ارائه نمی شود . به همین دلیل برای بازیابی پاسخ مناسب نیستند .برای حل این محدودیت ها از مدل های ترجمه (translation model)  استفاده می شود تا ارتباطات معنایی کلمات و عبارات به دست بیاید . در زیر توضیح مختصری از برخی از این نوع روش ها  داده می شود  .


+ در یکی از روش ها [4] ، از ویکی پدیا (wikipedia) به عنوان مجموعه دانش جهانی برای حل مساله بازیابی پاسخ استفاده می شود . به دلیل ویژگی هایی از قبیل : پوشش دادن مفاهیم به طور گسترده ، اطلاعات معنایی غنی و مضامین به روز . آنچه در این روش بررسی می شود فقط تشابه سوال کاربر به سوالهای آرشیو است و در مورد پاسخ ها کاری انجام نمی شود .

این روش دو مرحله اصلی دارد  :
1. ساختن یک مجموعه اطلاعاتی بر پایه ی روابط معنایی استخراج شده از ویکی پدیا :
در این مرحله مجموعه ی اطلاعاتی قابل استفاده و ساده ای ساخته می شود که ارتباط مفاهیم ، بر پایه دانش ساختاری ویکی پدیا  از طریق آن به دست میاد . مواردی  از جمله ترادف(synonymy) ، تعدد معانی (polysemy) ،اشتقاق (hypernymy) و شرکت پذیری (associative relation) در این مجموعه لحاظ می شوند . یعنی این مجموعه به ازای هر کلمه ، تعدادی کلمه مرتبط را در نظر می گیرد (به جای اینکه فقط همان کلمه معیار پیدا کردن سوال های کاندیدا باشد) .
به عنوان مثال :
کلمه ی به کار رفته در کوئری :"big"
کلمات مرتبط به کار رفته در سوالها : "large , size ,huge "

2 . استفاده مفید از مجموعه ساخته شده برای بازیابی پاسخ
در این مرحله بایستی سوال کاربر و همچنین مجموعه سوال ها و پاسخ ها به صورت قابل استفاده ذخیره شوند تا به ازای هر سوال ، ریشه های کلمات آن را در اختیار داشته باشیم (در ابتدای روش ها توضیح داده شد).

برای به دست آوردن امتیاز نهایی برای هر سوال از پیش مطرح شده (d) برای سوال کاربر (q) از فرمول زیر استفاده می کنیم:
$$Score(q,d)=\alpha { S }_{ cate }(q,d)+\beta { S }_{ sac }(q,d)+\gamma { S }_{ term }(q,d) $$   
$$ \alpha +\beta +\gamma =1$$
این فرمول شامل سه قسمت است که هر کدام به اختصار توضیح داده خواهد شد .

برای به دست آوردن${ S }_{ term }(q,d) $  با استفاده از روش tf-idf به ازای هر کوئری و هر سوال موجود در آرشیو یک بردار درست می کنیم و با تابع زیر که معیاری برای اندازه گیری شباهت دو بردار است ، مقادیر را به ازای هر کوئری و هر سوال به دست می آوریم   :
$${ S }_{ term }(q,d)=\frac { \left< q,d \right>  }{ { \left\| q \right\|  }^{ 2 }.{ \left\| d \right\|  }^{ 2 } }  $$

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

برای محاسبه  ${ S }_{ cate }(q,d) $ بایستی این مساله را درنظر بگیریم که مجموعه اطلاعاتی ساخته شده از روی ویکی پدیا به صورت یک گراف غیر حلقه ای است که هر مفهوم موردنظر ما به یک یا چند سطح از این گراف مربوط می شود ، یعنی ممکن است در چند سطح مفاهیم مرتبط با آن موجود باشند .(سطوح پایین تر که به مفهوم موردنظر نزدیک ترند ، موثرتر می باشند .) هر مفهوم مرتبط به مفهوم c به صورت ${ cate}_{ c}(q,d)$ مشخص می شود .
$$ \begin{matrix} { S }_{ cate }(q,d)=\frac { \left< { Cate }_{ q },{ Cate }_{ d } \right>  }{ { \left\| { Cate }_{ q } \right\|  }^{ 2 }.{ \left\| { Cate }_{ d } \right\|  }^{ 2 } }  \end{matrix}$$

برای قسمت آخر نیز بایستی ${ S }_{ sac}(q,d) $ محاسبه شود . که مربوط به مترادف ها و مفاهیم شرکت پذیر می باشد که کمک می کنند تا مفاهیم مرتبط بیشتری شامل شوند (بر پراکندگی داده غلبه می شود ) .
$$\begin{matrix} { S }_{ sac }(q,d)=\frac { \left< { Sac }_{ q },{ Sac }_{ d } \right>  }{ { \left\| { Sac }_{ q } \right\|  }^{ 2 }.{ \left\| { Sac }_{ d } \right\|  }^{ 2 } }  \end{matrix}$$


+ روش دیگری که در این زمینه بررسی شده است [1]  و [2] ، به شرح زیر است .در این روش با استفاده از مجموعه داده ای (dataset) که شامل جفت های سوال و جواب می باشد ، سه مجموعه از کلمات به صورت زیر ایجاد می شود :
$$ Q=\{ (q_{ 1 },{ a }_{ 1 }),({ q }_{ 2 },{ a }_{ 2 }),...\} $$   
$$ Q=\{ q_{ 1\quad  },{ q }_{ 2\quad  },...\}  $$   
$$A=\{ a_{ 1\quad  },{ a }_{ 2\quad  },...\}  $$ 

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

توجه : (به دلیل پیچیده بودن فرمول ها و نیاز به توضیح در مورد عناصر به کار رفته در آنها ، از آوردنشان در بخش های بعدی خودداری می کنیم  . در صورت تمایل به مقاله [1] یا [2] مراجعه کنید ).

برای بخش سوال : از ترکیب IBM Model 1 و مدل زبانی احتمالات کوئری(query liklihood language model) ، استفاده شده و فرمولی بهینه به دست می آید.

برای بخش جواب : از مدل زبانی احتمالات کوئری استفاده می شود .

مورد دیگری که در این مقاله روی آن کار شده است ، یادگیری احتمالات ترجمه کلمه به کلمه است . یعنی سوال را به عنوان یک زبان و جواب را به عنوان یک زبان دیگر در نظر گرفته و سعی می شود ترجمه ای از طرف سوال در طرف جواب پیدا شود و یادگیری صورت بگیرد . به عنوان مثال زمانی که در طرف سوال کلمه ی "Everst"  می آید در طرف دیگر (به عنوان ترجمه )  می توان احتمال مشاهده ی کلمات "highest" ، "mountain " و یا ... را داشت .


# روش پیشنهادی

روشی که برای  حل این مساله انتخاب شده است ، روش tf-idf می باشد [7] که به اختصار در بخش کارهای مرتبط توضیح داده شد . از آنجایی که این روش برای حل مساله بازیابی پاسخ به اندازه ی کافی کارآمد نیست ، برای بهبود نتایج به دست آمده از روش tf-idf ، از تکنیک های query expansion و stemming نیز استفاده می کنیم که در ادامه بررسی خواهند شد . 

اولین کاری که بایستی انجام شود ، تبدیل فایل متنی موجود (dataset) به مجموعه ای قابل استفاده می باشد ؛ بنابراین بایستی هر سوال ابتدا به صورت کلمات جدا از هم دربیاید (tokenizing) و سپس چند کار روی این مجموعه کلمات صورت بگیرد : حذف علامت ها ، حذف کلمات توقف و ریشه یابی 

حال به ازای هر سوال لیستی از token ها وجود دارد .

در مرحله ی بعدی بایستی به ازای هر token در لیست هر سوال ، دو مقدار tf و idf محاسبه شود :


$$ tf(t,d)=0.5+\frac { 0.5\quad \times \quad f(t,d) }{ max\{ f(w,d)\quad :\quad w\in d\}  }   $$


مقدار t نشان دهنده ی یک توکن در لیست سوال d  است  و $ tf(t,d)$  فرکانس (تعداد دفعات تکرار)  t در d  و مخرج نیز فرکانس توکنی است که بیشتر از همه تکرار شده.


$$idf(t,D)=\log { \frac { N }{ \left| d\in D\quad :\quad t\in d \right|  }  } $$  


مقدار t یک توکن در لیست سوال D می باشد . N نشان دهنده ی تعداد کل سوال ها است و مخرج نشان دهنده ی تعداد سوال هایی که t  در آنها آمده .


$$tfidf(t,d,D)=tf(t,d)\times idf(t,D)$$


حاصلضرب این دو مقدار به ازای هر توکن در هر سوال ، یک وزن را به آن توکن تخصیص می دهد .

گامهای بالا بایستی برای سوال مطرح شده توسط کاربر نیز انجام شود .

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

برای بررسی میزان شباهت میان سوال مطرح شده از طرف کاربر و  سوال های موجود در آرشیو از مدل فضای برداری ( vector space model) استفاده می شود (  [مرجع این بخش ](http://uplod.ir/xeomu32f5o8b/059_20-IR.pdf.htm) ). در این مدل ، بردارهایی که به ازای هر سوال به دست آمده اند در فضا با یکدیگر زاویه دارند ؛ هر چه این زاویه کوچکتر باشد ، سوال ها بیشتر به هم مرتبط اند . برای بررسی زاویه بین بردارها از رابطه ی مشابهت کسینوسی استفاده می کنیم :


$$sim({ q }_{ i },{ d }_{ j })\quad =\quad \frac { \vec { { q }_{ i } } \cdot \vec { { d }_{ j } }  }{ \left| \vec { { q }_{ i } }  \right| \times \left| \vec { { d }_{ j } }  \right|  } \quad =\quad \frac { \sum _{ k=1 }^{ t }{ { W }_{ ki }\quad \times { \quad W }_{ kj } }  }{ \sqrt { \sum _{ k=1 }^{ t }{ { { W }_{ ki } }^{ 2 } }  } \cdot \sqrt { \sum _{ k=1 }^{ t }{ { { W }_{ kj } }^{ 2 } }  }  }  $$


در رابطه ی بالا ، ${ q }_{ i }$ بردار پرسش کاربر ،  ${ d}_{ i }$ بردار پرسش موجود در آرشیو ، ${ \quad W }_{ ki } $ وزن کلمه ی k ام در پرسش کاربر  و  ${ \quad W }_{ kj } $ وزن کلمه ی k ام در سوال  ${ d}_{ j }$ است .

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

همان طور که در ابتدا گفته شد ، برای بهبود روش  tf-idf از دو تکنیک استفاده می کنیم [6]:


1. ریشه یابی (stemming) در مرحله ی ذخیره سازی : در این تکینک به جای توکن ها ، ریشه ی آنها ذخیره می شود . این روش باعث می شود کارایی سیستم بالاتر برود . برای روشن تر شدن موضوع به مثال زیر توجه کنید :

اگر کلمات cook ، cooking ، cooked ، cooker و ... در سوال های مختلفی آمده باشند و به همین صورت به عنوان توکن ذخیره شوند ، هنگامی که سوال کاربر حاوی کلمه ی cooking باشد ، فقط سوالی به عنوان سوال مشابه بازگردانده می شود که حاوی کلمه ی cooking باشد . در حالی که بقیه سوال هایی که حالتی از کلمه ی cook را شامل می شوند نیز بایستی به عنوان سوال مشابه به کاربر نشان داده شوند .
بنابراین به جای تمام کلمات بالا ، ریشه ی آنها ،cook ، ذخیره خواهد شد .

در این پروژه برای ریشه یابی از  porterstemmer2  که جزو کتابخانه های python  می باشد استفاده شده است .


2.  گسترش کوئری (query expansion)  در مرحله ی بازیابی : از آنجایی که سوال های مطرح شده توسط کاربران معمولا کوتاه هستند ، اطلاعات زیادی در اختیار سیستم قرار نمی دهند . برای بهبود این مشکل می توان از تکینک query expansion استفاده کرد . به این صورت که پس از توکنایز کردن سوال کاربر ، به ازای هر کلمه کلمات مرتبط با آن نیز در نظر گرفته می شوند از جمله مترادف های هر کلمه . 
به عنوان مثال اگر کلمه ی "small"  در سوال کاربر موجود باشد ، کلمات "little" , "tiny" , "atomic" , " minute" و ... نیز برای جستجو در نظر گرفته خواهند شد . 

در این پروژه برای گسترش کوئری از  wordnet که جزئی از کتابخانه ی nltk در python می باشد استفاده شده است .
 

#آزمایش و نتایج

[پیاده سازی  پروژه در گیت هاب ](https://gist.github.com/ameripour71/5e28f609e3d142128e76)

مجموعه داده (dataset) ای که در این پروژه از بخشی از آن استفاده می کنیم را می توانید در قسمت لینک های مرتبط مشاهده کنید . مجموعه داده مورد استفاده ، یک فایل متنی است که در هر خط آن یک سوال به همراه جواب ، عنوان مقاله ، سختی از جانب سوال کننده  و ... می باشد که در این مساله فقط از قسمت سوال و جواب آن استفاده می شود . بخش های هر خط ، بوسیله ی یک tab از هم جدا شده اند تا خواندن از روی فایل به راحتی صورت بگیرد . قسمتی از مجموعه داده در عکس زیر نمایش داده شده است .

![قسمتی از مجموعه داده ی مورد استفاده ](https://boute.s3.amazonaws.com/156-1_2.png)

دو نمونه خروجی برنامه :
کاربر با وارد کردن سوال و تعداد جواب های برتری که می خواهد ببیند ، خروجی را به صورت جفت های سوال و پاسخ مشاهده می کند .

![نمونه خروجی برنامه (1)](https://boute.s3.amazonaws.com/156-p1.png)


![نمونه خروجی برنامه (2)](https://boute.s3.amazonaws.com/156-p2.png)


همانطور که در بخش کارهای مرتبط توضیح داده شد ، روش tf-idf برای حل این مساله کارایی نسبتا کمی دارد . بنابراین جواب های بازگردانده شده ممکن است خیلی مطلوب نباشند . این عدم مطلوبیت تا حدودی بوسیله دو تکنیک معرفی شده (stemming & query expansion) کاسته شده است اما هنوز هم نمی توان با این روش بهینه ترین جواب را برای مساله پیدا کرد . 



# بهبود نتایج

روشی که برای بهبود نتایج به دست آمده مد نظر می باشد ، استفاده از ابزار ++giza  می باشد که به نوعی از روش مبتنی بر ترجمه استفاده می کند . 

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

نرم افزار giza-pp  ، تعمیمی از برنامه ی giza  است که می توان تحت آن پروژه های نیازمند به مدل های ماشین ترجمه را پیاده کرد . این نرم افزار تحت سیستم عامل  linux (به عنوان مثال ubuntu) کار می کند .

نحوه ی کار giza-pp به صورت زیر می باشد :[[مرجع](http://stackoverflow.com/questions/5752043/is-there-a-tutorial-about-giza/23838428#23838428)]

1 . دو فایل متنی به  دو زبان مختلف (به عنوان مثال انگلیسی و فرانسه )  در اختیار داریم که شامل جملات موازی می باشند (به ترتیب ترجمه ی هر جمله ی انگلیسی در فایل اول به فرانسه در فایل دوم موجود است . ) 

train.en (TEXT1) 		
		I gave him the book .  		
		He read the book .  		
		He loved the book .  
		
train.fr (TEXT2)
		Je lui ai donne/ le livre . 		
		Il a lu le livre . 		
		Il aimait le livre .

2 . با وارد کردن دستور plain2snt.out TEXT1 TEXT2/.  در دایرکتوری ++GIZA   ،  برای دو زبان مبدا ( انگلیسی ) و مقصد ( فرانسه ) ، دو سری فایل  vcb) vocabulary.)  و snt) sentence pair.)  تولید می شود .

TEXT1toTEXT2.snt
TEXT1.vcb
TEXT2toTEXT1.snt
TEXT2.vcb

فایل های vcb. شامل یک ID منحصر به فرد به ازای هر کلمه در متن هستند .  در هر خط کلمه و ID آن با یک فاصله.

فایل های snt. شامل یک سری شماره هستند . به این صورت که به ازای هر جفت جمله سه خط موجود است ؛ 
1)تعداد دفعاتی که جفت جمله  در مجموعه دانش تکرار شده 
2) رشته ی شماره های مربوط به هر ترم  جمله ی مبدا ( در TEXT1toTEXT2  ، مبدا TEXT1 است ) که با فاصله جدا شده اند .( با توجه به فایل vcb.) 
3) رشته ی شماره های مربوط به هر ترم  جمله ی مقصد که با فاصله جدا شده اند .( با توجه به فایل vcb.) 



3 . حال با داشتن چهار فایل تولید شده در مرحله ی قبل می توان آنها را به عنوان ورودی به ++GIZA داد تا یک هم ترازی (alignment) به دست بیاید .

./GIZA++ -s TEXT1.vcb -t TEXT2.vcb -c TEXT1_TEXT2.snt


برای پروژه ی بازیابی پاسخ ، به جای فایل متنی مبدا و مقصد ، فایل متنی حاوی سوال و جواب را در اختیار داریم . با کمک این دو فایل و انجام مراحل بالا ، می توان کلمات مرتبط را استخراج نمود (به عنوان مثال وقتی در سوال Everest داریم معمولا در جواب highest  یا mountain را مشاهده می کنیم ) و به نوعی مدل ترجمه دست پیدا کرد .

با داشتن این مدل ترجمه و ادغام آن با روش های دیگر می توان مساله بازیابی پاسخ را حل نمود . مدل ترجمه کمک می کند تا به ازای هر سوال ، یک بردار به دست بیاوریم و به ازای کوئری هم یک بردار ، سپس با مقایسه این بردارها(همانند آنچه در tf-idf انجام شد) می توان میزان شباهت بین سوال کاربر و سوالات موجود در آرشیو را به دست آورده و مرتبط ترین سوال ها را ( به همراه جوابشان ) به کاربر باز گرداند.

#کارهای آینده

می توان برای بهبود روش پیشنهادی مطرح شده ( tf-idf به همراه query expansion ) ، مواردی دیگری نیز به آن اضافه نمود :

+ از آن جایی که ممکن است کاربر در هنگام تایپ  اشتباه کند و غلط املایی بوجود بیاید ، برای بهبود کارایی بهتر است قسمت تصحیح غلط املایی (برای سوال مطرح شده توسط کاربر) نیز به این روش اضافه شود  . بدین صورت که بعد از اینکه کاربر سوال خود را مطرح کرد ، سیستم متن وارد شده را از نظر املایی بررسی کند و  آن را به صورت اصلاح شده به کاربر پیشنهاد کند ( مشابه آنچه در هنگام جستجو توسط گوگل انجام می شود .) . [[مرجع](https://en.wikipedia.org/wiki/Query_expansion)]



+ بهتر است به کلماتی که برای گسترش یک کلمه از کوئری در نظر گرفته می شوند و خود کلمه ، وزن های متفاوتی اختصاص داده شود . به عنوان مثال خود کلمه ، نسبت به مترادف هایش وزن بیشتری داشته باشد .[6]



+ می توان برای گسترش کلمه ، از نوعی یادگیری (learning) استفاده کرد به این صورت که ابتدا تعدادی سوال مرتبط با هم موجود باشد و به کمک یادگیری کلمات مرتبط با هم پیدا شوند و در هنگام گسترش دادن کوئری از آنها استفاده شود . به عنوان مثال کلماتی که معمولا با هم رخ می دهند ( Everest , mountain )[ [مرجع](http://www.hindawi.com/journals/tswj/2014/132158/)]
 


 
همان طور که در قسمت " کارهای مرتبط " گفته شد ، روشهایی نظیر tf-idf کارایی بالایی ندارند و بهتر است از روشهای مبتنی بر مدل ترجمه برای حل این مساله استفاده نمود (چند روش مبتنی بر ترجمه در قسمت کارهای مرتبط معرفی شدند که هر سه تا حد قابل قبولی کارا می باشند . )


این پروژه بر روی زبان انگلیسی کار می کند . یکی از کارهای آینده پیاده کردن آن برای زبان فارسی می باشد .

  
# مراجع

1.  Jeon, Jiwoon. Searching question and answer archives. ProQuest, 2007.
2.  Xue, Xiaobing, Jiwoon Jeon, and W. Bruce Croft.  "Retrieval models for question and answer archives." Proceedings of the  31st annual international ACM SIGIR conference on Research and  development in information retrieval. ACM, 2008.
3.  Rodrigo, Álvaro, et al. "A Question Answering System  based on Information Retrieval and Validation." CLEF (Notebook  Papers/LABs/Workshops). 2010.
4. Guangyou Zhou, Yang Liu, Fang Liu, Daojian Zeng, and Jun Zhao. "Improving Question Retrieval in Community Question Answering Using World Knowledge."Proceedings of the Twenty-Third International Joint Conference on Artificial Intelligence
5. P.F.Brown,V.J. D.Pietra, S.A.D.Pietra, and R. L. Mercer. The mathematics of statistical machine translation: parameter estimation.Computational Linguistics, 19(2):263–311, 1993.
6. Matthew W. Bilotti, Boris Katz, and Jimmy Lin .Computer Science and Artificial Intelligence Laboratory Massachusetts Institute of Technology Cambridge, Massachusetts, USA.What Works Better for Question Answering: Stemming or Morphological Query Expansion?-In Proceedings of the Information Retrieval for Question Answering (IR4QA) Workshop at SIGIR 2004, July 2004, Sheffield, England
7. Information Retrieval , Implementing and Evaluating Search Engines - Stefan Buttcher , Charles L.A. Clarke , Gordon V. Cormack

#لینک‌های مفید
+ [پیاده سازی پروژه در گیت هاب ](https://gist.github.com/ameripour71/5e28f609e3d142128e76)
+ [پردازش زبان فارسی در پایتون](http://sobhe.ir/hazm/)
+ [مقدمه ای بر ذخیره و بازیابی اطلاعات متون زبان فارسی ](http://uplod.ir/xeomu32f5o8b/059_20-IR.pdf.htm)
+ [Question-Answer dataset](http://www.ark.cs.cmu.edu/QA-data/)
+ [tf-idf](http://en.wikipedia.org/wiki/Tf%E2%80%93idf)
+ [Bag-of-words_model](http://en.wikipedia.org/wiki/Bag-of-words_model)
+  [BM25](http://en.wikipedia.org/wiki/Okapi_BM25)
+  [Query Expansion](http://en.wikipedia.org/wiki/Query_expansion)
+ [TF-IDF useful link!](http://www.tfidf.com)
+ [ GIZA++  source code](https://github.com/moses-smt/giza-pp)
+ [ how does GIZA++ work?! ](http://stackoverflow.com/questions/5752043/is-there-a-tutorial-about-giza/23838428#23838428)