۱. مقدمه

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

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

فرض کنید فرهنگ لغتی داریم با N کلمه و لغت که به ترتیب الفبایی مرتب شده اند و هر لغت یک مکان
مشخص در این فرهنگ لغت دارد. حال برای نمایش هر کلمه، برداری در نظر میگیریم با
طول N که هر خانه آن، متناظر با یک لغت در فرهنگ لغت ماست که برای راحتی کار فرض می کنیم شماره آن خانه بردار،
همان اندیس لغت مربوطه در این فرهنگ لغت خواهد بود . با این پیش فرض، برای هر لغت ما یک بردار به طول N داریم که همه خانه های آن بجز خانه متناظر با آن لغت صفر خواهد بود. در خود ستون متناظر با لغت عدد یک ذخیره خواهد شد.(One-Hot encoding) با این رهیافت، هر متن یا سند را هم میتوان با یک بردار نشان داد که به ازای هر کلمه و لغتی که در آن به کار رفته است ،
ستون مربوطه از این بردار برابر تعداد تکرار آن لغت خواهد بود و تمام ستون های دیگر که نمایانگر لغاتی از فرهنگ لغت هستند که در این متن به کار نرفته اند، برابر
صفر خواهد بود .
به این روش نمایش متون، صندوقچه کلمات یا Bag Of Words می گوییم که بیانگر این است که برای هر لغت در صندوقچه یا بردار ما، مکانی درنظر گرفته شده است . Bag of word model یک نمایش ساده است که در پردازش زبان طبیعی و بازیابی اطلاعات مورد استفاده قرار میگیرد .
در این مدل یک متن ( یک جمله یا یک سند ) نشان دهنده ی کیفی (چند مجموعه ای ) از کلمه هایش بدون در نظر گرفتن نکات گرامر و جفت های مرتب کلمه به استثناء تکرارات آنها میباشد.
یک مثال ساده در این زمینه :
(1) John likes to watch movies. Mary likes movies too.
(2) John also likes to watch football games.
که bag of word این دو جمله مجموعه(به اصطلاح بردار ) زیر میشود :
["John","likes","to","watch","movies","Mary","too","also","football","games"]
سپس تعداد تکرار هر کلمه از مجموعه خود را به ازای هر جمله همانند زیر مینویسیم :
(1) [1, 2, 1, 1, 2, 1, 1, 0, 0, 0]
(2) [1, 1, 1, 1, 0, 0, 0, 1, 1, 1]
با یک مثال دیگر این مفهوم را بیشتر توضیح می دهیم . فرض کنید که دو جمله زیر را داریم :
Sentence 1: “The cat sat on the hat”
Sentence 2: “The dog ate the cat and the hat”
برای این دو جمله فرهنگ لغت ما عبارت خواهد بود از : { the, cat, sat, on, hat, dog, ate, and }
و نمایش صندوقچه کلمات این دو جمله طبق توضیح از قرار زیر است :
Sentence 1: { 2, 1, 1, 1, 1, 0, 0, 0 }
Sentence 2 are: { 3, 1, 0, 0, 1, 1, 1,1}
با این روش ما دو بردار عددی داریم که حال می توانیم از این دو در الگوریتم های عددی خود استفاده کنیم. با وجود سادگی این روش ، اما معایب بزرگی این بر آن مترتب است. مثلاً اگر فرهنگ لغت ما صد هزار لغت داشته باشد ، به ازای هر متن ما باید برداری صد هزارتایی ذخیره کنیم که هم نیاز به فضای ذخیره
سازی زیادی خواهیم داشت و هم پیچیدگی الگوریتم ها و زمان اجرای آنها را بسیار بالامی برد .
از طرف دیگر در این نحوه مدلسازی ما فقط کلمات و تکرار آنها برای ما مهم بوده است و ترتیب کلمات یا زمینه متن (اقتصادی ، علمی ، سیاسی و …) تاثیری در مدل ما نخواهدداشت .
روشی دیگر که توسط گوگل در سال ۲۰۱۳ پیشنهاد شده است و روشی بسیار کارآمد و مناسب برای نمایش لغات و متون و پردازش آنها است روش Word2Vec است که هدف ما هم آشنایی اولیه با این روش قدرتمند، نمایش برداری کلمات است که می تواند در بسیاری از کاربردهای نوین پردازش متن مانند سنجش
احساسات، جستجوی متون مشابه یا پیشنهاد اخبار یا کالای مشابه استفاده شود. در این روش به کمک شبکه عصبی یک بردار با اندازه کوچک و ثابت برای نمایش تمام لغات و متون در نظرگرفته شده و با اعداد مناسب در فاز آموزش مدل یا training برای هر لغت این بردار محاسبه می شود. در این بردار هر ستون ، نمایشگر کلمه یا ویژگی خاصی نیست و فقط یک عدد را نمایش می دهد. اگر این بردار را ۴۰۰ تایی فرض کنید، یک فضای ۴۰۰ بعدی خواهیم داشت که هر لغت در این فضا یک نمایش منحصر بفرد خواهد داشت. برای افزایش دقت این روش، مجموعه داده اولیه که برای آموزش مدل مورد نیاز است، باید حدود چند میلیارد لغت را که درون چندین میلیون سند یا متن به کار رفته اند، در برگیرد. بعد از ایجاد بردارهای مرتبط با هر لغت، برای نمایش برداری هر متن یا خبر ، می توان بردار تک تک کلمات به کار رفته در آنرا یافته و میانگین اعداد هر ستون را به دست آورد که نتیجه آن یک بردار برای هر متن یا سند خواهد بود.

