垃圾短信邮件判断算法

垃圾短信,垃圾邮件和推销的电话使我们深受其扰,不过也有些手机软件助手,可以帮助我们垃圾这些垃圾短信和电话,这些软件的背后的算法是什么?

一 黑名单

像360手机卫士这种APP在手机本地或云端保存一份电话的手机黑名单数据,来电的时候手机判断下就可以决定是否为骚扰电话了,本地存储,黑名单的数据量如果很大的话,可能会占内存比较大,不过这个可以借鉴以前的布隆过滤器这种数据结构来解决,但是布隆过滤器有误判的可能,有可能来电非黑名单却当成黑名单进行处理了,这对于拦截软件来说是比较严重的问题,所以可能是多种方法来结合判断,或者对于布隆过滤判断是属于黑名单的电话,再通过一次联网到网上的云端再判断一次是否为真正为黑名单用户,不过这就需要联网,还存在延迟的可能;对于布隆过滤器判断为正常用户的,则一定是正常用户,那么大部分时间是不需要联网判断或结合其他办法判断的。

二 规则判断

像很多病毒检测软件,或IDS或WAF软件一样,垃圾短信和骚扰电话 也可以建立自己的规则库,通过规则库进行垃圾短信的判断,同样像IDS等软件存在误判的情况一样,垃圾短信采用规则判断的话,也存在一定的误判性,一般也要结合其他的判断规则综合判断。
规则有下面几个:

短信中包含特殊词语,比如非法,反动词语。
短信发送的号码是群发号码,非我们正常的手机号码。
短信很长,包含很多图片表情,网页链接等。
电话号码非正常形式,比如+702233等

凡是规则判断,都存在着检测死板,不能检测到不在规则里面的情况,而且会被有心者特意设计避开规则的垃圾短信等。

三 基于统计信息进行垃圾短信判断

直观地想一下,垃圾短信,垃圾邮件这些一般都包含特定的词语,或者链接等,那么我们反过来统计邮件中特定的词语的数量,达到一定标准,我们就判断为垃圾邮件。
现在对于这种垃圾邮件的判断问题,一般都通过机器学习来解决,在机器学习的算法中,做垃圾邮件判断这个是属于一个二分类问题,可以用很多中算法来解决,常用的有决策树,贝叶斯,SVM,神经网络等,其中贝叶斯算法是属于一个基于统计学的算法,也是本次要介绍的算法。

贝叶斯算法是为了解决“逆序概率”的问题,举个简单的例子,比如我们袋子中有10个红球,8个白球,然后随机从袋子中拿出一个球,问是红球的概率是多少?这是一个非常简单的概率问题,结果就是10/(10+8),这种正向概率问题比较好理解。那么反过来,如果我们只知道袋子中有红球和白球,但是不知道数量和比例,我们拿了几次球,通过拿出这些球的颜色是否可以推断出袋子中两种球的比例那?

贝叶斯算法中有些根据以前经验总结出来的概率,称为先验概率,可以理解成先前的经验的概率,所以叫先验概率,比如清明时节一般会下雨,下雨的概率大概为70%,这就是通过以前的经验总结的;
后验概率, 是事情发生了,推测可能原因,比如小明迟到了,那么起晚了造成迟到的概率假设为30%,这就是后验概率。条件概率,就是在一个事情假设A发生的情况下,另外一个事情B也发生的概率,记作P(B|A),读作在A发生的情况下,B发生的概率,比如起晚的情况下,小明迟到的概率。
总结一句话:先验概率是经验总结,后验概率是由果推因,条件概率是由因推果。

根据条件概率的定义,可以推导出贝叶斯公式,推导过程在百科里面如下:


贝叶斯公式推导

说明:
1)P(A|B) = A和B同时发生的概率/B发生的概率,直观想下,B发生的概率一定大于A和B同时发生的概率,相除的含义就是在B发生的概率情况下,有多少A也同时发生的概率,也就符合了条件概率的定义。
2)把除法变乘法就得到了合并后的式子,再变化下,就得到了贝叶斯公式。

可能还比较抽象,举个wiki上的例子:

一所学校里面有 60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。有了这些信息之后我们可以容易地计算“随机选取一个学生,他(她)穿长裤的概率和穿裙子的概率是多大”,这个就是前面说的“正向概率”的计算。然而,假设你走在校园中,迎面走来一个穿长裤的学生(很不幸的是你高度近似,你只看得见他(她)穿的是否长裤,而无法确定他(她)的性别),你能够推断出他(她)是女生的概率是多大吗?

