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

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

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

一、垃圾邮件分类

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

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

相关文章

来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4878
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4074
来自专栏杨龙飞前端

scrollto 到指定位置

2544
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4055
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2892
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3919
来自专栏落花落雨不落叶

canvas画简单电路图

64811
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2130
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5377

扫码关注云+社区