背景&目标:
1、sport.tar 是体育类的文章,一共同拥有10个类别。
   用这些原始材料构造一个体育类的文本分类器,并測试对照bayes和cbayes的效果;
   记录分类器的构造过程和測试结果。

2、user-sport.tar 是用户浏览的文章,每一个目录相应一个用户。
   利用上题构造的文本分类器,计算每一个用户浏览各类文章的占比。
   记录计算过程和结果。


实验环境:
Hadoop-1.2.1
Mahout0.6
Pig0.12.1
Ubuntu12
Jdk1.7


原理&流程
建立文本分类器:
1.分类体系的确定
2.文本样本的积累
3.文本的预处理(分词)
4.划分训练集,測试集
5.对模型的训练
6.对模型准确性測试

測试分类器模型时,假设认为模型效果不够惬意,能够对过程进行调整,然后又一次生成模型。
可调整的方面包含:
  1. 积累很多其它,更有具代表性的样本;
  2. 在文本预处理阶段选择更好的分词算法;
  3. 在训练分类器时,对训练參数进行调整。
不断反复以上过程。直到得到惬意的模型为止。

对文本进行分类:
建立完文本分类器以后。就能够输入一个文本,输出一个分类。


Step1:将所需用到的原始数据sport和user-sport目录上传到hdfs


sport目录:
  • 用于训练文本分类器
  • 包括了多个子目录,每一个子目录都是一个分类的文章
  • 在现实项目中。该原始数据须要人工收集
user-sport:
  • 待分类的文本





注意:user-sport目录下的子目录名称是用户id。子目录内包括了多个文本文件。都是该用户浏览过的文章。


step2:对sport目录进行分词
用到MRTokenize.jar中的tokenize.TokenizeDriver


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk2NzM4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">







到此为止,原始数据已经分好词,而且已经处理成Mahout训练文本分类器要求的输入格式:
  • 每行一篇文章
  • 每行的格式为:分类名称 文章分词结果


Step3:划分训练集和測试集
我们把经过分词处理的原始数据划分为训练集和測试集。训练集用于训练模型,測试集用于測试模型效果。

该过程通过pig实现:
grunt> processed = load'/dataguru/hadoopdev/week8/fenciout/part-r-00000' as (category:chararray,doc:chararray);
grunt> test = sample processed 0.2;
grunt> jnt = join processed by (category,doc) left outer, test by (category,doc);
grunt> filt_test = filter jnt by test::category is null;
grunt> train = foreach filt_test generate processed::category as category,processed::doc as doc;
grunt> store test into '/dataguru/hadoopdev/week8/test';

grunt> store train into '/dataguru/hadoopdev/week8/train';

结果截图:
 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk2NzM4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



Step4:训练贝叶斯模型
我们分别训练bayes模型和cbayes模型,后面測试两者的效果做对照。



首先训练bayes模型:
casliyang@singlehadoop:~$ mahout trainclassifier -i /dataguru/hadoopdev/week8/train -o /dataguru/hadoopdev/week8/model-bayes -type
bayes -ng 1 -source hdfs

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk2NzM4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

 
然后训练cbayes模型:
casliyang@singlehadoop:~$ mahout trainclassifier -i /dataguru/hadoopdev/week8/train -o /dataguru/hadoopdev/week8/model-cbayes -type cbayes -ng 1 -source
hdfs

训练结果:
 


Step5:測试模型
測试贝叶斯模型命令例如以下:
casliyang@singlehadoop:~$ mahout testclassifier -d /dataguru/hadoopdev/week8/test -m /dataguru/hadoopdev/week8/model-bayes -type bayes -ng 1 -source hdfs -method mapreduce

測试结果:
 

測试C贝叶斯模型命令例如以下:
casliyang@singlehadoop:~$ mahout testclassifier -d /dataguru/hadoopdev/week8/test -m /dataguru/hadoopdev/week8/model-cbayes -type cbayes -ng 1 -source hdfs -method mapreduce

測试结果:
 


Step5:处理待分类数据
我们的待分类数据全存储在user-sport目录下。每一个子目录都存储了一个用户浏览过的文章,子目录的名称就是用户id:
 



Mahout的文本分类器要求输入数据为分词后的文章,我们直接使用训练分类器时用到的MRTokenize.jar中的tokenize.TokenizeDriver来对文章进行分词。输出格式为:
  • 每行一篇文章
  • 每行的格式为:用户ID 文章分词结果

运行命令对待分类数据进行分词:
casliyang@singlehadoop:~/Myfiles$ hadoop jar MRTokenize.jar tokenize.TokenizeDriver /dataguru/hadoopdev/week8/user-sport /dataguru/hadoopdev/week8/user-sport-fenciout

结果:
 


Step6:Hadoop环境下。对待分类数据进行分类。并统计每一个用户浏览每一个分类的次数
Hadoop环境下调用Mahout分类器的程序细节參见:
第八周(4)文本挖掘-贝叶斯-Mahout
将程序打jar包后复制到集群上运行。

运行命令对待分类数据进行分类:
casliyang@singlehadoop:~/Myfiles$ hadoop jar MRClassify.jar classifier.ClassifierDriver /dataguru/hadoopdev/week8/user-sport-fenciout /dataguru/hadoopdev/week8/user-sport-bayesout /dataguru/hadoopdev/week8/model-bayes bayes

