سعید چوبانی
سعید چوبانی
خواندن ۴ دقیقه·۳ سال پیش

آموزش کلاسترینگ سریع و ساده توییت‌های فارسی

تصویر تزیینی است!
تصویر تزیینی است!

کلاسترینگ (یا همان خوشه‌بندی!) متن یکی از کاربردی‌ترین استفاده‌های پردازش زبان در صنایع مختلف است. برای نمونه یک فروشگاه اینترنتی که پیام‌های متنوع روزمره‌ای دریافت می‌کنه، می‌تونه با کلاستر کردن این پیام‌ها به موضوعاتی که مشتری‌ها، بیشتر دربارشون صحبت می‌کنند پی ببره و در صورتی که موضوع یا مشکل جدیدی باشه سریعا اون رو کشف کنه. شیوه‌های زیادی برای کلاستر کردن متن وجود داره. از روش‌های کلاسیک و سر راستی مثل k-means گرفته‌ تا SBM که پیچیدگی‌های ریاضی بیشتری داره.

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

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

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

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

مرحله اول:‌ خوندن دیتاست و تمیزکاریش

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

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


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

مرحله دوم:‌ تبدیل کردن توییت‌های متنی به آرایه‌های عددی!

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

برای بدست‌آوردن امبدینگ‌ها به ترتیب مراحل زیر رو انجام میدیم:

اول:‌ توییتمون رو توکنیاز و اینکود می‌کنیم.

دوم: خروجی رو به مدلمون می‌دیم تا وزن‌هارو برامون پیش بینی کنه.

سوم: امبدینگ‌های مد نظرمون رو برمی‌داریم.


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

با توجه به اینکه اینکار مموری بالایی نیاز داره من بچ‌های ۵۰ تایی از توییت‌ها ساختم که بعد از محاسبه، امبدینگ‌هاشون روی یه فایل ذخیره میشن.

مرحله سوم:‌ کلاسترینگ توییت‌ها!

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

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

اگر متغیر clusters رو اجرا کنید، یک لیست از لیست‌ها می‌بینید. هر لیست داخل این لیست شامل index توییت ماست. پس کاری که باید بکنم اینکه این توییت‌هارو مچ کنم با این index ها. یک فانکشن خیلی ساده برای اینکار می‌نویسم.

و در نهایت هم فایل row رو داخل یک csv ذخیره می‌کنم.

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

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

یا مثلا یه سری پادکست فارسی داریم که مدام شعر توییت می‌کنن

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

اگر سوال یا پیشنهادی داشتید بنویسید. لینک ویدیو یوتوب و کولب رو دوباره اینجا درج می‌کنم:



پردازش زبان طبیعیکلاسترینگتحلیل داده
NLP Enthusiast | Privacy Fan
شاید از این پست‌ها خوشتان بیاید