机器学习(十四) ——朴素贝叶斯实践

机器学习(十四)——朴素贝叶斯实践

(原创内容,转载请注明来源,谢谢)

一、垃圾邮件分类

垃圾邮件分类,即通过读取邮件的内容,并打上标记其是垃圾邮件或者是正常的邮件,进而判断新的一个邮件是否是垃圾邮件。

1、读取内容和内容简单处理

这里已经有现成的邮件的正文内容,其中25篇正常的邮件,25篇垃圾邮件,存放成txt的格式。因此,首先需要读取文件内容,并且进行字符串的分割、去除标点符号、去除空格,另外英文单词中,小于3个字母的单词,通常是一些介词、量词等,没有实际意义,这类词语也会过滤掉。另外为了保证一致性,需要将单词全部转成小写。

看到这个return的内容,感慨一下python的便利性。其把for循环、字符串长度判断、字符串小写用一行全部概括进去。

但是另外也要吐槽一下python的版本问题,书上的是python2,我用的python3,导致文件读取那个内容一开始一直报错。后来才查到python3要用下图的codecs的方式来进行处理。

2、邮件分类

首先就是调用上一步的函数,循环读取全部的txt内容。这里由于文件名保存的很有规律性,所以可以用for循环直接来读取。

由于将正常邮件和垃圾邮件存放在两个路径下,因此读取的时候,可以来区分正常的邮件和垃圾邮件。

这里用到3个存放内容的数组。docList数组是由若干集合组成,每一个集合是一篇文章拆成的单词的集合,因此一个元素代表一篇文章;classList与docList对应,是给docList的每篇文章打上标签,1代表垃圾邮件,0代表正常邮件;fullText是所有邮件正文内容去重后的集合。

3、留存交叉验证

接下来,就用到交叉验证的思想。现在有50篇邮件正文,可以理解为50个样本,为了测试分类算法的正确性,这里随机预留了10个样本,不参与训练,用于最后的测试过程。

下面的这个del删除,是删除训练集对应的下标,使得后面遍历训练集的时候,就会跳过留作测试的样本,不参与训练。

剩余的样本,都参与训练,分类器采用之前写好的贝叶斯分类器,得到每个邮件是垃圾邮件的概率、不是垃圾邮件的概率,以及所有邮件中垃圾邮件所占的比重。

p(ci|w)=p(w|ci)*p(ci)/p(w),参考条件概率的这个公式,w表示的是一个向量,在这里就是所有邮件中的特征,c的值有两个,即c=0和c=1。

这里如果拷贝for循环的代码,多粘几次,实际上是加大训练的样本数量,对于本次的训练效果会更好一些。但是实际上还是需要更多的数据来分析。

4、测试训练结果

将刚才留下来的10个样本,放在这里参与测试,得到算法中计算的结果;对照刚开始拼接数据的时候,存留的数据,即实际上的数据。通过比较,就可以知道是否判断错误,并且可以计算错误率。

下面是实际运行结果。

二、从rss源中分析地区常用词语

1、需求

现在有两个rss的源,是两个地区的人发布的广告内容。现在要做的事情是读取这两个地区的rss源,分析各自对应的地区最常用的英文单词。

2、读取rss源

这里用到python的包feedparser。这个包可以通过官网下载后本地安装,不过我更推荐的是anaconda,通过它,只需要在命令行输入conda install feedparser,就可以自动下载并安装上对应的python版本的包,非常便捷。

通过parse,读取rss的内容,并且转化成数组。需要注意的是,rss的内容是一直在变化的,因此在一个完整的判断流程中,为了确认判断的效果,需要有一个稳定的内容,故在一个完整的流程中,只能读取1次rss源,确保后面的判断都是基于同一个内容。

3、根据内容判断词频

由于这个项目的需求是判断两个地区最常用的单词,但是英文单词中常常有介词、量词等,这些词所有说英语的人都会很常用,故会造成干扰,这里做的是找出前30个频率最高的词并返回,后面的内容对应的就是删掉这些高频的词。

4、分类

这里的分类和上面邮件的分类非常相似,下面只说一些区别的地方。