سرعت این آموزش هم بسیار بالاست و در عرض چند ساعت و یاچند دقیقه (بسته به این که از کدام یک از دو الگوریتم آموزش آن استفاده کنیم) می
توان حجم عظیمی از داده ها را به این الگوریتم داد و بردارهای لغات را ایجاد کرد. نمونه ای از مقایسه این الگوریتم با دو رهیافت مختلف آن که در ادامه توضیح داده می شود، از لحاظ حجم داده ها (B برای میلیارد و M برای میلیون)، زمان لازم برای ایجاد بردارها، دقت و ابعاد بردارها در زیر آورده شده است. در این جدول، روش Word2Vec (با دو الگوریتم ایجاد بردار CBOW و Skip-gram) با روشهای مدلسازی زبان با شبکه عصبی (NNLM) مقایسه و ارزیابی شده
است.


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

مثالهایی از روابط بین بردارهای تولید شده توسط این الگوریتم را در زیر می توانید ببنید :

همانطور که مشاهده می کنید اگر بردار فرانسه را از پاریس کم کنیم و به ایتالیا اضافه کنیم ، نتیجه به بردار رم بیشترین نزدیکی را دارد یا به عبارتی می توان گفت
که فرانسه به پاریس مثل ؟ است به ایتالیا که این علامت سوال همان نتیجه محاسبات برداری ما روی این سه لغت است که به رم ختم شده است یا شباهت ویندوز به مایکروسافت مثل شباهت ؟ است به گوگل که این علامت سوال هم وقتی در فضای برداری ایجاد شده گوگل، محاسبه شده است به اندروید نزدیک شده است.
اما این روش چگونه کار می کند که با این دقت می تواند کلمات را مدل کند ؟
به طور مختصر ، این الگوریتم برای ساخت بردارهای کلمات از یکی از دو روش زیر استفاده می کند :
– continuous bag-of-words (CBOW)
– Skip-gram
این دو روش که هر دو یک شبکه عصبی ساده هستند که بدون وجود لایه پنهانی که در اغلب روشهای شبکه عصبی وجود دارد، به کمک چند قانون ساده، بردارهای مورد نیاز را تولید می کنند.
در روش کیف لغات پیوسته (CBOW) ، ابتدا به ازای هر لغت یک بردار با طول مشخص و با اعداد تصادفی (بین صفر و یک) تولید می شود. سپس به ازای هر کلمه از یک سند یا متن، تعدادی مشخص از کلمات بعد و قبل آنرا به شبکه عصبی می دهیم (به غیر از خود لغت فعلی) و باعملیات ساده ریاضی، بردار لغت فعلی را تولید می کنیم (یا به عبارتی از روی کلمات قبل و بعد یک لغت، آنرا حدس می زنیم) که این اعداد با مقادیر قبلی بردار لغت جایگزین می شوند. زمانی که این کار بر روی تمام لغات در تمام متون انجام گیرد، بردارهای نهایی لغات همان بردارهای مطلوب ما هستند.
روش Skip-gram
برعکس این روش کار می کند به این صورت که بر اساس یک لغت داده شده ، می خواهد چند لغت قبل و بعد آنرا تشخیص دهد و با تغییر مداوم اعداد بردارهای لغات، نهایتا به یک وضعیت باثبات می رسد که همان بردارهای مورد بحث ماست.

