机器学习(十四)
——朴素贝叶斯实践
(原创内容,转载请注明来源,谢谢)
一、垃圾邮件分类
垃圾邮件分类,即通过读取邮件的内容,并打上标记其是垃圾邮件或者是正常的邮件,进而判断新的一个邮件是否是垃圾邮件。
1、读取内容和内容简单处理
这里已经有现成的邮件的正文内容,其中25篇正常的邮件,25篇垃圾邮件,存放成txt的格式。因此,首先需要读取文件内容,并且进行字符串的分割、去除标点符号、去除空格,另外英文单词中,小于3个字母的单词,通常是一些介词、量词等,没有实际意义,这类词语也会过滤掉。另外为了保证一致性,需要将单词全部转成小写。
看到这个return的内容,感慨一下python的便利性。其把for循环、字符串长度判断、字符串小写用一行全部概括进去。
但是另外也要吐槽一下python的版本问题,书上的是python2,我用的python3,导致文件读取那个内容一开始一直报错。后来才查到python3要用下图的codecs的方式来进行处理。
2、邮件分类
首先就是调用上一步的函数,循环读取全部的txt内容。这里由于文件名保存的很有规律性,所以可以用for循环直接来读取。
由于将正常邮件和垃圾邮件存放在两个路径下,因此读取的时候,可以来区分正常的邮件和垃圾邮件。
这里用到3个存放内容的数组。docList数组是由若干集合组成,每一个集合是一篇文章拆成的单词的集合,因此一个元素代表一篇文章;classList与docList对应,是给docList的每篇文章打上标签,1代表垃圾邮件,代表正常邮件;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,反过来计算后会发现概率约等于。因此这里用大于-6作为判断存在这个词汇。然后再通过概率进行排序,得到每个地区的最常用的词汇。
下面是运行结果。其实可以发现这样效果并不是很好,主要原因在于,第一步删除通用词汇,只通过取前30个高频词汇删除,实际这样还不够。
实际的做法,需要有一个英文常用词汇表,再把rss读取到的内容中,删除所有词汇表中包含的内容,这样才会更精确。
三、总结
这里的两个项目都有可以改进的地方。
1、对于邮件分类系统而言,最大的问题在于数据量太少,当出现其他词汇的时候,就无法进行判断,因此需要加大样本数量。
2、对于rss来区分地区常用词汇的系统而言,关键的内容在于英文常用词汇的判定,需要一个常用词汇表来进行。
3、对于朴素贝叶斯的算法,核心就在于理解贝叶斯计算的公式,其他内容实际上都是围绕着贝叶斯的公式进行的。
——written by linhxx 2018.01.14
领取专属 10元无门槛券
私享最新 技术干货