背景&目标:
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. mac下设置mongodb开机启动方法

    Mac OS 的开机启动方式 launchd 是 Mac OS 下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程.其实它的作用就是我们平时说的守护进程,简单来说,用户守 ...

  2. 怎么从docker中copy文件到 本机

    怎么从docker中copy文件到 本机 docker cp <containerId>:/file/path/within/container /host/path/target

  3. Java总结篇系列:Java多线程(四)

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  4. 《Effective Java》读书笔记一(创建与销毁对象)

    No1 考虑用静态工厂方法代替构造器 静态工厂方法优势: 它们有名称,阅读性增强,如:BigInteger.probablePrime: 不必每次调用它们的时候都创建一个新对象: 它们可以返回原返回类 ...

  5. MySQL Study之--MySQL下图形工具的使用(MySQL Administrator)

    MySQL Study之--MySQL下图形工具的使用(MySQL Administrator) 系统环境:     操作系统: Windows  7(64) 下载地址:http://www.soft ...

  6. linux系统信息查询及相关概念

    1.查看机器可以插几根内存条: /sbin/lspci  -v 或dmesg 或  dmidecode(需要root) 2.查看机器有几块盘,是否做raid: blkid 或 fdisk -l 或 s ...

  7. [转]编写Android.mk中的LOCAL_SRC_FILES的终极技巧

    希望看原文的请移步:[原创]编写Android.mk中的LOCAL_SRC_FILES的终极技巧 问题的引入 在使用NDK编译C/C++项目的过程中,免不了要编写Android.mk文件,其中最重要的 ...

  8. 关于Snmp的Trap代码开发之坑

    最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...

  9. Eclipse中设置文件编码

    如果你在使用某个editor进行开发的话,文件编码就由改editor解决即可 Eclipse中也有这个功能,帮你设置文件的编码,选择Edit->Set Encoding即可 注意,这个选项针对不 ...

  10. 一次执行批量sql的方法

    在javaweb开发中,免不了一次业务操作会设计到几个表之间的添加,获取主键插入子表 1.主表使用单条插入,获取id,自表获取id进行批量插入最后完成操作 SimpleJdbcTemplateDaoI ...