نحوه کار این دو روش را در شکل زیر می توانید ببینید :

الگوریتم های دیگر :

یکی دیگر از الگوریتم هایی که مشابه با روش گوگل، برای نمایش برداری
کلمات و ایجاد یک بردار با در نظر گرفتن همجواری کلمات توسط دانشگاه
استنفورد پیشنهاد شده است روش GloVe: Global Vectors for Word Representation است که کارآیی آن هم تقریباً مشابه با روش Word2Vec ارزیابی شده است .

در این روش، بردار اولیه بر اساس طول همجواری (Window Size) با شمارش
تعداد ظاهر شدن دو کلمه کنار هم در این بازه ، تشکیل می شود. مثلا برای نه
جمله زیر که پردازش اولیه روی آنها صورت گرفته است ، ماتریس زیر شکل می
گیرد. (ترتیب کلمات زیر ماتریس نوشته شده است)
[cce_python]

3. nine input sentences

texts = [[‘human’, ‘interface’, ‘computer’],
[‘survey’, ‘user’, ‘computer’, ‘system’, ‘response’, ‘time’],
[‘eps’, ‘user’, ‘interface’, ‘system’],
[‘system’, ‘human’, ‘system’, ‘eps’],
[‘user’, ‘response’, ‘time’],
[‘trees’],
[‘graph’, ‘trees’],
[‘graph’, ‘minors’, ‘trees’],
[‘graph’, ‘minors’, ‘survey’]]

4. word-word co-occurrence matrix, with context window size of 5

[[۰ ۱ ۱ ۱ ۱ ۱ ۱ ۱ ۰ ۰ ۰ ۰]
[۱ ۰ ۱ ۰ ۰ ۲ ۰ ۰ ۱ ۰ ۰ ۰]
[۱ ۱ ۰ ۰ ۰ ۱ ۰ ۱ ۱ ۰ ۰ ۰]
[۱ ۰ ۰ ۰ ۱ ۱ ۲ ۲ ۰ ۰ ۰ ۰]
[۱ ۰ ۰ ۱ ۰ ۱ ۱ ۱ ۰ ۰ ۱ ۱]
[۱ ۲ ۱ ۱ ۱ ۲ ۱ ۲ ۳ ۰ ۰ ۰]
[۱ ۰ ۰ ۲ ۱ ۱ ۰ ۲ ۰ ۰ ۰ ۰]
[۱ ۰ ۱ ۲ ۱ ۲ ۲ ۰ ۱ ۰ ۰ ۰]
[۰ ۱ ۱ ۰ ۰ ۳ ۰ ۱ ۰ ۰ ۰ ۰]
[۰ ۰ ۰ ۰ ۰ ۰ ۰ ۰ ۰ ۰ ۲ ۱]
[۰ ۰ ۰ ۰ ۱ ۰ ۰ ۰ ۰ ۲ ۰ ۲]
[۰ ۰ ۰ ۰ ۱ ۰ ۰ ۰ ۰ ۱ ۲ ۰]]

