مبارزه با اسپم

سه‌شنبه ۱۷ بهمن ۱۳۹۶
۳ دقیقه مطالعه

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

مشکل چیست؟

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

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

چند نوع اسپم می‌گیرم؟

من دو گروه پیام ناخواسته دریافت می‌کنم:

  1. پیام تبلیغاتی انگلیسی
  2. پیام تبلیغاتی فارسی

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

هدف چیست؟

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

راه‌حل چیست؟

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

دیگران چه می‌کنند؟

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

  1. استفاده از یک سرویس آنلاین مثل Akismet که رایگان است.
  2. جمع‌آوری یک بانک‌داده از اسپم‌ها و استفاده از یادگیری ماشین برای تشخیص.
  3. چک کردن ایمیل و URL و IP و پیام با یک بلک‌لیست.

یا روشهای غیردراماتیک‌تر اما بسیار موثری مانند اینها:

  1. غیرفعالسازی کامنت‌دونی بعد از سپری شدن مدت زمان مشخص، مثلا یک ماه.
  2. محدود کردن کامنت‌ها به یک زبان مشخص.
  3. محدود کردن طول پیام.
  4. ایجاد سیستم امتیازدهی بر اساس تعداد لینک‌ها و کاراکترها و سایر پارامترهای ممکن.

اولین درس: راه حل قطعی وجود ندارد

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

راه‌حل من

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

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

با تبلیغات فارسی چه کنم؟

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

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

سورس

دیدگاه‌ها

امیر   ۱۷ بهمن ۱۳۹۶   پاسخ 5a7a0112a6188f5b2cfb3ef9

ایول ایده بسیار خوبیه. این classification داده ها به اسپم و سالم یکی از مثال های اساسی اول درس یادگیری ماشینه. خوب فقط مشکل اینه که عموما (اسپم های فارسی رو نمی دونم) اسپم ساز ها به صورت رقابتی (adversarial) عمل می کنن و لذا یه داده اولیه ترین کافی نیست و مدام باید داده جمع بکنی و احتمالا از روش های online learning استفاده کنی. من خیلی تخصصی تو این زمینه ندارم ولی این تز رو با یه سرچ پیدا کردم و از روی فهرستش خیلی به ابعاد خوبی از این مساله پرداخته. حالا چقدر پکیج آماده برای این کار باشه خدا می دونه.

وبلاگ‌صاحاب   ۱۷ بهمن ۱۳۹۶   پاسخ 5a7a0d10177ec41e4d80a006

این online learning که گفتی چیز خوبیه. راهی که برای اینکار به فکر من می‌رسه، بجز جمع‌آوری داده از وبسایت خودم (که ناکافی است)، ایجاد یک سرویس آنلاینه، شبیه به Akismet. این سرویس دائم با فیدبک کاربران در حال بهبوده. گذشته از این فکر می‌کنم اگر یک مدل متن مقاله‌ای که دیدگاه براش ارسال شده رو در نظر بگیره با احتمال بالاتری می‌تونه حدس بزنه که پیام ارسالی اسپم هست یا نه. یعنی نه تنها باید دیتابیسی از اسپم‌های موجود رو بررسی کنه بلکه باید متن مقاله و کلمات کلیدی اون رو برای تصمیم‌گیری در نظر بگیره.

حالا به تدریج که تبلیغات فارسی در وبسایت ارسال می‌شه من هم روش‌های مختلف رو امتحان می‌کنم و در موردش می‌نویسم.

امیر   ۱۷ بهمن ۱۳۹۶

ایول ایده بسیار خوبیه. این classification داده ها به اسپم و سالم یکی از مثال های اساسی اول درس یادگیری ماشینه. خوب فقط مشکل اینه که عموما (اسپم های فارسی رو نمی دونم) اسپم ساز ها به صورت رقابتی (adversarial) عمل می کنن و لذا یه داده اولیه ترین کافی نیست و مدام باید داده جمع بکنی و احتمالا از روش های online learning استفاده کنی. من خیلی تخصصی تو این زمینه ندارم ولی این تز رو با یه سرچ پیدا کردم و از روی فهرستش خیلی به ابعاد خوبی از این مساله پرداخته. حالا چقدر پکیج آماده برای این کار باشه خدا می دونه.