区别主要有三点:1、数据源来自rss而不是txt文档,这个上面已经有了读取方式;2、这里需要删除高频词汇;3、由于判断的是词频,因此必须要用前面提到的词带模型,而不能用词集模型,即不能仅仅记录每个单词是否出现,还需要记录每个单词出现的次数。

5、分析地区常用词汇

通过上面的计算的概率进行分类。由于这里计算概率是取对数的结果,对数中值为-6,反过来计算后会发现概率约等于0。因此这里用大于-6作为判断存在这个词汇。然后再通过概率进行排序,得到每个地区的最常用的词汇。

下面是运行结果。其实可以发现这样效果并不是很好,主要原因在于,第一步删除通用词汇,只通过取前30个高频词汇删除,实际这样还不够。

实际的做法,需要有一个英文常用词汇表,再把rss读取到的内容中,删除所有词汇表中包含的内容,这样才会更精确。

三、总结

这里的两个项目都有可以改进的地方。

1、对于邮件分类系统而言,最大的问题在于数据量太少,当出现其他词汇的时候,就无法进行判断,因此需要加大样本数量。

2、对于rss来区分地区常用词汇的系统而言,关键的内容在于英文常用词汇的判定,需要一个常用词汇表来进行。

3、对于朴素贝叶斯的算法,核心就在于理解贝叶斯计算的公式,其他内容实际上都是围绕着贝叶斯的公式进行的。

——written by linhxx 2018.01.14

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2018-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

【学术】不懂神经网络?不怕,一文教你用JavaScript构建神经网络

AiTechYun 编辑:xiaoshan.xiang 本文的内容并不是关于神经网络的深度教程,在这里既不会深入研究输入层、激活函数的内部原理,也不会教你如何使...

35140
来自专栏吕晟的专栏

机器学习库初探之 TensorFlow

什么是TensorFlow?TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表...

77410
来自专栏数据魔术师

运筹学教学|运输问题代码分享(C++代码及详细注释)

经过了长时间的学习……小编终于学会了运输问题(Transportation Problem),可以说是很骄傲了!然而……今天老板突然给了小编一个规模巨大的问题去...

58970
来自专栏深度学习之tensorflow实战篇

数据挖掘PageRank算法(网页排名原理)及Map-Reduce实现

方法/步骤 1 一、什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google...

47390
来自专栏媒矿工厂

基于MCMC的X265编码参数优化方法

新一代视频编码标准,包括高效视频编码HEVC和音频视频编码标准AVS2近年来已被提出以进一步提高H.264/AVC编码标准的压缩性能。在相同的主观视觉的前提下,...

33230
来自专栏机器之心

教程 | 如何通过PyTorch上手Tensor Comprehensions?

选自pytorch 作者:Priya Goyal等 机器之心编译 参与:乾树、黄小天 Tensor Comprehensions 是一个降低高性能代码编写门槛的...

31870
来自专栏ATYUN订阅号

NLP项目:使用NLTK和SpaCy进行命名实体识别

命名实体识别(NER)是信息提取的第一步,旨在在文本中查找和分类命名实体转换为预定义的分类,例如人员名称,组织,地点,时间,数量,货币价值,百分比等。NER用于...

92740
来自专栏华章科技

以卖香蕉为例,从4个方面了解SQL的数据汇总

导读:面对一个新数据集时,人们往往会关心数据中的异常值、数据的分布形式、行列之间的关系等。SQL是一种专为数据计算设计的语言,其中已经内置了许多数据汇总函数,也...

9430
来自专栏PPV课数据科学社区

数据挖掘系列(4)使用weka做关联规则挖掘

前面几篇介绍了关联规则的一些基本概念和两个基本算法,但实际在商业应用中,写算法反而比较少,理解数据,把握数据,利用工具才是重要的,前面的基础篇是对算法的理解,这...

51860
来自专栏BestSDK

Pytorch 0.3.0 发布:新增张量函数,支持模型移植

根据官方文档的介绍,此次增加了多个函数和功能,多方面的性能均实现提升。 重大变更 0.3 版本中删掉了 Variable.reinforce() 等随机函数,因...

37480

扫码关注云+社区

领取腾讯云代金券