5. (rows/columns represent words:

۶. “computer human interface response survey system time user eps trees graph minors”,

7. in that order)

[/cce_python]

در مرحله بعد، بر اساس نزدیکی یا دوری دو کلمه به یکدیگر، این اعداد ، وزن دهی می شوند :
[cce_python]

8. same row/column names as above

[[ ۰٫ ۰٫۵ ۱٫ ۰٫۵ ۰٫۵ ۱٫ ۰٫۳۳ ۱٫ ۰٫ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۱٫ ۰٫ ۰٫ ۲٫ ۰٫ ۰٫ ۰٫۵ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۱٫ ۰٫ ۱٫ ۰٫۵ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫۲۵ ۱٫ ۲٫ ۱٫۳۳ ۰٫ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫۳۳ ۰٫۲ ۱٫ ۰٫ ۰٫ ۰٫۵ ۱٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫۵ ۱٫ ۱٫۶۷ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫۷۵ ۰٫ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۱٫ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۱٫۵ ۱٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۲٫ ]
[ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ۰٫ ]]
[/cce_python]

در مرحله آخر ، لگاریتم این اعداد گرفته شده و با روش (Matrix Factorization)، ابعاد ماتریس کاهش یافته شده و بردارهای نهایی شکل میگیرد.
یک نمای گرافیکی از پیاده سازی این الگوریتم روی حوزه های مختلف متنی است. مثال زیر از این سایت و با توجه به اطلاعات StackOverflow‌ ایجاد شده است :


در این مساله روش cbow برای ساخت بردار های کلمات برای پیدا کردن کلمه ای که میخواهیم آن را تشخیص دهیم مناسب است و در ادامه به توضیح کامل تر این روش میپردازیم :

استفاده از بردار کلمات قبل و بعد یک جای خالی برای تشخیص جای خالی در روش cbow

توضیح روش CBOW :

هنگامی که به مدل cbow نگاه میکنیم همانند شکل بالا ، به نظر میرسد که مدل skip-gram با ورودی ها و خروجی هایش است اما برعکس شده است .
لایه ورودی شامل کلمه های متن ورودی one hot encoded{ X1,….,Xc} برای یک پنجره کلمه با سایز C و فرهنگ لغات با سایز V میباشد . لایه پنهان شده (کلمه ای که جای آن خالی است و میخواهیم ) به لایه خروجی به وسیله ی یک N*V با وزن ماتریس W' وصل میشود .
انتشار رو به جلو : ما ابتدا به بررسی اینکه خروجی چگونه از ورودی محاسبه میشود میپردازیم . طبق زیر فرض میکنیم که ما میدانیم ماتریس وزن ورودی ها و
خروجی ها چیست (ماتریس وزن را بعدا توضیح خواهیم داد)
گام اول این است که خروجی لایه پنهان h را معین کنیم .که به وسیله فرمول زیر محاسبه میشود .


که میانگین وزن بردار های ورودی به وسیله ماتریس W محاسبه میشود .
نکته حائز اهمیت این است که محاسبه لایه پنهان یکی از تنها تفاوت های بدن مدل cbow و skipgram است . در ادامه به محاسبه ی ورودی برای هر node در لایه خروجی میپردازیم :

در این معادله V'wj در واقع j امین ستون از ماتریس خروجی W' است و در نهایت خروجی لایه خروجی را محاسبه میکنیم .Yj خروجی است که به وسیله ی فرستادن ورودی Uj در طول تابع soft
max به دست می آید .
تابع soft_max

اکنون ما میدانیم که forward propagation یا انتشار رو به جلو چگونه کار میکند .
حال میتوانیم ماتریس وزن W و W' را یادبگیریم .

یادگیری ماتریس وزن با back propagation :

