تشخیص هرزنامه

تغییرات پروژه از تاریخ 1394/04/10 تا حالا
هرزنامه که معمولا تبلیغاتی هستند، ویژگی‌های مشابهی دارند. مثلا آنهایی که محصولی را تبلیغ می‌کنند از _قیمت آن_ حرف می‌زنند و یا می‌گویند که _فرصت‌تان چقدر استثنایی_  است. حتی رنگارنگ بودن بخش‌های نوشته می‌تواند نشان از بی‌ارزش بودن آن  باشد. از آنجایی که این نشانه‌های قطعی نیستند و افراد نیز در ایمیل‌هایی که  برای هم می‌فرستند ممکن است مثلا از قیمت حرف بزنند، به طور کلی نمی‌شود با چند  قانون ساده هرزنامه‌ها را جدا کرد.

#  مقدمه

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


# برنامه های مشابه
تقریبا تمام سرویس دهنده های ایمیل، یک سیستم کشف هرزنامه دارند و تمام نامه ها ابتدا از غربال این سامانه ها عبور می کند. به جز این برنامه هایی جدا وجود دارند که به عنوان یک Email Client عمل کرده و در این بین جلوی ورود اسپم ها را می گیرند. Spamihilator از این دسته برنامه هاست. از طرفی دیگر برنامه ها و فریمورک هایی را می توان پیدا کرد که بر روی خود وبسایت های دارای سرویس ایمیل قرار گرفته و از این سمت هرزنامه ها را غربال می کنند. Spam Assassin از جمله این برنامه هاست.

# کارهای مرتبط
در کل چند راه کلی برای مقابله با هرز نامه وجود دارد. هر کدام از این راه ها خود به روش هایی متفاوت منتهی می شوند. سرویس دهنده های بزرگ عموما از ترکیبی از چند راه برای تشخیص هرزنامه استفاده می کنند.[4]

# دسته بندی

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

**1:استفاده از دسته بند های بیزین (Naive Bayes Classifiers)**

یکی از اولین راه ها برای مقابله با هرزنامه، استفاده از فیلتر های مبتنی بر دسته بند های بیزین است. در این روش که بر مبنای رخداد مجموعه مواردی که از پیش دیده شده کار می کند، کلمات متن مهم ترین نقش را بازی می کنند. احتمال وقوع بعضی کلمات در هرزنامه بالاتر است و این نوع دسته بند ها بر همین اساس دست به تشخیص ایمیل های تبلیغاتی می کنند. این روش، عموما در صورتی یک نامه را اسپم می داند که میزان کلماتی که در چنین ایمیل هایی بیشتر یافت می شوند، از حد معینی تجاوز کند.
فیلتر های مبتنی بر دسته بند های بیزین برای تشخیص هرزنامه محبوب هستند اما برای کارکرد درست نیاز به آموزش کافی دارند. در این شرایط کلمات بسته به میزان وقوعشان در اسپم ها با استفاده از روابط آماری بیز، طبقه بندی می شوند و در هنگام کارکرد حقیقی از این دانسته های کسب شده استفاده می کنند.[1] از نظر ریاضی اثبات شده است که این روش کمترین میزان ریسک کلی مورد انتظار را داراست.[2]

**2:استفاده از روش نزدیک ترین k همسایه (k-Nearest -neighbor یا به اختصار k-NN)**

