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

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

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

# کارهای مرتبط
**- انواع الگوریتم های تشخیص و توقیف هرزنامه:**

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

- تشخیص بر اساس محتوا و کلمات:

این روش ساده ترین و رایج ترین راه برای شناسایی هرزنامه ها می باشد. اگر محتوای نامه های الکترونیکی و یا محتوای اجزای تشکیل دهنده ی وب سایت مانند عنوان ٬ فرا تگ ٬ لینک های موجود در صفحه و URL شامل کلمات خاصی باشند ٬ به عنوان هرزنامه شناسایی می شوند. هرزنامه نویسان اغلب از عبارات خاص و جذاب برای جلب توجه کاربران در نامه ی الکترونیکی یا وب سایت استفاده می کنند . کلماتی مانند free, Buy-Now, cheap, Satisfy-Me, Sex, Winner و..به همین دلیل هرزنامه نویسان کلمات مورد استفاده ی خود را دایم به شیوه های مختلف تغییر می دهند این تغییر مکرر باعث کاهش دقت می شود. برای رفع این مشکل به پایگاه داده بزرگتری جهت پوشش کلمات گوناگون نیاز داریم که جستجو و پردازش در این پایگاه داده باعث افزایش پیچیدگی زمانی می شود . از طرفی احتمال از دست رفتن نامه های الکترونیکی و یا وب سایت های واقعی و قانونی به علت استفاده ی مشروع از این کلمات نیز بالا می رود.

- تشخیص بر اساس رفتار هرزنامه:

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

هرزنامه نویسان برای فریب دادن ضد هرزنامه ها از اطلاعات غیر معتبر و نامربوط در فایل سرایند نامه ی الکترونیکی استفاده می کنند بدین سببب 
در این روش اطلاعات فیلدها مانند: From, To, Date, Deliver-to, Received, Reteurn-Path بررسی می شوند و در صورت غیر معتبر یا نامربط  بودن هر کدام از اطلاعات فیلدهای فایل سرایند درجه ی هرزنامه بودن نامه الکترونیکی را بالا می برد.

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

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

مقایسه و تعیین صحت این فایل ها بر اساساس قوانینی تعریف شده است ؛ که این قوانین تا حدی همه ی حالاتی که برای سنجش فیلد ها نیازمند است را تحت پوشش می دهد.و به ۲ بخش تقسیم شده اند: یک بخش برای سنجش فیلدهای هر کدام از فایل ها(سرایند و syslog) و بخش دیگر برای مقایسه هر فیلد از فایل سرایند با فایل sysylog ٬ این قوانین مواردی مانند تهی ٬ جعلی ٬  تصادفی و در قالب درست بودن فیلدهای ادرس و قالب ٬ زمان(اداری یا غیر اداری) فیلد تاریخ(Date) را شامل می شوند همچنین فیلدهایی که قرار است دو به دو با هم مقایسه شوند از نظر اینکه آیا دو فیلد در یک قالب درست آدرس یا زمان هستند؟مثلا اطلاعات فیلد FROM از فایل سرایند با اطلاعات فیلد FROM از فایل  syslog در یک نامه الکترونیکی باید یکسان باشند.

- روش پیشنهادی:

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

۱)حذف کلمات بی ارزش

۲)ریشه یابی کلمات

۳)استخراج ویژگی ها

۴)کاهش ویژگی ها

۵)ساخت مدل

۱- حذف کلمات بی ارزش:

در ابتدا به منظور آزمایش روش پیشنهادی از پایگاه های اطلاعاتی استاندارد در زمینه تشخیص هرزنامه (enorm) استفاده می کنیم که شامل نامه های الکترونیک عادی و هرزنامه می باشد. داده های مورد بررسی ما داده های مورد استفاده در مقاله های معتبر علمی می باشد که در چند سال اخیر چاپ شده است. ما در ابتدا سعی بر آن داریم تا با انجام روش های متفاوت کلمات بی ارزش (and,the,or,in,…) را از متن نامه ها حذف کنیم.

۲- ریشه یابی کلمات:

بعد از حذف کلمات بی ارزش کلمات باقی مانده را ریشه یابی می کنیم و هدف این است که کلماتی که ریشه یکسانی دارند را  یکسان در نظر بگیریم برای این منظور ما از الگوریتم های stemming استفاده می کنیم.

۳- استخراج ویژگی:

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

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

الگوی تکراری:

الگوی <SB<sb1,sb2,…,sbm در دنباله S نمونه ای از الگوی <P<e1,e2,…,en می باشد اگر و تنها اگر عبارت QRE زیر برقرار باشد:

عبارت e1 ; [-e1,e2,…,en]*;e2;…; [-e1,e2,…,en]*;en.   :   QRE   

 یک نمونه را با ۳ تایی (sidx , istart , iend) نمایش داده می شود که در آن sidx نشان دهنده شماره دنباله S در پایگاه داده اطلاعاتی می باشد و istart اندیس شروع و iend اندیس پایان زیر رشته در S می باشد . در حالت پیش فرض٬ تمامی اندیس ها از ۱ شروع می شود.

۴- کاهش ویژگی ها:

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

۵- ساخت مدل:

در این مرحله ما می خواهیم با استفاده از ویژگی های برگزیده شده از مرحله ی قبل و اعمال الگوریتم های متفاوت طبقه بندی در داده کاوی بر روی بردارهای بدست آمده مدلی تهیه کنیم بطوری که با استفاده از آن بتوان ایمیل های هرزنامه و ایمیل های عادی را تفکیک کرد.
با استفاده از تابع (rankBM25_DocumentAtAtime_WithHeap(q,k  میل هایی را که مرتبط هستند را به ترتیب ویژگی هرزنامه بودنشان را بدست می اوریم.

# آزمایش‌ها

**۱- مجموعه داده و ویژگی های استخراج شده:**

- لینک کد قرار داده شده بر روی github:

+ https://github.com/pegah1/hazfeharznname/blob/master/TORKAMANDI_89551264.py

- توضیح الگوریتم های استفاده شده در کد:

+ https://github.com/pegah1/hazfeharznname/blob/master/harzname_document.pdf

- در این برنامه یک فایل DOCUMENT.TXT به عنوان ورودی گرفته می شود که شامل ایمیل هاست و  فایل balcklist_word.txt  که شامل پایگاه داده کلمات هرزنامه است.

- فایل balcklist_word.txt:

+ https://github.com/pegah1/hazfeharznname/blob/master/balcklist_word.txt

- نمونه فایل ورودی:

+ https://github.com/pegah1/hazfeharznname/blob/master/sample_input.txt 

**نکات قابل توجه برای run گرفتن از کد:**

 -  فایلی که شامل ایمیل هاست در کد به نام DOCUMENT فراخوانی می شود و هر ایمیل داخل فایل با  تگ باز <BODY > شروع شده و با تگ بسته <BODY/> تمام می شود.

-  خروجی شامل ایمیل هایی است که هرزنامه تشخیص داده شده اند و به ترتیب میزان ویژگی هرزنامه بودن هر ایمیل(ایمیل های اول ویژگی هرزنامه 

بودن بیشتری را دارند) نشان داده شده است.

-  برای اجرای برنامه ابتدا دو تابع ()write_start_unmergefile و ()main_dictionary را اجرا کرده تا فایل های مورد نیاز ساخته شده و سپس این 

دو تابع را کامنت کرده و تابع ()input_query را اجرا کرده تا خروجی را مشاهده کنید.

**۲- ارزیابی کارایی مدل:**

در سیستم پیشنهادی برای سنجش کارایی مدل از معیارهای Accuracy و Precision و Recall و Fmeasure  استفاده شده است در زیر 

خلاصه ای از مهمترین فرمول ها و معیارهای ذکر شده است:

| Accuracy|Precision  |Recall |Fmeasure|
|:-----------------|:----------------:|:---------------:|:-----------:|
| TP+TN / TP+FP+TN+FN | TP / FP+TP| TP / FN+TP| 2Recall.Precesion / Recall+Precesion|


- معیار *prescision* نسبت تعداد پیام هایی است که به درستی دسته بندی شده اند و از دسته های هرزنامه هستند به تعداد کل پیام های شناسایی شده به عنوان هرزنامه.

- معیار  *recall*  نسبت تعداد کل پیام های شناسایی شده به عنوان هرزنامه به تعدا د کل پیام هایی است که واقعا جزء دسته هرزنامه ها می باشند.

- معیار *accuracy*   نسبت تعداد هرزنامه ها و ایمیل های درست تشخیص داده شده به تعداد کل هرزنامه ها و ایمیل هایی که وجود دارند.

- معیار *fmeasure*  ترکیبی از recall و precision  است.

**در ادامه , برای بررسی دقت عملکرد روش پیشنهادی , از معیارهای بالا بر روی یک نمونه پایگاه داده اطلاعاتی استفاده می شود:**

- نتیجه ی کد به ازای نمونه فایل ورودی DOCUMENT.txt(لینک فایل ورودی در بالا ذکر شده است):

| Accuracy|Precision  |Recall |Fmeasure|
|:-----------------|:----------------:|:---------------:|:-----------:|
|0.5|0.6|0.4|0.5|


**- استفاده از الگوریتم next phrase :**
در قسمت قبلی ؛ هرزنامه ها به ترتیبی نشان داده می شدند که تکرار کلمات stop word در ان ها بیشتر است ولی همان طور که می دانیم stop word شامل جمله نیز می باشد پس باید جمله ها را نیز در نظر بگیریم بدین منظور در یک دیتابیس جمله ها را ذخیره کرده و در سندهایی که به عنوان هرزنامه تشخیص داده شدند وجود این جمله ها را نیز در ان بررسی میکنیم و در صورت و جود ان ها و تعداد تکرارشان به میل مورد نظر امتیازی اضافه می شود البته در هنگام چک کردن این نکته را نیز در نظر داریم که ممکن یکسری جملات کلماتشان یکسان نباشد ولی مفهوم یکسانی داشته باشند بدین منظور هر جمله از stop word را با الگوریتم stemming ریشه گیری کرده و کلمات اضافه را نیز از ان ها حذف میکنیم تا به صورت جامع تری عمل مقایسه انجام شود.

- کد بهینه شده با الگوریتم next phrase:

+ https://github.com/pegah1/hazfeharznname/blob/master/TORKAMANDI_89551264.py 

+ نتیجه برنامه بدون در نظر گرفتن جملات هرزنامه:

![تصویر کد اولیه](http://nise.hostoi.com/up/c1e55ec7c43d.png)

+ نتیجه برنامه با در نظر گرفتن جملات هرزنامه:

![تصویر کد بهینه شده](http://nise.hostoi.com/up/198dfd0aef27.png)

همانطور که مشاهده می کنید ترتیب ایمیل ها ی نشان داده شده عوض شده است؛ در صورت خواندن متن ایمیل ها متوجه می شوید که جملات هرزنامه ی بیشتری در ایمیل های اول نوشته شده است.

- **استفاده از الگوریتم inverted_index برای افزایش سرعت عملکرد الگوریتم :**

زمانی که حجم فایل DOCUMENT شامل ایمیل ها زیاد است برای اینکه هر دفعه برای دسترسی به هر ایمیل به دیسک نرویم و فایل را  جست و جو کنیم با استفاده از این روش ایمیل های مورد نیاز را به ROM  آورده و تعداد دفعات رجوع  به DISK را کاهش می دهیم.
با استفاده از تابع ( ()p=f.tell) ادرس بایت خط قبل شروع هر سند را در هارد ذخیره کرده ایم که این کار در مواقعی که میخواهیم فقط یکسری از اسناد را بررسی کنیم مطلوب است " چون با دستور () f.seek  می توانیم بدون اینکه از اول corpus شروع به خواندن کنیم مستقیما به خط شروع هر ایمیل برویم.
از آن جایی که توضیح این روش نیاز به بیان جزییات الگوریتم استفاده شده است ؛ توضیحات بیشتر و جزیی را در فایل پی دی اف در سایت ذیل قرار داده ام و توصیه می کنم حتما مطالعه کنید روش جالبیه!!!:-)
+ https://github.com/pegah1/hazfeharznname/blob/master/harzname_document.pdf


# کارهای آینده

پیاده سازی روش های زیر است

**- تشخیص هرزنامه بر اساس یک روش ترکیبی که مبتنی بر چند فیلتر است:**

۱- حذف کلمات بی ارزش  ۲-ریشه یابی کلمات  ۳-استخراج ویژگی ها  ۴-کاهش ویژگی ها  ۵-ساخت مدل

**- تقویت روش بالا با استفاده از بررسی جملات هرزنامه **

**- فیلتر کردن هرزنامه ها بر اساس روش ترکیبی مبتنی بر الگوریتم های random forest و iterative pattern **

**- تشخیص هرزنامه بر اساس رفتار هرزنامه:**

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


**- تشخیص هرزنامه بر اساس استفاده از لیست سیاه:**
 
یکی از راه های رایجی که سربار محاسباتی هم ندارد استفاده کردن از لیست سیاه است.در این روش لیستی از آدرس های IP که به عنوان مبدا انتشار هرزنامه شناخته شده اند ؛ تهیه می شود.

# نتیجه گیری

در این جا برای پیاده سازی روشی؛ به منظور حذف هرزنامه از یک روش ترکیبی که مبتنی بر چند فیلتر است استفاده شده است .
با توجه به نتایج حاصل شده می توان چنین نتیجه گیری کرد که استفاده از یک روش ترکیبی برای فیلتر کردن و انتخاب ویژگی ها راه حل موثری می باشد. و با مقایسه ی  با کارهای قبلی انجام شده که صرفا کلمات مد نظر آن هاست می توان نتیجه گیری کرد که این روش توانایی بیشتری در شناسایی هرزنامه ها دارد که جملات را نیز در نظر می گیرد و به دلیل کاهش تعداد ویژگی های استخراج شده و استفاده از الگوریتم perterm-index که برای بررسی هر ایمیل به دیسک رجوع نکرده و حافظه زیادی مصرف نشود ؛ سرعت اجرا نیز افزایش یافته است.

# مراجع
+ Liu, Bing, and Lei Zhang. "A survey of opinion mining and sentiment analysis." Mining Text Data. Springer US, 2012. 415-463.
+ Blanzieri, Enrico, and Anton Bryl. "A survey of learning-based techniques of email spam filtering." Artificial Intelligence 
Review 29.1 (2008): 63-92.
+ Chih-Hung Wu, “Beahavior-based detection using neural networks”, Expert Systems with Applications: An International Journal. Vol.36, Issue 3, pp4321-4330. April 2009.
+ J. G. Hidalgo, M. M. LÛpez, and E. P. Sanz, Combining text and heuristics for
cost-sensitive spam filtering, in Proceedings of the Fourth Computational Natural Language
Learning Workshop, CoNLL-2000, Lisbon, Portugal, 2000, Association for Computational
Linguistics
+ G. Sakkis, I. Androutsopoulos, G. Paliouras, V. Karkaletsis, C. Spyropoulos,
and P. Stamatopoulos, Stacking classifiers for anti-spam filtering of e-mail, in Proceedings
of the 6th Conference on Empirical Methods in Natural Language Processing (EMNLP 2001),
L. Lee and D. Harman, eds., Carnegie Mellon University, 2001, pp. 44ó50.
+ P. Pantel and D. Lin, Spamcop: A spam classification & organization program, in Learning
for Text Categorization: Pap
+ محمد رزم آرا ٬ بابک اسدی ٬ مسعود نارویی ٬ منصور احمدی٬ سال ۱۳۹۱ ٬ ارایه یک روش نوین ترکیبی مبتنی بر چند فیلتر ٬ جهت افزایش قابلیت تشخیص هرزنامه ها  سال ۲۰۱۲  ٬ دومین همایش ملی مهندسی کامپیوتر ٬برق و فناوری اطلاعات ٬دانشگاه آزاد اسلامی واحد خمین

http://www.civilica.com/copied/IP/20140224/2165969/208619c8e9c8a97bb2fb684ee1882f9e 

+  الهام افسری یگانه ٬ بررسی الگوریتم تشخیص و توقیف هرزنامه ها بر اساس رفتار هرزنامه 

  http://www.civilica.com/copied/IP/20140223/2162060/b4f8b08d0b6ea11dec2032009c7cc509

+ Boosting Trees for Anti-Spam Email Filtering
Xavier Carreras and Llu's Marquez, TALP Research Center, LSI Department, Universitat Politecnica de Catalunya (UPC), Jordi Girona Salgado 1–3,Barcelona E-08034, Catalonia

http://arxiv.org/pdf/cs/0109015v1.pdf

+ Spam Filtering with Naive Bayes – Which Naive Bayes?

http://classes.soe.ucsc.edu/cmps242/Fall09/lect/12/CEAS2006_corrected-naiveBayesSpam.pdf

+ SVM-based Filtering of E-mail Spam with Content-specific Misclassification Costs

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.61.883&rep=rep1&type=pdf

+ M. Brown, W. N. Grundy, D. Lin, N. Cristianini, C. Sugnet, M. Ares, and .D Haussler, Support vector machine classification of microarray gene expression data, Tech. Report UCSC-CRL-99-09, University of California, Santa Cruz, 1999
+ S. Dumais, J. Platt, D. Heckerman, and M. Sahami, Inductive learning algorithms
and representations for text categorization, in Proceedings of 7th International Conference on
Information and Knowledge Management, 1998, pp. 229ó237.
+ Cisco 2008 Annual Security Report

# پیوندهای مفید
+ [پردازش زبان فارسی در پایتون](http://www.sobhe.ir/hazm)
+ [یادگیری ماشین در پایتون](http://scikit-learn.org)
+ [راهنمایی برای استخراج ویژگی از متن زبان طبیعی](http://pyevolve.sourceforge.net/wordpress/?p=1589)
+ [رده‌بندی متون با استفاده از کتابخانه Scikit-learn](http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html)
+ [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)
+ [NLTK](http://nltk.org)
+ https://github.com/spamkeywords/keywords/blob/master/keywords.txt
+ http://wiki.apache.org/spamassassin/Rules
+ http://webmarketingtoday.com/articles/spamfilter_phrases
+ http://wiki.apache.org/spamassassin/UsingOnWindows
+ http://www.flounder.com/mail_policies.htm
+ http://blog.hubspot.com/blog/tabid/6307/bid/30684/The-Ultimate-List-of-Email-SPAM-Trigger-Words.aspx.
+ http://spamassassin.apache.org/index.html
+ http://www.codeproject.com/Articles/456380/A-Csharp-SMTP-server-receiver
+ http://en.wikipedia.org/wiki/information_gain
+ http://encarta.msn.com/encnet/refpages/searchdetail.aspx?q=spam&pg=1&grp=art
+ http://www.ranks.nl/resources/stopwords.html
+ http://tartarus.org/martin/Porterstemmer