ابتدا مقادیر را به صورت رندم مقدار دهی اولیه میکنیم . سپس مثال هایی روی مدل خود میزنیم و error هایش ا مشاهده میکنیم ،
که بعضی توابع در خروجی که از آنها انتظار داریم و خروجی واقعی شان تفاوت دارند .
سپس gradient این اررور را با مراجعه به عناصر هر دو ماتریس وزن محاسبه میکنیم و آنها را مطابق با gradient درست میکنیم .
گام اول تعریف تابع loss میباشد. هدف بیشینه کردن احتمال شرطی کلمه خروجی است ، که به وسیله ی متن ورودی داده میشود .
بنابراین تابع loss ما طبق زیر خواهد بود :

تابع loss

اندیس کلمه خروجی واقعی j است .
گام بعدی به روز رسانی معادله ی 'w وزن لایه خروجی پنهان و سپس حرکت به سوی w وزن لایه پنهان ورودی است.
به روز رسانی وزن لایه پنهان خروجی :
گام اول محاسبه مشتق تابع loss E با مراجعه به خروجی j در لایه خروجی است . سپس ما مشتق E را با مراجعه به وزن w'j با استفاده از قانون chain میگیریم .

اکنون geradient را با مراجعه به خروجی وزن w'ij داریم پس میتوانیم geradient های مختلف و تصادفی را در معادله تعریف کنیم:

جایی که ᶯ >0 نسبت را میابیم .
*به روز رسانی وزن لایه پنهان ورودی :

اکنون به روز رسانی ای مشابه با حالت قبل برای برای وزن ورودی uij انجام میدهیم .
اولین گام محاسبه ی مشتق E با رجوع به نود hi (دوباره از قانون chain استفاده میکنیم )


حاصل انجام دادن این کار این است که نود لایه پنهان hi وصل بشود به لایه خروجی و بنابراین هر error اثبات ممکن است ضمیمه بشود .
گام بعدی محاسبه ی مشتق E با مراجعه به وزن ورودی Wki است .

در فرمول بالا EH برداری است با N بعد از عناصر

Wij' از I=1,.....,N
به هر حال تا ورودی x اگر ، one hot encoded باشد فقط یک سطر از ماتریس N*N زیر

میتواند صفر نباشد ، بنابراین gradient تصادفی نهایی برگرفته از معادله زیر برای برای وزن ورودی است .


در معادله بالا Wj,c را c امین کلمه در متن ورودی در نظر میگیریم .

۹. مجموعه داده

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

شرح فایل train.txt - مجموعه آموزشی، حاوی مجموعه ای بزرگ از احکام انگلیسی است و test.txt - مجموعه تست، شامل تعداد زیادی جمله که از هر جمله ، یک کلمه حذف شده است

۱۰. مراجع

فهرست ارجاعات

[1] Ciprian Chelba, Tomas Mikolov, Mike Schuster, Qi Ge, Thorsten Brants, Phillipp Koehn: One Billion Word Benchmark for Measuring Progress in Statistical Language Modeling, CoRR, 2013.
[2]Alex Minner : word2vec tutorial part 2 the continuous bag of word model,18 may 2015

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

محسن ایمانی

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

مدل‌های زبانی انواع و روش‌های مختلفی دارند که شما به طور مختصر و ناقص به Bag Of Words اشاره کرده و سپس Word2Vec را بررسی کرده‌اید و به بسیاری روش‌های دیگر از جمله روش‌های مبتنی بر Ngram ها نپرداخته‌اید. همچنین به چالش‌های پردازش متن و همچنین مراحل پیش‌پردازشی نیز هیچ اشاره‌ای نکرده‌اید.

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

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

پیشنهاد می‌شود برای فاز آینده با توجه به وقتی که برای بررسی Word2Vec گذاشته‌اید به پیاده‌سازی آن برای داده‌های همین مسئله و حل چالش پر کردن جای خالی بپردازید. در این راه با چالش پیش‌پردازش متن نیز مواجه خواهید شد و در این باره نیز توضیح مختصری در فاز بعد ارائه دهید و همچنین می‌توانید از ابزارهای پردازش متن نظیر NLTK و همچنین برای Word2Vec از کتابخانه Gensim استفاده نمایید.