概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

算法解析1. 基于黑名单的过滤器1,维护一个骚扰电话号码和垃圾短信发送号码的黑名单。①:如果黑名单中的电话号码不多,可以使用散列表、二叉树等动态数据结构来存储,对内存的消耗并不会很大 每个号码看作一个字符串,并且假设平均长度是 16 个字节,那存储 50 万个电话号码,大约需要 10MB 的内存空间,但当号码超过500万个时,使用散列表就需要100MB空间,这个对用户的手机而言是不可接受的。②:布隆过滤器最大的特点就是比较省存储空间,所以,用它来解决这个问题很合适 存储 500 万个手机号码,把位图大小设置为 10 倍数据大小,也只需要5000 万 bits,换算成字节不到 7MB 的存储空间③:还有一种时间换空间的方法,可以将内存的消耗优化到极致 把黑名单存储在服务器端上,服务器端来做过滤和拦截的核心工作。手机端只将要检查的号码发送给服务器端,服务器端将判断结果返回给手机端,但网络通信通常比较慢2. 基于规则的过滤器

1,基于规则的过滤方式
①:预先设定一些规则,如果某条短信符合这些规则,我们就可以判定它是垃圾短信
②:但如果短信只是满足其中一条规则,如果就判定为垃圾短信,会存在比较大的误判的情况。所以可以综合多条规则进行判断
③:或每条规则对应一个不同的得分,满足哪条规则,就累加对应的分数,某短信的总得分超过阈值,才会被判定为垃圾短信

2,难点问题
过滤规则要实到执行层面,其实还有很大的距离,还有很多细节需要处理,如第一条规则中,我们该如何定义特殊单词;第二条规则中,我们该如何定义什么样的号码是群发号码等等
3,具体细节
我们该如何定义特殊单词
虽然可以基于概率统计的方法,借助计算机强大的计算能力,找出哪些单词最常出现在垃圾短信中,将这些最常出现的单词,作为特殊单词,用来过滤短信。
不过这种方法的前提是,要有大量的样本数据,并且每条短信都做好了标记,它是垃圾短信还是非垃圾短信。
如对 1000 万条短信,
①,进行分词处理(借助中文或者英文分词算法),去掉“的、和、是”等没有意义的停用词(Stop words),得到 n 个不同的单词
②,针对每个单词,统计有多少个垃圾短信出现了这个单词,有多少个非垃圾短信会出现这个单词,进而求出每个单词分别出现在垃圾短信,非垃圾短信中的概率。
③,如果某个单词出现在垃圾短信中的概率,远大于出现在非垃圾短信中的概率,则可这个单词作为特殊单词,用来过滤垃圾短信
4,缺点问题
一方面,这些规则受人的思维方式局限,规则未免太过简单;
另一方面,垃圾短信发送者可能会针对规则,精心设计短信,绕过这些规则的拦截

  1. 基于概率统计的过滤器

1,理论基础
①:这种基于概率统计的过滤方式,基础理论是基于朴素贝叶斯算法
2,实践方法
①:基于概率统计的过滤器,是基于短信内容来判定是否是垃圾短信
②:需要把短信抽象成一组计算机可以理解并且方便计算的特征项,用这一组特征项代替短信本身,来做垃圾短信过滤
③:可以通过分词算法,把一个短信分割成 n 个单词。这 n 个单词就是一组特征项,全权代表这个短信。
④:因此,判定一个短信是否是垃圾短信的问题,就变成了,判定同时包含这几个单词的短信是否是垃圾短信
3,

使用概率,来表征一个短信是垃圾短信的可信程度。如果用公式将这个概率表示出来,就是下面这个样子:

尽管我们有大量的短信样本,但是我们没法通过样本数据统计得到这个概率。没有样本,也就无法计算概率。所以这样的推理方式虽然正确,但是实践中并不好用。所以我们需要通过朴素贝叶斯公式,将这个概率的求解,分解为其他三个概率的求解。

基于下面这条著名的概率规则来计算。

独立事件发生的概率计算公式:P(AB) = P(A)P(B)

如果事件 A 和事件 B 是独立事件,两者的发生没有相关性,事件 A 发生的概率 P(A) 等于 p1,事件 B 发生的概率 P(B) 等于 p2,那两个同时发生的概率 P(AB) 就等于 P(A)P(B)。
基于这条独立事件发生概率的计算公式,我们可以把 P(W1,W2,W3,…,Wn 同时出现在一条短信中 | 短信是垃圾短信)分解为下面这个公式:

在求解 p1 和 p2 倍数(p1/p2)的时候,我们也就不需要这个值。

你可能感兴趣的:(概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?)