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

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

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

一、垃圾邮件分类

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

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 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

在hadoop2.0上实现深度学习

我承认我又偷懒了,只是大概写了下提纲,和完成了第一章节的部分写作。不睡午觉的恶果啊,原本已经写好草稿,讲讲语言和信息的关系,结果,实在是回家后好困。

682
来自专栏CDA数据分析师

一篇文章教你如何用R进行数据挖掘

引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来。得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本...

2065
来自专栏机器之心

资源 | 清华大学开源OpenKE:知识表示学习平台

30511
来自专栏社区的朋友们

老司机用神经网络带您安全驾驶

通过一定的方法,配合预训练好的网络,我们完全可以在自己的PC上训练出一个准确率较高、实用性也非常不错的网络。下面我就以Kaggle上的一个竞赛为例,带领各位司机...

6701
来自专栏ATYUN订阅号

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

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

1473
来自专栏AI科技大本营的专栏

深度学习框架哪家强?MXNet称霸CNN、RNN和情感分析,TensorFlow仅擅长推断特征提取

深度学习框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?对于这几大框架在运行各项深度任务时的性能差异如何,各位读者不免会有...

3363
来自专栏信数据得永生

《Scikit-Learn与TensorFlow机器学习实用指南》第2章 一个完整的机器学习项目

84217
来自专栏深度学习与计算机视觉

理解ResNet结构与TensorFlow代码分析

该博客主要以TensorFlow提供的ResNet代码为主,但是我并不想把它称之为代码解析,因为代码和方法,实践和理论总是缺一不可。 github地址,其中...

5827
来自专栏MelonTeam专栏

老司机用神经网络带您安全驾驶

0 概述 随着今年深度学习的热潮的来临,神经网络已经被应用在越来越多的应用中。而在印象中对于神经网络进行训练的往往需要借助大量的计算资源与数据。其实通过一定的...

2265
来自专栏机器学习-数据挖掘

基于日志分析的母机故障定位 ——机器学习应用

随着腾讯云业务的扩大,母机数量越来越多。为减少人力并实现母机故障的自动化定位,本文尝试利用机器学习算法,通过对历史故障母机的日志数据学习,训练模型实现自动化分析...

2724

扫码关注云+社区