در این روش به طور کلی تعدادی "گره" وجود دارد که می توان با استفاده از الگوریتمی مشخص، "فاصله" ی هر دو "گره" را به عنوان معیاری از تفاوت آنها به دست آورد. در نهایت برای دسته بندی هر "گره" ی جدید، فاصله ی آن با تمام "گره" های کنونی را محاسبه کرده و به دسته بندی نزدیک ترین k "گره" توجه می شود (k در اینجا یک ثابت است که بسته به نوع مسئله باید از پیش مشخص شود). گره ی جدید در بیشترین دسته بندی مشاهده شده در این k گره قرار می گیرد.
در مسئله ی ما "گره" ها همان نامه های الکترونیکی هستند و جمعا دو دسته بندی وجود دارد. هرزنامه و نامه عادی.
اولین مشکل استفاده از این روش تعیین معیاری برای تشخیص "فاصله" بین دو ایمیل است. در این مورد می توان از بردار تعدد کلمات و فاصله ی اقلیدسی بین آنها استفاده کرد (فاصله ی همینگ). هر کلمه ی خاص یک "بعد" را مشخص می کند و بردار کل ایمیل به تعداد تکرار آن کلمه در این بعد حرکت می کند. 
از مشکلات دیگر این الگوریتم کندی فرآیند یادگیری است. اگر پیاده سازی این مرحله بدون استفاده از الگوریتم های خاص صورت بگیرد، پیچیدگی این کار از مرتبه n به توان 2 خواهد بود که در آن n تعداد نمونه های موجود است.[2]
برای تسریع فرآیند، می توان تنها گره هایی را به مجموعه تست اضافه کرد که به اشتباه دسته بندی شده اند. این کار از شلوغی بیش از حد داده ها و کند شدن فرآیند تشخیص جلوگیری می کند.[3]

**3:استفاده از شبکه های عصبی**

شبکه های عصبی در کل مجموعه ای از چندین "تابع ساده ریاضی" هستند که در نهایت تابعی پیچیده را تشکیل می دهند. خروجی هر کدام از این توابع می تواند ورودی تابعی دیگر باشد. در نهایت با استفاده از خروجی ها باید بتوان دسته بندی نمونه را مشخص نمود.
خود شبکه های عصبی به دو دسته تقسیم می شوند. روشی که بیشتر در تشخیص هرزنامه به کار می رود روش Perceptron است.
در این روش هر تابع ساده ما به شکل یک ترکیب خطی از ورودی هاست. خروجی عددی حقیقی است. قرار داد می شود که خروجی مثبت به معنی عادی بودن ایمیل و اعداد منفی بیانگر اسپم بودن آن می باشند. ضرایب این ترکیب خطی در ابتدا مقادیری دلخواه تعیین می شوند. حال باید یکی از نمونه هایی به تابع داده شود که حدس تابع در مورد هزنامه بودن یا نبودن آن اشتباه است. در این صورت تمام ضرایب ترکیب خطی یاد شده بر پایه این ورودی و با استفاده از رابطه ای مشخص اصلاح می گردند. این عمل  چندین بار تکرار می شود. وضعیتی حاصل شد که تمام نمونه ها درست دسته بندی شده بودند، کار متوقف می گردد. در صورتی که رابطه بین ورودی های مسئله خطی نباشد، ضرایب واگرا خواهند شد و الگوریتم به نتیجه نمی رسد.
شبکه های عصبی نیاز به زمان و نمونه های زیاد برای تکمیل فرآیند یادگیری دارند. همچنین لزومی ندارد که رابطه بین ورودی ها واقعا خطی باشد و ممکن است روش کلا به نتیجه نرسد.[2] در عوض پیاده سازی آن ها کار مشکلی نیست و نتیجه ی حاصله در صورت وجود عموما خوب و مطلوب است.

**4:استفاده از ماشین بردار پشتیبان (Support Vector Machine) یا به اختصار (SVM)**

ایده ی کلی این الگوریتم شبیه روش Perceptron است که در بالا توضیح داده شد. به این شکل که در این روش نیز تابعی خطی را پیدا می شود که با گرفتن ورودی ها، هرزنامه بودن را مشخص کند. تفاوت اینجاست که در این روش تابع خطی را به یک معادله تبدیل شده و با استفاده از آن تلاش می شود "خط مرز" بین نمونه های عادی و اسپم یافت شود. در این صورت برای تشخیص وضعیت هر ایمیل جدید، کافیست بررسی شود که این ایمیل کدام طرف خط مذکور است (با توجه به n بعدی بودن فضا، خط یاد شده در اصل خود یک فضای n-1 بعدی با معادله ی مشخصه ی خاص خود است).
پیاده سازی این روش اندکی مشکل است اما حاصل عموما بهتر از روش های بالا می باشد.[2][1]