说明:
參数1:输入路径。即上一步分词处理好的待分类的文章存储路径
參数2:输出路径,即统计好的用户浏览各个分类的数量
參数3:模型所在路径
參数4:模型的算法



分类并统计的结果:
 
结果的每行格式:用户ID | 分类 | 浏览次数



Step6:处理上一步的输出数据。得到每一个用户訪问次数最多的分类
使用pig处理:
grunt> u_ct = load'/dataguru/hadoopdev/week8/user-sport-bayesout' using PigStorage('|') as (user:chararray, category:chararray, times:int);
grunt> u_stat = foreach(group u_ct by user)
>> {
>> sorted = order u_ct by times desc;
>> top = limit sorted 1;
>> generate flatten(top),SUM(u_ct.times);
>> };
grunt> store u_stat into '/dataguru/hadoopdev/week8/user-sport-pigout'; 

结果(第一列是用户id,第二列是浏览量最多的类别,第三列是该类别的浏览次数,第四列是该用户总共的浏览量):
 

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDk2NzM4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

【甘道夫】通过Mahout构建贝叶斯文本分类器案例具体解释的更多相关文章

  1. 【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse小工具

    目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.z ...

  2. Mahout朴素贝叶斯文本分类

    Mahout朴素贝叶斯文本分类算法 Mahout贝叶斯分类器按照官方的说法,是按照<Tackling the PoorAssumptions of Naive Bayes Text Classi ...

  3. 【甘道夫】MapReduce实现矩阵乘法--实现代码

    之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...

  4. 【甘道夫】通过Mahout构建推荐系统--通过IDRescorer扩展评分规则

    通过Mahout构建推荐系统时,假设我们须要添�某些过滤规则(比方:item的创建时间在一年以内),则须要用到IDRescorer接口,该接口源代码例如以下: package org.apache.m ...

  5. 【甘道夫】怎样在cdh5.2上执行mahout的itemcf on hadoop

    环境: hadoop-2.5.0-cdh5.2.0 mahout-0.9-cdh5.2.0 步骤: 基本思路是,将mahout下的全部jar包都引入hadoop的classpath就可以,所以改动了$ ...

  6. 【甘道夫】并行化频繁模式挖掘算法FP Growth及其在Mahout下的命令使用

    今天调研了并行化频繁模式挖掘算法PFP Growth及其在Mahout下的命令使用,简单记录下试验结果,供以后查阅: 环境:Jdk1.7 + Hadoop2.2.0单机伪集群 +  Mahout0.6 ...

  7. 【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

    介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于& ...

  8. 【甘道夫】HBase连接池 -- HTablePool是Deprecated之后

    说明: 近期两天在调研HBase的连接池,有了一些收获,特此记录下来. 本文先将官方文档(http://hbase.apache.org/book.html)9.3.1.1节翻译,方便大家阅读,然后查 ...

  9. 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】

    引言 之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档参考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 所有代码均基于“ ...

随机推荐

  1. 基于RHCS的web双机热备集群搭建

    基于RHCS的web双机热备集群搭建 RHCS集群执行原理及功能介绍 1. 分布式集群管理器(CMAN)  Cluster Manager.简称CMAN.是一个分布式集群管理工具.它执行在集群的各个节 ...

  2. awstat分析nginx日志

    awstat分析nginx日志 http://lxw66.blog.51cto.com/5547576/1323712 server{ listen ; server_name localhost; ...

  3. 改善C#程序的建议9:使用Task代替ThreadPool和Thread

    一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...

  4. 【Android】将Xamarin For VS升级为4.0.1.145版

    分类:C#.Android.VS2015 创建日期:2016-03-18 一.卸载原来安装的Xamarin for VS 4.0.0.1717版 下面是Xamarin for VS发布的版本简介: - ...

  5. Webpack中的sourcemap

    Webpack中sourcemap的配置 sourcemap是为了解决开发代码与实际运行代码不一致时帮助我们debug到原始开发代码的技术.尤其是如今前端开发中大部分的代码都经过编译,打包等工程化转换 ...

  6. mac下为什么光标按方向键只能一个字一个字地蹦

    系统偏好设置-键盘 把按键重复拉到最快,重复前延迟拉到最短

  7. 李洪强iOS开发之-sql数据库的使用

    一,创建工程 二: 导入头文件 三:导入 四: 数据库增删改查 //因为是结构体类型,所以用assign //1.创建数据库(保存路径) @property(nonatomic,assign)sqli ...

  8. Ubuntu12.04下apache服务器的安装也配置

    安装步骤 1.下载httpd http://httpd.apache.org/ 2.解压缩httpd tar vxzf httpd-2.4.6.tar.gz 3.安装httpd 进入解压缩后的目录 c ...

  9. html+js+css+接口交互+echarts实例一枚

    1. 解决了echarts的展现 2. 解决了echarts全屏幕展现(width:100%;height:100%;) 3. 解决了向接口取数据问题 <!DOCTYPE html> &l ...

  10. LeetCode: Generate Parentheses 解题报告

    Generate ParenthesesGiven n pairs of parentheses, write a function to generate all combinations of w ...