数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

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

使用倍数判断是否是垃圾短信
计算特征项的概率
将短信抽象成特征项
朴素贝叶斯算法
基于概率统计的方法定义特殊单词
综合多条规则进行判断
判断短信是否符合规则
制定规则
将黑名单存储在服务器端
布隆过滤器减少内存消耗
使用散列表、二叉树等动态数据结构存储
维护黑名单
其他垃圾短信过滤和骚扰电话拦截方法
调整策略权衡准确率和召回率
结合三种过滤方式的结果进行精准拦截
应用到其他过滤、拦截领域
基于概率统计的过滤器
基于规则的过滤器
基于黑名单的过滤器
课后思考
总结引申
如何利用朴素贝叶斯算法过滤垃圾短信?

该思维导图由 AI 生成,仅供参考

上一节我们讲到,如何用位图、布隆过滤器,来过滤重复的数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信?
垃圾短信和骚扰电话,我想每个人都收到过吧?买房、贷款、投资理财、开发票,各种垃圾短信和骚扰电话,不胜其扰。如果你是一名手机应用开发工程师,让你实现一个简单的垃圾短信过滤功能以及骚扰电话拦截功能,该用什么样的数据结构和算法实现呢?

算法解析

实际上,解决这个问题并不会涉及很高深的算法。今天,我就带你一块看下,如何利用简单的数据结构和算法,解决这种看似非常复杂的问题。

1. 基于黑名单的过滤器

我们可以维护一个骚扰电话号码和垃圾短信发送号码的黑名单。这个黑名单的收集,有很多途径,比如,我们可以从一些公开的网站上下载,也可以通过类似“360 骚扰电话拦截”的功能,通过用户自主标记骚扰电话来收集。对于被多个用户标记,并且标记个数超过一定阈值的号码,我们就可以定义为骚扰电话,并将它加入到我们的黑名单中。
如果黑名单中的电话号码不多的话,我们可以使用散列表、二叉树等动态数据结构来存储,对内存的消耗并不会很大。如果我们把每个号码看作一个字符串,并且假设平均长度是 16 个字节,那存储 50 万个电话号码,大约需要 10MB 的内存空间。即便是对于手机这样的内存有限的设备来说,这点内存的消耗也是可以接受的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了利用朴素贝叶斯算法过滤垃圾短信的方法。作者讨论了基于黑名单、基于规则和基于概率统计的过滤器,并详细介绍了利用朴素贝叶斯算法将短信内容抽象成特征项,并利用概率来判断短信是否是垃圾短信的过滤方法。文章还引申讨论了如何结合不同的过滤方式以提高垃圾短信的准确过滤。通过介绍不同的过滤方法,展示了如何利用朴素贝叶斯算法和概率统计来解决垃圾短信过滤的问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(44)

  • 最新
  • 精选
  • C_love
    为啥P(W1W2...Wn|垃圾短信)是独立事件,能够拆成乘积,而P(W1W2...Wn)不是独立事件?

    作者回复: 也是也是。

    2019-01-14
    8
    19
  • Clement
    图片上的数据和公式使用什么软件画出来的?

    编辑回复: iPad Paper

    2019-01-21
    6
  • ferry
    将短信内容中的分词假设为完全独立是不是不太符合实际情况呢?是否应该使用多元文法,假设为分词与前若干个分词相关呢?

    作者回复: 你说的也没错,不过那样就复杂了。

    2019-06-11
    3
  • ldd
    请问,基于黑名单的过滤方式,用布隆过滤器只能存储Bool值,即是否存储,但是还要实现“标记次数来判断是否达到阈值”,就需要额外的散列表了,需要的内存空间依然很大,方案上还不如直接用散列表来的更好吧?

    作者回复: 你说的这是一种情况,大部分情况,都不会命中,也就说,都不是骚扰电话。

    2019-04-08
    3
  • lttzzlll
    上一节我们讲了,布隆过滤器最大的特点就是比较省存储空间,所以,用它来解决这个问题再合适不过了。如果我们要存储 500 万个手机号码,我们把位图大小设置为 10 倍数据大小,也就是 5000 万,那也只需要使用 5000 万个二进制位(5000 万 bits),换算成字节,也就是不到 7MB 的存储空间。比起散列表的解决方案,内存的消耗减少了很多。 这段话中:对于需要使用的内存空间有疑问,按照上一节的处理方式,把手机号码转换为整数,使用的内存空间应该是整数的范围 * 10 bits, 而不是手机号的数量 * 10 bits? 或者,这里不把手机号码转化为整数,用其他的哈希方法,把这500w个手机号映射到[0, 500W)这个区间内?

    作者回复: 布隆过滤器本身就是解决位图消耗空间比较多的问题。位图的大小是数据的范围。而布隆过滤器的大小应该是小于位图大小的,所以肯定就是数据的范围了。

    2019-02-17
    2
    2
  • 罗洲
    我觉得这种分类过滤,最好的可能是机器学习,通过大量的垃圾短信样本来训练特征,最后可以达到过滤短信和邮件的目的,而且这种方法应该效果更好,至于电话拦截,实际上就是电话号码黑名单的问题,我觉得用布隆过滤器可以满足通用场景,一般实际场景中,对于这种电话是提示谨慎接听,但是我们可以本地和云端结合处理,解决部分的误报问题,当判断是黑名单的时候再去云端查,确认是否是真的黑名单。这样用布隆过滤器+云端也是一种方式
    2019-01-11
    5
    83
  • slvher
    对于短信文本,机器学习尤其是 NLP 方向的很多算法可用于 anti-spam。文本分类任务,特征工程做得稍用心的话,判别式模型(典型如 logistic regression)的效果通常好于生成式模型(典型如 naive-bayes)。 对于电话号码数字,感觉用正则或定时拉取黑名单比 ml 模型简单可靠。
    2019-01-11
    1
    26
  • 纯洁的憎恶
    黑名单过滤法基于经验判断,难以确保及时性。基于内容规则的过滤法容易被针对,而且动态调整规则的成本较高。基于朴素贝叶斯算法的内容概率过滤法,既可以确保及时性,又能够较好的基于实际情况的变化而变化,具备初步智能特性。因为贝叶斯方法是基于先验判断,然后根据现实反馈动态调整判断的算法。 当绝对值不好计算时,可以结合场景需要,合理使用相对值代替绝对值,以简化计算难度、消除无法计算的因子。
    2019-01-11
    17
  • 🐱您的好友William🐱
    1.为啥叫naive:因为假设了条件分布中各个feature是独立出现的,feature之间啥关系没有!所以很naive,很朴素,很“傻”,但是效果真的不一定差,而且在没开发出更好的模型之前直接进行统计计算就能得出结果,且可以做成online的,怎么看都不亏啊(反正你也得用统计数据做其他的事,顺道做了呗老弟)! 2.如果概率为0了怎么办!可以使用laplacian smoothing,简单的来说就是在分子分母上面加数来保证不会有0的出现。直接使用很小的数是可以的(遵循频率学派频率为大),但更精确的在分母分子上加什么,这个其实是与贝叶斯学派所认为的先验分布有关,就是在不看sample时,我们的先验知识对这种情况的估计是多少(比如我在不统计工科学校男女比例的时候就有了一定的先验知识:7:1,之后我再统计其实是对我的先验估计的一种调整)。
    2019-01-21
    1
    12
  • 小新村小学扛霸子
    P(W1,W2...Wn同时出现在一条短信中) = P(W1出现在短信中) * P(W2出现在短信中) *....* P(Wn出现在短信中)这样计算应该就可以吧
    2019-04-25
    4
    10
收起评论
显示
设置
留言
44
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部