**5:استفاده از توکن های متنی متمایل (Biased Text Token)**

در این روش تمام نمونه های "اسپم" در یک گروه و تمام نمونه های عادی در گروهی دیگر قرار می گیرند. برای هر کدام از گروه ها، تعداد کلمات به طور جدا ذخیره می شود به طوری که به ازای هر کلمه دو متغیر "تعداد در خوب ها" و "تعداد در اسپم ها" به دست خواهند آمد. حال با تقسیم این تعداد بر کل تعداد ایمیل ها، می توان ضریبی برای تشخیص به دست آورد. نکته ی مهم تر این است که می توان با ضرب یک عدد ثابت در هر کدام از این دو ضریب، ارزش آن را افزایش داد و به عبارتی تشخیص را به سمت "خوب" بودن و یا "بد بودن" متمایل (بایاس) کرد. در نهایت با استفاده از تمام این ضرایب و استفاده از ترکیبی خطی می توان احتمال اسپم بودن یک ایمیل را به دست آورد.[4]

# تشخیص بر اساس رفتار[4]

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

**1:مدل زمان فرستادن ایمیل**

این مدل رفتار کاربر فرستنده را بررسی می کند و به دنبال موارد غیر عادی می گردد. برای مثال، تاریخچه ساعات فرستادن ایمیل توسط یک کاربر مورد بررسی قرار میگیرد. کاربری که در 24 ساعت شبانه روز در حال فرستادن ایمیل است پتانسیل بالایی برای ربات بودن (Spam-bot) دارد. در این روش نیز بر اساس تاریخچه ی یک کاربر، می توان یک "فاصله" بین رفتار عادی او و رفتار ایمیل کنونی پیدا کرد و از آن برای تشخیص هرزنامه بودن استفاده نمود.

**2:مدل کاربران مشابه**

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

**3:مدل گیرنده های ایمیل**

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

**4:مدل اهمیت متقابل کاربران**

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

**5:مدل تشخیص گروه ها**

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

**6:مدل های دیگر**

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

#  آزمایش‌ها

**1:داده ها:*
داده ها از آرشیو وبسایت دانشگاه اقتصاد آتن به دست آمده اند و توسط . V.Mestis و I.Androutsopoulos برای مقاله ی خود برای سومین کنفرانس ضد اسپم آمریکا در سال 2006  تهیه شده اند. لینک دسترسی مستقیم به داده ها در قسمت پیوند ها قرار داده شده است. زبان داده ها انگلیسی می باشد.
ساختار این داده ها بسته به نوع ایمیل ها متفاوت است؛ به طوری که هرزنامه ها در یک قالب و ایمیل های عادی در قالبی دیگر ذخیره شده اند. همچنین اطلاعاتی در این داده ها یافت می شود (مانند تعداد افراد فرستاده شده، زمان و ...) که با توجه به این که در این پیاده سازی تنها از روش دسته بندی استفاده شده، برای ما بی معنی هستند. به همین دلیل ابتدا دو برنامه ی پایتون وظیفه دارند داده ها را "تمیز" کرده و تا حد زیادی به صورت "متن" در بیاورند.
تعداد نمونه داده های هرز نامه حدود 9000 و تعداد داده های عادی حدود 4000 است. تمامی این داده ها در مرحله اول مورد استفاده قرار نخواهند گرفت.

