ویرگول چگونه به صورت اتوماتیک مطالب را دسته بندی می‌کند؟

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

این خود ویرگول است که با استفاده از topic modeling موضوع مطلب شما را حدس می‌زند و آن را به صورت اتوماتیک دسته‌بندی می‌کند. این کار با استفاده از recommender انجام می‌شود که یک شرکت است که در ضمینه ماشین لرنینگ فعالیت دارد. من نمی‌دانم که این شرکت از کدام الگوریتم برای دسته‌بندی موضوعات استفاده کرده‌اند و چگونه این کار را انجام دادند. ( آقای امیر صدیقی اگر می‌توانند توضیح دهند :) ) اما من با استفاده از الگوریتم LDA که مخفف عبارت Latent Dirichlet allocation است استفاده کردم. دلیل نامگذاری این الگوریتم استفاده از توزیع Dirichlet است که یک ریاضی دان بوده است.

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

حالا این به ما بستگی دارد که اسم این تاپیک را چه بگذاریم اگر کلمه سگ و گربه بیشتر در این تاپیک استفاده شده است می‌توان گفت که این تاپیک مثلا درباره حیوانات خانگی است.

حال اگر ما به این الگوریتم یک مطلب بدهیم او احتمال ( یا درصد ) وجود هر تاپیک در آن مطلب را به ما می‌دهد.

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

این که این الگوریتم چگونه کار می‌کند را بیشتر از این در این مطلب توضیح نمی‌دهم ( در آینده در یک مطلب جدا منتشرش خواهم کرد.)

نکته‌ای که وجود دارد این است که این الگوریتم unsupervised است به این معنی که نیازی به برچسب برای پیشبینی ندارد و لازم نیست یک دیتا تمرینی به آن بدهیم تا یاد بگیرد اما من وقتی با استفاده از web scraping داده‌های چهار تاپیک در ویرگول را استخراج کردم برچسب بر روی آن زدم تا ببینم چقدر نتیجه من با نیتجه ویرگول یکی است ( که نتیجه خیلی هم دلچسب نبود ) .

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

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

[('می', 5984.0),
 ('است', 3783.0),
 ('های', 3040.0),
 ('برای', 2450.0),
 ('ها', 2129.0),
 ('آن', 1957.0),
 ('یک', 1946.0),
 ('هم', 1389.0),
 ('شود', 1247.0),
 ('یا', 1231.0),
 ('تا', 1193.0),
 ('رو', 1134.0),
 ('خود', 1126.0),
 ('شده', 1092.0),
 ('هر', 1027.0),
 ('کند', 935.0),
 ('بود', 905.0),
 ('ما', 876.0),
 ('من', 876.0),
 ('اما', 844.0)]

که بدیهی است این کلمات تکرار زیادی داشته باشند اما باید اکثر این کلمات را ابتدا حذف می‌کردم چون stop words هستند.

بعد از حذف stop words و دوباره استفاده از CountVectorizer حروف استفاده شده را محاسبه کردم که نتیجه بهتر شد.

[('می', 2178.0),
 ('های', 1364.0),
 ('ها', 1015.0),
 ('سال', 656.0),
 ('کار', 613.0),
 ('نویسنده', 440.0),
 ('زندگی', 431.0),
 ('نظر', 414.0),
 ('قرار', 404.0),
 ('دست', 402.0),
 ('افراد', 381.0),
 ('ای', 361.0),
 ('زبان', 357.0),
 ('کتاب', 351.0),
 ('یه', 348.0),
 ('قیمت', 339.0),
 ('ایران', 338.0),
 ('دانشگاه', 333.0),
 ('سرمایه', 333.0),
 ('برنامه', 325.0)]
 

با توجه به تاپیک‌های انتخاب شده تکرار این کلمات منطقی است.

حالا نوبت استفاده از الگوریتم LDA می‌رسد. با توجه به این‌که من چهار موضوع را انتخاب کردم، مقدار component ها را ۴ در نظر گرفتم و الگوریتم به ازای هر تاپیک این کلمات که ۲۰ کلمه بیشتر استفاده شده در هر تاپیک است را پیشنهاد داد.

top 20 words for topic  0
['جامعه', 'الشعر', 'کریم', 'می', 'عزیز', 'زندگی', 'ماه', 'ال', 'قرار', 'نماز', 'امام', 'الله', 'قرآن', 'کتاب', 'روزه', 'خداوند', 'نویسنده', 'دین', 'انسان', 'خدا']
top 20 words for topic  1
['قرار', 'الله', 'اضطراب', 'کار', 'نویسنده', 'وسواس', 'اختلال', 'افسردگی', 'جنسی', 'باعث', 'درمان', 'مي', 'فرد', 'های', 'دست', 'ها', 'احساس', 'زندگی', 'افراد', 'می']
top 20 words for topic  2
['دانشگاه', 'سازی', 'بررسی', 'حل', 'توان', 'قیمت', 'مدل', 'افزایش', 'هوش', 'دلار', 'تولید', 'کشور', 'نظر', 'ایران', 'ماشین', 'یادگیری', 'الگوریتم', 'برنامه', 'کار', 'سال']
top 20 words for topic  3
['نظر', 'بانک', 'شرکت', 'آموزش', 'بازار', 'گذاری', 'دانشگاه', 'به', 'کند', 'قیمت', 'شبکه', 'یه', 'زبان', 'ای', 'سال', 'کار', 'سرمایه', 'ها', 'های', 'می']

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

همانطور که گفته بودم این الگوریتم unsupervised است و لازم نیست به آن برچسب بدهیم اما من برای بررسی شباهت الگوریتم خودم را با الگوریتم ویرگول چک کردم و مقدار درصد شباهت به این صورت شد:

تاپیک اول : ۳۲ درصد

تاپیک دوم : ۵۶ درصد

تاپیک سوم : ۵۰ درصد

تاپیک چهارم : ۲۵ درصد

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