# 基于 MapReduce 的朴素贝叶斯分类器
> Project 内容
>
> 1:用 MapReduce 算法实现贝叶斯分类器的训练过程,并输出训练模型;
>
> 2:用输出的模型对测试集文档进行分类测试。测试过程可基于单机 Java 程序,也可以是 MapReduce 程序。输出每个测试文档的分类结果;
>
> 3:利用测试文档的真实类别,计算分类模型的 Precision,Recall 和 F1 值。
# 一、贝叶斯分类器理论介绍
本次实验用朴素贝叶斯方法给文本文件分类,即给定一个类标签集合 C={c1,c2,…,cj}以及一个文档 d,给文档 d 分配一个最合适的类别标签 ci(i = 1, …, j)。
解决方法的基本思想就是对于类标签集合 C 中的每个类标签 ci (i = 1, …, j), 计算条件概率 p (ci |d),使条件概率 p (ci |d)最大的类别作为文档 d 最终的类别。
现在将文本分类问题变成计算条件概率 p (ci |d),要计算条件概率,就要用到概率论中的贝叶斯(Bayes)公式,这也是该方法名称的由来。贝叶斯公式如下所示:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/1087f1f359a6460920a42e22a5cb1036.writebug)
公式中的:p (ci|d)为后验概率或条件概率(posterior)、p (ci): 先验概率(prior)、 p (d|ci): 似然概率(likelihood)、p (d): 证据(evidence)。从公式中可以观察到, 当 p(d)是一定值时,后验概率 p (ci|d)取决于似然概率 p (d|ci )和先验概率 p (ci)。故贝叶斯可变为:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/47ce716c7d6553a2e94b642357ff3206.writebug)
由公式可知,后验概率 p (ci|d)与似然概率 p (d|ci )和先验概率 p (ci)的乘积成正比,要计算后验概率 p (ci|d)的最大值,只需计算 p(d|ci)p(ci)最大值即可。
首先先验概率 p(ci)有:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/ed8a2227860158b0c65b0c1c5afed91c.writebug)
为了计算似然概率 p(d|ci),需要 Term 独立性假设,即文档中每个 term 的出现都是彼此独立的,基与这个假设,基与这个假设,似然概率 p(d|ci):
![](https://www.writebug.com/myres/static/uploads/2021/12/13/d117b0d109223fa56b620e30def596c2.writebug)
因此,贝叶斯分类器是通过用训练集数据来计算先验概率 p(ci)和似然概率 p(d|ci),然后利用贝叶斯公式来预测文档 d 应该所属的类别标签 ci。
## 二、贝叶斯分类器训练的 MapReduce 算法设计
该算法实现过程流程和框架在 Main 这个类中定义,主要分三部分: 第一部分是训练过程,对训练集中数据进行训练,即求出每个类中文件数和每个类中的单词种类和数目,并将结果保存在相应文件夹下;第二部分是预测过程,先对测试测试集数据进行处理,然后通过第一部分的训练过程结果求出先验概率和条件概率,然后通过贝叶斯公式找后验概率的最大值来预测测试集文件的类别;第三部分是评估过程,通过第二部分预测的结果和每个预测集文件真实类别的结果来求出精确率 precision、召回率 recall 和 F1,以此判断该系统对文件分类的可靠性。
该系统共使用了 4 个 mapreduce 的过程,记为 job1、job2、job3、job4。在第一部分训练过程用了 job1 和 job2,job1 是用来统计每个类的文件数目,job2 的作用是统计每个类中出现单词数量。在第二部分预测过程中有 job3 和 job4,job3 是 job4 的一个准备过程,是对测试集数据进行欲处理,job4 过程用贝叶斯公式原理来预测文件类别。第三部分评估过程没有用 mapreduce 程序,而是直接用单机 Java 程序读取 job4 中的预测结果进行评估该系统的预测可靠性。
### 1 Job1
第一个 job 是用来统计训练集中每个类中的文件数目,要统计文件数目,在输入过程中文件就不应该被切分,因此要写一个 FileInputFormat 的子类(命名为 WholeFileInputFormat),该子类首先实现 isSplitable 为 false,然后重写其 RecordReader 方法,使其输入到 mapper 的 key 为文件类名, value 为文件内容。第一个 job 的输入文件是所有训练集,训练集下有四个文件夹,每个文件夹名都代表其类名,每个文件夹下有若干文件,这些文件都输入该类的。在 FileInputFormat 中文件不被切片,直接整个文件传入 map 中,map 输入的 key 值就是文件类名,因此 map 的处理过程比较简单,只需要将输出设为 < 文件类名,1>。Map 的输出丢到上下文中,会经过 shuffle 过程将 key 值相同的 value 合并为一个集合作为 reduce 的输入,在 reduce 中将合并的 value 集合进行数量统计得到的总和即是该类中文件的总数目, 并将其作为新的 value 从 reduce 输出。最后 reduce 的输出保存到 hdfs:
//master/output/output1 下的 part-r-00000 文档中,格式为:类名 文件数目。
Job1 的 dataflow 示意图如下所示:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/3f4cd2cec1d48024ce6ede6cec9faf40.writebug)
### 2 Job2
图 3.1:Job1 DataFlow 示意图
第二个 job 是用来统计每个类中出现的各个单词的总数,其输入和 Job1 一样都是训练集的所有文件。Job2 执行时会找到训练集中的每个文件, 读取每个文件的内容并切片,将每行的偏移量和行内容作为该 job 中的 map 输入,map 获取每个文件的类名,并将每个 value 转行成相应的单词,将类名和单词拼接作为新的 key 值,最后 map 的输出为:<< 类名,单词 >, 1>。Map 的输出丢到上下文中,经过 shuffle 处理,将相同 key 值的 value 合并为一个集合作为 reduce 的输入,在 reduce 中将合并的 value 集合进行 数量统计得到的总和即是类中该单词出现的总次数,然后 reduce 的输出为
```
<< 类名, 单词> , 该单词出现次数> , 将其写到输出文件 hdfs :
```
//master/output/output3 的 part-r-00000 文档中。
Job2 的 dataflow 示意图如下所示:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/138207b3f64ddfcd3dbe389cea420c51.writebug)
### 3 Job3
图 3.2:Job2 DataFlow 示意图
第三个 Job 是对测试集数据进行预处理,为接下来文件分类做准备,将测试集的文档内容汇总为 << 类名,文档名 >, 单词 1,单词 2, ……> 进行输出。该 Job 的输入是测试集的所有文件,读取每个文件的内容并切片,将每行的偏移量和行内容作为该 job 中的 map 输入,map 获取每个文件的类名和文件名,并将其拼接为新的 key 值输出,每个 value 转行成相应的单词,最后 map 的输出为:<< 类名,文件名 >,单词 >。Map 的输出丢到上下文中,经过 shuffle 处理,将相同 key 值的 value 合并为一个集合作为 reduce 的输入,在 reduce 中将合并的 value 集合中的每一个单词拼接成一个字符串作为新的 value,则 reduce 的输出格式为:<< 类名,文档名 >,单词 1,单词 2,…….>,并将其写到 hdfs://master/output/output3。Job2 的 dataflow 示意图如下所示:
![](https://www.writebug.com/myres/static/uploads/2021/12/13/6599103b28ee7905e4d0d8386f0f49cd.writebug)
图 3.3:Job3 DataFlow 示意图
### 4 Job4
第四个 job 是对测试集中的文件类别进行预测,输入文件为 Job3 中的输出文件,输出格式为:<< 真实类名,文件名 >,预测类名 >。在执行该 Job 前, 首先要读入 Job1 和 Job2 的输出文件来计算先验概率和条件概率,并将其结果保存在 HashMap 中。Job4 的输入是 job3 的输出文件,首先读取该文档的内容并进行切片,将每行的偏移量和行内容作为该 job 中的 map 输入, map 获取每个文件的真实类名和文件名,并将其拼接为新的 key 值输出,
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本项目为一个Hadoop课程作业,使用Java语言和map/reduce实现贝叶斯文本分类器。 项目的具体内容如下: 1:用MapReduce算法实现贝叶斯分类器的训练过程,并输出训练模型; 2:用输出的模型对测试集文档进行分类测试。测试过程可基于单机Java程序,也可以是MapReduce程序。输出每个测试文档的分类结果; 3:利用测试文档的真实类别,计算分类模型的Precision,Recall和F1值。
资源推荐
资源详情
资源评论
收起资源包目录
100011406-基于Java MapReduce 的朴素贝叶斯分类器.zip (35个子文件)
bayesiantextclassifier
data
NBCorpus.rar 9.36MB
LICENSE 1KB
Bayes
Utils.java 518B
pom.xml 2KB
CalcDocNumClass.java 6KB
Evaluation.java 6KB
TestPrediction.java 11KB
Main.java 1KB
TestPreparation.java 4KB
CalcWordNumClass.java 3KB
Hadoop报告.pdf 2.14MB
READMEbefore.md 108B
Hadoop报告.docx-md
11-e8fddd6aad1268d311b0458a6539d636.png 120KB
12-64deb3e1d846af40f16452beb1a34ad9.png 108KB
16-e118c5d147a4d16d65a55d70add5c02f.png 110KB
2-21af363cbb0ea7dffaad44147f083bed.png 53KB
9-899986f2e8bcd100476c67652d6912bd.png 71KB
7-54da4a383577732dd721f765daa8d29f.png 99KB
14-66bbee71b04341cc7d3a40efa01723db.png 210KB
5-7f1c98c3d6773f9ed190e4673ac664a2.png 64KB
15-f6b61614a87b63008759d6173c3f48d9.png 130KB
myoutput.md.md 44KB
6-1736363884ea02b65e1fb8fe60dc1e6c.png 37KB
3-909d07b7ab18782da04484df39d59844.png 55KB
myoutput.md 46KB
4-b029b381035df0b79a92d569eaa93c75.png 54KB
13-6fd7345e60e89d655aaab41c529f4540.png 88KB
17-10680a478dff31dd2342ad779a368efd.png 54KB
19-44fa0b8664db0549371d2a816d1b79b4.png 43KB
1-ed8ee88573a4845fb7ad2efa9eeb965c.png 63KB
18-0d09fa6eae5965a6871188939fdc056d.png 97KB
10-800ae53aa4d78035d1882f386a0a7020.png 31KB
8-58ccc5aa8fa5dd6b53b88a600d27bd60.png 100KB
first.jmx 9KB
README.md 44KB
共 35 条
- 1
资源评论
神仙别闹
- 粉丝: 3585
- 资源: 7460
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功