**2:پیاده سازی** ([لینک به گیت هاب](https://github.com/omiddavoodi/Spam-Detection))

پیش از اجرای برنامه باید پایتون 3 و کتابخانه ی snowballstemmer آن بر روی رایانه نصب باشد.

برای راه اندازی برنامه می بایست ابتدا دیتاست ها را از آدرس زیر دانلود کرد.
http://www.aueb.gr/users/ion/data/enron-spam/
فایل هایی که باید دانلود شوند در زیر آورده شده اند
برای نمونه های هرزنامه : GP.tar
برای نمونه های عادی : beck-s.tar و  farmer-d.tar و kaminski-v.tar

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

سپس با استفاده از تابع cleanfile در کد dataset-cleaner1.py، تمام فایل های حاوی نمونه های هرزنامه آماده ی استفاده برای برنامه اصلی می شوند.
این عمل برای کد dataset-cleaner2.py نیز به همین ترتیب و برای فایل های حاوی نامه های عادی باید انجام پذیرد.

کد sdvectorizer.py برای تبدیل سند های متنی به بردارهای متنی مورد استفاده قرار می گیرد.

کد sdvectormul.py محتوی یک تابع برای انجام ضرب داخلی دو بردار تولید شده توسط کد قبلی با سرعت بالاست.

کد sdlearner.py برای تولید داده های یادگیری مورد استفاده قرار می گیرد. یک نمونه از این داده ها از قبل در فایل w.txt آورده شده است.

در نهایت برنامه ی اصلی که در sddetector.py یافت می شود، حاوی تابعی است که یک سند را گرفته و بر اساس داده های آموزشی درون فایل w.txt آن را دسته بندی می کند.

توضیح پیاده سازی این برنامه به چند قسمت تقسیم شده است که در ادامه آمده است.

**2.1: مقدمات**

پس از بررسی روش های بالا، تصمیم بر این شد که تنها از روش دسته بندی و از الگوریتم Perceptron برای تشخیص هرزنامه ها استفاده شود. دلیل این انتخاب، بالا بودن سرعت این روش و عملکرد خوب آن بر طبق تجربه های قبلی در سراسر دنیا بوده است.
الگوریتم پرسپترون یکی از ساده ترین الگوریتم های مبتنی بر شبکه ی عصبی است. در این الگوریتم تنها یک نرون موجود است که با گرفتن بردار ورودی و بردار ضرایب یادگیری، یک عدد به عنوان خروجی می دهد که ضرب داخلی این دو بردار است. نکته ی مهم در این میان روش درست آموزش برنامه و چگونگی تعیین بردار ضرایب یادگیری است که در ادامه به آن پرداخته خواهد شد.
زبان پیاده سازی پایتون و نسخه ی آن 3.3.0 بوده است.

**2.2: طراحی و توسعه یک "برداری ساز متن" (یا برداری ساز سند Document Vectorizer)**

 ابتدا یک برنامه برای برداری سازی متون طراحی شده است. در این برنامه ابتدا کلمات متن جدا شده و سپس ریشه ی آنها مشخص می گردد. این عمل به این خاطر است که کلماتی مانند buy، buying، bought و ... که همگی در یک خانواده قرار می گیرند، در نهایت به یک "بعد" در فضای برداری منتهی شوند. برای این کار از یک کتابخانه به نام snowballstemmer استفاده شده است.
پیش از این کار برنامه بررسی می کند که کلمه ی یافت شده، جزو کلمات بسیار پرکاربرد زبان است یا خیر. برای مثال در زبان انگلیسی کلماتی مانند am، is، if و ... جزو واژه های بسیار پرکاربرد محسوب می شوند و در واقعیت نیز کمکی به تشخیص هرزنامه نمی کنند. برای همین برنامه این کلمات را جزو داده های آموزش خود قرار نمی دهد. لیست این کلمات از منبعی که در قسمت پیوند ها آمده گرفته شده.
به غیر از این بعضی هرزنامه نویس ها برای گمراه کردن سیستم های مبتنی بر یادگیری، حجم عظیمی از حروف و اعداد بی معنی را کنار هم قرار داده تا برنامه ی های تشخیص اسپم تصور کنند که کلمات کاملا جدید هستند و نتوانند در مورد محتوا به طور دقیق پاسخ دهند.
برای جلوگیری از این اتفاق بهترین کار داشتن لیستی از تمام کلمات موجود در زبان و مقایسه ی واژگان متن با آنها است. اما از آنجا که این عمل تقریبا غیر ممکن است و باعث می شود متن های دارای غلط املایی زیاد، هرزنامه تشخیص داده شوند، نمی تواند مورد استفاده قرار گیرد.
به همین دلیل در هنگام برداری سازی، کلماتی که ترکیبی از حروف و عدد هستند مستقیم به یک "بعد" خاص ارجاع داده می شوند.
راه دیگری که هرزنامه نویسان از آن استفاده می کنند، چسباندن تمام کلمات متن به یکدیگر بدون فاصله است تا با این روش برنامه پردازشگر گمراه شود و نتواند کلمات را به درستی تشخیص دهد.
برای مقابله با این تکنیک، تمام کلماتی که تعداد حروف آنها از حد معینی تجاوز کند در یک بعد خاص طبقه بندی می شوند. طول بردار در این بعد اختلاف طول کلمه با "حد مجاز" یاد شده است. در این صورت هرزنامه هایی که از این روش استفاده کنند به سرعت تشخیص داده خواهند شد و در واقعیت نیز تعداد کلمات از حد معینی تجاوز نخواهد کرد. این "حد مجاز" در برنامه، 15 کاراکتر انتخاب شده است.
در نهایت این قسمت برنامه متن را گرفته و یک بردار تحویل می دهد که از تعدادی بعد تشکیل شده است که هر بعد، تعداد تکرار یک "خانواده" از کلمات را نشان می دهد. در این وضعیت می توان از بردار برای آموزش برنامه و یا تشخیص هرزنامه بودن متن استفاده نمود.
برای سهولت کار با این بردار و حذف عامل "طول متن" در تصمیم گیری، تمام پیشروی های بردار در ابعاد مختلف بر تعداد کل کلمات آن تقسیم می شود.


**2.3: مرحله آموزش برنامه**

در این مرحله قرار است خود روش Perceptron پیاده سازی شود. ابتدا یک بردار w (مشابه بردار های یاد شده در قسمت قبل و دارای همان تعداد بعد) ساخته و تمام مقادیر آن را برابر صفر قرار داده می شود. هدف این است که این بردار طوری تعیین شود که حاصل ضرب داخلی آن در بردار هر متن، در صورت هرزنامه بودن مثبت و در صورت هرزنامه نبودن منفی شود. برای این کار از الگوریتم زیر بهره برده می شود:
الف:به ازای هر متن i در مجموعه داده های آموزشی، بردار آن در w ضرب شده و حاصل yi نامیده می شود.
ب:به ازای هر متن متغیری به نام di تعریف کرده و مقدار آن در صورتی که متن هرزنامه است برابر 1 و در غیر این صورت -1 قرار داده می شود.
ج: هر کدام از مولفه های بردار w با استفاده از فرمول زیر به روز رسانی می شود:
w[j] = w[j] + a * (d - y) * yi[j]
که در آن a، ضریب یادگیری نام داشته و توسط برنامه نویس تعیین می شود. هر چه ضریب یادگیری بیشتر باشد تغییرات w بیشتر و سریع تر است اما ممکن است باعث واگرا شدن آن شود. در اینجا پس از چند بار سعی و خطا a برابر 0.3 قرار داده شده است.
این کار تا زمانی انجام داده می شود که به ازای تمام داده های ورودی، حاصلضرب داخلی بردار w در بردار متن، در صورت هرزنامه بودن مثبت و در غیر این صورت منفی شود.
از آنجا که الگوریتم Perceptron در نهایت بر پایه این فرض بنا شده که تشخیص نامه های اسپم و عادی با استفاده از روشی "خطی" ممکن است، و از آنجا که در واقعیت این گونه نیست، ضرایب w ممکن است هیچ گاه همگرا نشوند و عمل بالا تا ابد ادامه پیدا کند. همچنین هزینه زمانی انجام خود الگوریتم بالا بسیار زیاد است. به همین دلیل این الگوریتم را تنها n بار که n  توسط نویسنده تعیین شده، اجرا می شود.
پس از اتمام عملیات، w ها ذخیره می گردند.
برنامه ی نوشته شده برای این تحقیق برای تسریع عمل ضرب برداری از چند الگوریتم خاص استفاده می کند که مبتنی بر "مرتب شده بودن" مولفه های بردار ها می باشد. در این روش هر مولفه با یک عدد نشان داده می شود و برای ذخیره سازی بردار ها، شماره مولفه و مقدار پیشروی در یک لیست به صورت یک تاپل و در حالتی مرتب شده بر اساس شماره مولفه ذخیره می شوند. اگر پیشروی یک بردار در یک بعد صفر است، مولفه ی آن بعد اصلا ذخیره نمی شود. برای محاسبه ضرب بردار ها و اعمال این چنین، از الگوریتمی مشابه کمترین زیر دنباله مشترک (LCS) استفاده می شود.


**2.4: تشخیص هرزنامه**

تا به اینجا تمام اعمال انجام شده مقدمه ای بر عمل اصلی که تشخیص هرزنامه است، بوده اند. برای این کار اکنون کافی است با برداری کردن متن جدید، ضرب داخلی آن در بردار w که قبلا ذخیره شده است را به دست آورد و علامت آن را بررسی کرد. در صورت مثبت بودن علامت، نامه ی مورد نظر هرزنامه است و در غیر این صورت عادی است. 


**2.5: نتایج اولیه**

پس از یک دوره یادگیری اولیه با حدود 1200 نمونه هرزنامه و 2000 نمونه متن عادی با 5 بار اجرای الگوریتم یاد شده بر روی w، نمونه های جدیدی به برنامه داده شد تا عملکرد آن بررسی شود. نتیجه ی آزمایش به شرح زیر است:
از بین 2072 ورودی هرزنامه، تعداد 1142 مورد به درستی اسپم تشخیص داده شدند و باقی 930 مورد نامه ی عادی تشخیص داده شدند که حاکی از صحت 55.12 درصدی برنامه در این زمینه است.
از بین 2267 ورودی نامه ی عادی، تعداد 2237 مورد به درستی "عادی" تشخیص داده شدند. در این حالت 30 مورد به اشتباه هرزنامه تشخیص داده شدند که حاکی از صحت 98.68 درصدی برنامه در این زمینه است.

**2.6: بررسی نتایج**

 به نظر می رسد برنامه در زمینه تشخیص "درست" بودن متون عملکرد خوبی دارد، اما در زمینه تشخیص خود هرزنامه ها نیاز به تغییرات اساسی دارد. چرا که تنها می تواند حدود نیمی از هرزنامه ها را تشخیص دهد. بدیهی است که با افزایش تعداد نمونه های آموزشی می توان عملکرد برنامه را در این زمینه بهبود بخشید، اما بررسی دقیق تر نمونه های ورودی نشان می دهد دسته ای خاص از نامه ها وجود دارند که برنامه تشخیص آنها با مشکل رو به روست. در این نامه ها تعداد زیادی کلمه ی متشکل از حروف تصادفی وجود دارد که طول آنها مشابه کلمات عادی است. برای مثال در انتهای یکی از هرزنامه ها عبارات زیر به چشم می خورد:
 aebif lriugb oihi poeg pegfo baise eivyi lrogi bsavbs eiyurv ycgfvu vnroid pkmrg pldvjur bisyv rygviv ishir jrghod vribdi sibvyr kjvrju oknvr
کلمات فوق به علت عدم وجود در نمونه های آموزشی، برای تصمیم گیری درست مشکل ایجاد می کنند.
 از آنجا که برنامه برای تشخیص این موارد تجهیز نشده است، نمی تواند در این مواقع عملکرد درستی داشته باشد.
 عملکرد اشتباه برنامه در تشخیص نامه های درست، عموما مربوط به نامه هایی بوده است که در آنها در مورد خرید و فروش و یا قیمت ها و اعداد صحبت شده است. در چنین مواقعی سامانه های عملیاتی کنونی از تکنیک های مبتنی بر رفتار استفاده می کنند.
مورد دیگر سرعت اجرای بخش های مختلف برنامه است. بخش یادگیری بسیار کند عمل می کند به طوری که دوره ی آموزشی یاد شده حدود 30 دقیقه زمان برده است. البته در هنگام انجام عمل "دسته بندی" نمونه های جدید به خاطر ذات الگوریتم عملکرد برنامه مطلوب بوده است.


**2.7: آزمایش دوباره**

در این آزمایش برای کم کردن عامل عدم آموزش کافی، نمونه های هرزنامه آموزشی بیشتر شده اما نمونه های نامه عادی دست نخورده باقی مانده است. همچنین تعداد بار اجرای الگوریتم به 8 افزایش پیدا کرده است. به طور کلی حدود 2100 نمونه هرزنامه و 2000 نمونه نامه عادی برای آموزش برنامه استفاده شده است. برای آزمایش نمونه هایی متفاوت با آزمایش قبلی به عنوان ورودی داده شده اند. نتیجه ی این آزمایش به شرح زیر می باشد:
از بین 1950 ورودی هرزنامه، تعداد 1686 مورد به درستی اسپم تشخیص داده شدند و باقی 264 مورد نامه ی عادی تشخیص داده شدند که حاکی از صحت 86.46 درصدی برنامه در این زمینه است.
از بین 2228 ورودی نامه ی عادی، تعداد 2091 مورد به درستی "عادی" تشخیص داده شدند. در این حالت 137 مورد به اشتباه هرزنامه تشخیص داده شدند که حاکی از صحت 93.85 درصدی برنامه در این زمینه است.


**2.8: بررسی نتایج جدید**

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

نتایج فوق با موارد ذکر شده در دو مقاله که در این زمینه نوشته شده اند، مقایسه می شوند. 
مقاله ی اول توسط کنستانین ترکیانوف در سال 2004 [2]
مقاله ی دوم توسط اوون کوفاندیرمبوا و ریچارد گوتورا در سال 2012 [5]
![جدول مقایسه نتایج با موارد از پیش انجام شده](https://boute.s3.amazonaws.com/163-Table1.png)
نکات:
در این جدول Precision (دقت) برابر تعداد تشخیص های درست بر روی تعداد کل تشخیص هاست. برای مثال Spam Precision برابر تعداد تشخیص درست نمونه های هرزنامه بر روی تعداد کل مقالاتی است که هرزنامه تشخیص داده شده اند.
همچنین Recall (صحت) برابر تعداد تشخیص های درست، بر روی کل تعداد است. برای مقال Spam Recall برابر تعداد نمونه های هرزنامه درست تشخیص داده شده بر روی تعداد کل نمونه های ورودی اسپم می باشد.
به طور کلی نتایج آزمایش انجام شده در مقابل آزمایش های افراد دیگر ضعیف تر می باشد که نشان از امکان بهبود بیشتر آن هاست.


**2.9: پیشبینی اعمال برای بهبود نتایج**

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

**2.10: اعمال تغییر بر روی الگوریتم**

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

![نتیجه ی آزمایش جدید](https://boute.s3.amazonaws.com/163-Table2.png)

همان طور که از نتایج پیداست، انجام این تغییر منجر به افزایش Spam Recall و Ham Precision و کاهش دو پارامتر دیگر شده است.
مشکل این است که با اعمال این تغییر، در صورت عدم وجود یک کلمه در پایگاه داده، بردار مربوط به کلمات نامشخص افزایش می یابد. از آنجا که پایگاه داده ی استفاده شده کوچک بوده، در بین نامه های عادی نیز به واژه های ناآشنا برخورده که منجر به تشخیص نادرست این موارد شده است. همچنین این تغییر نمی تواند واژه هایی که در آنها غلط املایی وجود دارد را به درستی تشخیص دهد. به همین دلیل، استفاده از این الگوریتم تغییر یافته خاتمه یافت.

**2.11: در نظر نگرفتن کلمات ناآشنا در تشخیص، محاسبه تعداد حروف بزرگ، افزایش عمق یادگیری و استفاده از نمونه های یادگیری بیشتر**

پس از آزمایش ناموفق قبل، تصمیم گرفته شد تا کلمات ناآشنا در تصمیمی گیری هیچ نقشی نداشته باشند و در بردار متن گنجانده نشوند. اما تنها کلمات ناآشنا نیستند که می توانند در تشخیص هرزنامه مهم باشند.
یکی دیگر از پارامتر های مهم در تشخیص هرزنامه، میزان استفاده از حروف بزرگ است. نویسندگان هرزنامه گاهی برای جلب توجه خواننده از جملات متشکل از تماما حروف بزرگ استفاده می کنند. کد قبلی تمام کلمات را به حروف کوچک تبدیل می کرد. در این وضع توانایی تشخیص بر اساس میزان حروف بزرگ کم می شد. در کد جدید، نسبت حروف بزرگ به کل تعداد حروف نیز به بردار متن اضافه گردید.
در نهایت برای افزایش دقت، پارامتر های یادگیری نیز افزایش داده شدند. عمق یادگیری، که تعداد اعمال تغییر بر روی w است، به 12 و تعداد نمونه های یادگیری نیز به 4634 مورد هرزنامه و 4979 مورد نامه عادی افزایش یافت. نتیجه ی این آزمایش در مقایسه با آزمایش های دیگر در جدول زیر آمده است.

![مقایسه ی نتایج آزمایش ها](https://boute.s3.amazonaws.com/163-Table3.png)

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

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

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

#  مراجع

+ [1] W.A.Awad, and S.M.ELseufi. "Machine Learning Methods for Spam Email Classification" (2001)
+ [2] Konstantin Tretyakov. "Machine Learning Techniques in spam filtering" (2004)
+ [3] W.Yerazunis, Fidelis Asis, Christian Siefkes and Shalendra Chhabra. "Sorting Spam with K-Nearesr-Neighbor and Hyperspace classifiers"
+ [4] Sholmo Hershkop. "Behaivior based email analysis with Application to Spam Detection"
+ [5] Owen Kufandirimbwa, Richard Gotora. "Spam Detection Using Artificial Neural Networks (Perceptron Learning Rule)" 

#  پیوندهای مفید


+ [UCI Spambase Data Set ](https://archive.ics.uci.edu/ml/datasets/Spambase)
+ [WEBSPAM-UK2007 dataset](http://chato.cl/webspam/datasets/uk2007/)
+ [Natual Language Processing Course - Text Classification](https://class.coursera.org/nlp/lecture/preview)
+ [1] W.A.Awad, and S.M.ELseufi. "Machine Learning Methods for Spam Email Classification" (2001)[پیوند](http://airccse.org/journal/jcsit/0211ijcsit12.pdf) 
+ [2] Konstantin Tretyakov. "Machine Learning Techniques in spam filtering" (2004) [پیوند](http://ats.cs.ut.ee/u/kt/hw/spam/spam.pdf)
+ [3] W.Yerazunis, Fidelis Asis, Christian Siefkes and Shalendra Chhabra. "Sorting Spam with K-Nearesr-Neighbor and Hyperspace classifiers" [پیوند](http://crm114.sourceforge.net/docs/KNN_Hyperspace_Filters.pdf)
+ [4] Sholmo Hershkop. "Behaivior based email analysis with Application to Spam Detection" [پیوند](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.84.2621&rep=rep1&type=pdf)
+  [5] Owen Kufandirimbwa, Richard Gotora. "Spam Detection Using Artificial Neural Networks (Perceptron Learning Rule)"  [پیوند](http://onlineresearchjournals.org/JPESR/pdf/2012/june/Kufandirimbwa%20and%20Gotora.pdf)
+ Spamihilator : [پیوند](http://www.spamihilator.com/en)
+ Spam Assassin : [پیوند](http://spamassassin.apache.org/) 
+ Dataset : [پیوند](http://www.aueb.gr/users/ion/data/enron-spam/)
+ Implemention on GitHub: [پیوند](https://github.com/omiddavoodi/Spam-Detection)