辽宁城乡住房建设厅网站打不开,团购汽车最便宜的网站建设,羽毛球赛事直播app,前端入职后很痛苦文章目录1. 基于黑名单过滤2. 基于规则过滤3. 基于概率统计过滤4. 总结上一节我们讲到#xff0c;如何用位图、布隆过滤器#xff0c;来
过滤重复数据。今天#xff0c;我们再讲一个跟过滤相关的问题#xff0c;如何过滤垃圾短信#xff1f;1. 基于黑名单过滤
可以维护一…
文章目录1. 基于黑名单过滤2. 基于规则过滤3. 基于概率统计过滤4. 总结上一节我们讲到如何用位图、布隆过滤器来
过滤重复数据。今天我们再讲一个跟过滤相关的问题如何过滤垃圾短信1. 基于黑名单过滤
可以维护一个骚扰电话号码和垃圾短信发送号码的黑名单。
黑名单的搜集有很多途径比如公开的网站下载用户自主标记。标记个数超过一定阈值的号码我们就可以定义为骚扰电话并将它加入到我们的黑名单中。如果黑名单中的电话号码不多的话我们可以使用散列表、二叉树等动态数据结构来存储对内存的消耗并不会很大。如果我们把每个号码看作一个字符串并且假设平均长度是16个字节那存储50万个电话号码大约需要10MB的内存空间。对于手机这样的内存有限的设备来说这点内存的消耗也是可以接受的。黑名单中的电话号码很多呢比如有500万个。这个时候如果再用散列表存储就需要大约100MB的存储空间。为了实现一个拦截功能耗费如此多的手机内存显然有点不合理。布隆过滤器最大的特点就是比较省存储空间所以用它来解决这个问题再合适不过。如果我们要存储500万个手机号码我们把位图大小设置为10倍数据大小也就是5000万那也只需要使用5000万个二进制位5000万bits换算成字节也就是不到7MB的存储空间。比起散列表的解决方案内存的消耗减少了很多。时间换空间把黑名单存储在服务器端上把过滤和拦截的核心工作交给服务器端来做。手机端只负责将要检查的号码发送给服务器端服务器端通过查黑名单判断这个号码是否应该被拦截并将结果返回给手机端。这个解决思路完全不占用手机内存。不过网络通信是比较慢的所以网络延迟就会导致处理速度降低。而且必须联网。布隆过滤器会有判错的概率如果它把一个重要的电话或短信当成垃圾拦截了对于用户来说这是无法接受的。这是一个很大的问题。
2. 基于规则过滤
如果某个垃圾短信发送者的号码并不在黑名单中那这种方法就没办法拦截了。所以基于黑名单的过滤还不够完善再继续看基于规则的过滤。
通过短信的内容来判断是垃圾短信。预先设定一些规则如果短信符合这些规则就判定它是垃圾短信。规则可以有很多比如
短信中包含特殊单词或词语比如一些非法、淫秽、反动词语等发送号码是群发号码非正常的手机号码比如60389585短信中包含回拨的联系方式比如手机号码、微信、QQ、网页链接等因为群发短信的号码一般都是无法回拨的短信格式花哨、内容很长比如包含各种表情、图片、网页链接等符合已知垃圾短信的模板。与模板匹配就可以判定为垃圾短信。
可以综合多条规则进行判断。比如满足2条以上才会被判定为垃圾短信 或者每条规则对应一个不同的得分某条短信的总得分超过某个闽值才会被判定为垃圾短信。
以上规则还有很多细节需要处理。比如第1条规则中我们该如何定义特殊单词第2条规则中我们该如何定义什么样的号码是群发号码等等。
这里只讲一下如何定义特殊单词 可以基于概率统计的方法借助计算机强大的计算能力找出哪些单词最常出现在垃圾短信中将这些最常出现的单词作为特殊单词用来过滤短信。 这种方法的前提是有大量的样本数据也就是说要有大量的短信比如1000万条短信并且每条短信都做好了标记它是垃圾短信还是非垃圾短信。
对这1000万条短信进行分词处理借助中文或者英文分词算法去掉“的、和、是”等没有意义的停用词Stop words得到n个不同的单词。针对每个单词统计有多少个垃圾短信出现了这个单词有多少个非垃圾短信会出现这个单词求出每个单词出现在垃圾短信中的概率以及出现在非垃圾短信中的概率。如果某个单词出现在垃圾短信中的概率远大于出现在非垃圾短信中的概率就把这个单词作为特殊单词。
3. 基于概率统计过滤
基于规则的过滤器看起来很直观也很好理解但是它也有一定的局限性。一方面这些规则受人的思维方式局限规则未免太过简单另一方面垃圾短信发送者可能会针对规则精心设计短信绕过这些规则的拦截。对此我们再来看一种更加高级的过滤方式基于概率统计的过滤方式。
基于概率统计的过滤基础理论是基于朴素贝叶斯算法。先通过一个非常简单的例子来看下什么是朴素贝叶斯算法 假设事件A是“小明不去上学”事件B是“下雨了”。我们现在统计了一下过去10天的下雨情况和小明上学的情况作为样本数据。 我们来分析一下这组样本有什么规律。在这10天中有4天下雨所以下雨的概率PB4/10。10天中有3天小明没有去上学所以小明不去上学的概率PA3/10。在4个下雨天中小明有2天没去上学所以下雨天不去上学的概率PA|B2/4。在小明没有去上学的3天中有2天下雨了所以小明因为下雨而不上学的概率是PBIA2/3。实际上这4个概率值之间有一定的关系这个关系就是朴素贝叶斯算法我们用公式表示出来就是下面这个样子。 我们需要把短信抽象成一组计算机可以理解并且方便计算的特征项用这一组特征项代替短信本身来做垃圾短信过滤。
可以通过分词算法把一个短信分割成n个单词。这n个单词就是一组特征项全权代表这个短信。因此判定一个短信是否是垃圾短信就变成了判定同时包含这几个单词的短信是否是垃圾短信。 不过这里并不像基于规则的过滤器那样非黑即白。我们使用概率来表征一个短信是垃圾短信的可信程度。 尽管有大量的短信样本但是我们没法通过样本数据统计得到这个概率。你可能会说我只需要统计同时包含W1W2W3……Wn 这n个单词的短信有多少个我们假设有x个然后看这里面属于垃圾短信的有几个假设y个那包含W1W2W3……Wn 这n个单词的短信是垃圾短信的概率就是y/x。
But实际情况样本中不会有太多同时包含W1W2W3……Wn 的短信的甚至根本不存在这样的短信。没有样本也就无法计算概率。
这个时候朴素贝叶斯公式就可以派上用场了。通过朴素贝叶斯公式将这个概率的求解分解为其他三个概率的求解。如下。那转化之后的三个概率是否可以通过样本统计得到呢 PW1W2W3……Wn 同时出现在一条短信中 | 短信是垃圾短信这个概率照样无法通过样本来统计得到。但是我们可以基于下面这条著名的概率规则来计算。 独立事件发生的概率计算公式PABPAX PB 事件A和事件B是独立事件两者的发生没有相关性那两个同时发生的概率 PA*B就等于 PA*PB。 基于这条独立事件发生概率的计算公式把PW1W2W3……Wn 同时出现在一条短信中 | 短信是垃圾短信分解为下面这个公式 其中PWi 出现在短信中 | 短信是垃圾短信表示垃圾短信中包含Wi 这个单词的概率有多大。
P短信是垃圾短信把样本中垃圾短信的个数除以总样本短信个数。
不过PW1W2W3……Wn 同时出现在一条短信中这个概率还是不好通过样本统计得到原因前面说过了样本空间有限。不过我们没必要非得计算这一部分的概率值。为什么这么说呢
实际上我们可以分别计算同时包含W1W2W3……Wn 这n个单词的短信是垃圾短信和非垃圾短信的概率。假设它们分别是 P1 和 P2。我们可以通过对比 P1 和 P2 值的大小来判断一条短信是否是垃圾短信。如果 P1 是 P2 的很多倍比如10倍我们确信这条短信是垃圾短信。 在求解 P1 和 P2 倍数P1/P2的时候我们也就不需要这个值。
4. 总结
今天讲了基于黑名单、规则、概率统计三种垃圾短信的过滤方法这三种方法还可以应用到很多类似的过滤、拦截的领域比如垃圾邮件的过滤等等。
在讲黑名单过滤的时候我讲到布隆过滤器可能会存在误判情况可能会导致用户投诉。
实际上我们可以结合三种不同的过滤方式的结果对同一个短信处理如果三者都表明这个短信是垃圾短信才把它当作垃圾短信拦截过滤这样就会更精准。
在实际的工程中还需要结合具体的场景以及大量的实验不断去调整策略权衡垃圾短信判定的准确率是否会把不是垃圾的短信错判为垃圾短信和召回率是否能把所有的垃圾短信都找到来实现我们的需求。