我们用两种算法进行计算,一是自己直观想,二是用朴素贝叶斯。
假设学校一共有U个人,直观想法计算:
P(是女生|穿裤子) = 所有穿裤子的女生数量/所有穿裤子的人数
= U*0.4(女生数量)*0.5(一半穿裤子) / (U*0.4*0.5 +U*0.6*1)
= 0.2*U /0.8*U = 25%

如果用朴素贝叶斯算法:
P(是女生|穿裤子) = P(穿裤子|是女生) *P(是女生)/P(穿裤子)
= 0.5*0.4/[(0.6*1 +0.4*0.5)/1]
= 0.2 /0.8
= 25%
说明: P(穿裤子) = 穿裤子人数/总人数= U*0.6*1 + U*0.4*0.5/U = 80%
这样看起来,朴素贝叶斯公式也不是很难。

具体来看下垃圾邮件的分类问题:我们用D表示一封邮件,D是由很多单词组成。用f+表示是垃圾邮件,用f-表示是正常邮件,根据贝叶斯公式,问题形式化:

P(f+|D) = P(D|f+)*P(f+)/P(D)
p(f-|D) = P(D|f-)*P(f-)/P(D)

其中P(f+)和P(f-)比较容易得到,算下一个邮箱里面有多少个是垃圾邮件,多少个是正常邮件即可,不过最好多找几个,算下平均值,这就是所谓的先验概率。
P(D|f+) 表示是垃圾邮件,单词出现的概率,把D展开成N个单词就是:
P(d1,d2,d3...dn|f+) 即垃圾邮件中,同时出现这些单词的概率,这个没办法求,假设这些单词之间是独立的,没有什么关联关系,那么P(d1,d2,d3...dn|f+) 就可以扩展为P(d1|f+)* P(d2|f+)P(d3|f+)....P(dn|f+) 这个里面的独立假设,就是朴素贝叶斯的朴素来源,因为不是那么精确,所以叫朴素。计算一个单词在垃圾邮件中出现的概率就比较简单了。

翻译一下:
P(垃圾邮件|单词d1,单词d2...单词dn同时出现) =[ P(单词d1,单词d2...同时出现|是垃圾邮件)*P(是垃圾邮件)]/P(单词d1,单词d2...同时出现在一封邮件里面)
根据独立假设:
P(垃圾邮件|单词d1,单词d2...单词dn同时出现) =[ P(单词d1出现|是垃圾邮件)*P(单词d2出现|是垃圾邮件)*P(单词d3出现|是垃圾邮件)...*P(是垃圾邮件)]/P(单词d1,单词d2...同时出现在一封邮件里面)
其实我们在判断是否是垃圾邮件的时候,并一定要计算出来P(单词d1,单词d2...同时出现在一封邮件里面),这个也无法精确计算,我们只需要比较垃圾邮件的概率和非垃圾邮件的概率,取大的那一个就可以了,那么久只要计算:
P(垃圾邮件|单词d1,单词d2...单词dn同时出现) =[ P(单词d1出现|是垃圾邮件)*P(单词d2出现|是垃圾邮件)*P(单词d3出现|是垃圾邮件)...*P(是垃圾邮件)]
P(正常邮件|单词d1,单词d2...单词dn同时出现) =[ P(单词d1出现|是正常邮件)*P(单词d2出现|是正常邮件)*P(单词d3出现|是正常邮件)...*P(是正常邮件)]

四 实际操作步骤

1.找到N封邮件,标记好垃圾邮件和非垃圾邮件。
2.对N封邮件进行去掉停词部分,然后采用分词算法做分词。
3.分别计算每个词在垃圾邮件中出现的比例,在正常邮件中出现的比例
4.带入公式算下哪个概率相对大一些,就属于哪个分类。

这里面总结的比较简单,贝叶斯算法,还有很多没有说到,我也理解的不够深刻,先只聊点这种简单的吧,下一篇将找个例子实战下朴素贝叶斯算法。

参考:
1.数据结构和算法之美:概率统计
2.数据分析实战:朴素贝叶斯
3.平凡而又神奇的贝叶斯方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容