【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

标签: 甘道夫 mahout 文本 | 发表时间:2014-05-09 18:12 | 作者:u010967382
出处:http://blog.csdn.net
背景&目标:
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









到此为止,原始数据已经分好词,并且已经处理成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';

结果截图:
 


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

 
然后训练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,第二列是浏览量最多的类别,第三列是该类别的浏览次数,第四列是该用户总共的浏览量):
 
作者:u010967382 发表于2014-5-9 10:12:48 原文链接
阅读:67 评论:0 查看评论

相关 [甘道夫 mahout 文本] 推荐:

【甘道夫】通过Mahout构建贝叶斯文本分类器案例详解

- - CSDN博客云计算推荐文章
1、sport.tar 是体育类的文章,一共有10个类别;.    用这些原始材料构造一个体育类的文本分类器,并测试对比bayes和cbayes的效果;.    记录分类器的构造过程和测试结果. 2、user-sport.tar 是用户浏览的文章,每个文件夹对应一个用户;.    利用上题构造的文本分类器,计算每个用户浏览各类文章的占比;.

【甘道夫】Mahout推荐算法编程实践

- - CSDN博客云计算推荐文章
Taste是曾经风靡一时的推荐算法框架,后来被并入Mahout中,Mahout的部分推荐算法基于Taste实现. 下文介绍基于Taste实现最常用的UserCF和ItemCF. 本文不涉及UserCF和ItemCF算法的介绍,这方面网上资料很多,本文仅介绍如何基于Mahout编程实现. UserCF和ItemCF算法的输入数据是用户偏好,用户偏好数据可以有两种形式:.

Mahout介绍

- - 互联网 - ITeye博客
Mahout 是机器学习和数据挖掘的一个分布式框架,区别于其他的开源数据挖掘软件,它是基于hadoop之上的; 所以hadoop的优势就是Mahout的优势. http://mahout.apache.org/ 上说的Scalable就是指hadoop的可扩展性. Mahout用map-reduce实现了部分数据挖掘算法,解决了并行挖掘的问题.

mahout部署实践

- - CSDN博客云计算推荐文章
一 下载mahout并解压. JAVA_HOME mahout运行需指定jdk的目录. MAHOUT_JAVA_HOME指定此变量可覆盖JAVA_HOME值. HADOOP_HOME  如果配置,则在hadoop分布式平台上运行,否则单机运行. HADOOP_CONF_DIR指定hadoop的配置文件目录.

mahout 实用教程之一

- - CSDN博客云计算推荐文章
mahout 实用教程 (一). 本文力求把mahout从使用的角度为读者建立一个框架,为后续的使用打下基础. 本文为原创文章转载请注明原网址 http://blog.csdn.net/comaple,谢谢. 下面首先给出源代码svn地址以及用于测试的公共数据集,大家可以下载并测试. mahout svn仓库地址: http://svn.apache.org/repos/asf/mahout/trunk.

Mahout: SVDRecommender SVD推荐算法

- -

Mahout实现的机器学习算法

- - ITeye博客
使用命令:mahout -h.   在Mahout实现的机器学习算法见下表:. EM聚类(期望最大化聚类). 并行FP Growth算法. 并行化了Watchmaker框架. 非Map-Reduce算法. 扩展了java的Collections类. Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能.

[转]Mahout推荐算法基础

- - 小鸥的博客
Mahout推荐算法分为以下几大类. 2.相近的用户定义与数量. 2.用户数较少时计算速度快. 1.基于item的相似度. 1.item较少时就算速度更快. 2.当item的外部概念易于理解和获得是非常有用. 1基于SlopeOne算法(打分差异规则). 当item数目十分少了也很有效. 需要限制diffs的存储数目否则内存增长太快.

Apache Mahout 0.8 发布,机器学习库

- - 开源中国社区最新新闻
Apache Mahout 0.8 发布了,Apache Mahout 是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的机器学习算法,供开发人员在 Apache 在许可下免费使用. 该项目已经发展到了它的最二个年头,目前只有一个公共发行版.

基于Mahout的电影推荐系统

- - CSDN博客推荐文章
Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序. 经典算法包括聚类、分类、协同过滤、进化编程等等,并且,在 Mahout 中还加入了对Apache Hadoop的支持,使这些算法可以更高效的运行在云计算环境中.