在hadoop2.0上使用mahout1.0(-SNAPSHOT)提供的lda

mahout作为开源软件包,集成了很多机器学习和数据挖掘算法,详细可见 mahout官网  。

关于LDA,这里就不说了,详见大神的 LDA数学八卦  。这里只是想吐嘈mahout官网lda的使用文档:根本就没什么文档嘛!

在mahout-0.9及以前版本,只支持hadoop1.0 . 支持hadoop2.0的mahout只有1.0-SNAPSHOT , 不过是可以用的。现在就记录一下本人使用时走过的坑(注:幸好有同事之前走过0.9的坑,所以我才能迅速的集成。本人也未读源码,只看过CVB0Driver)。

第一步 : github 去下最新的源码包,解压后直接编译即可,现在的1.0版本默认支持hadoop2.2(在hadoop 2.4上也可以用) .

第二步 :准备lda需要的输入文档集合。因为lda的输入文件需要为sequence file..所以以下的几步主要是将源文档集合转化为lda能够识别的sequencefile 输入。

1)、每篇文档为一个单独的本地文件 , 命名为当前文档的标识,一般为Id,如果文档量较大可以分子目录存放。

2)、使用 ./mahout seqdirectory 将1步的文档转成seq-file(因为1步有多个文件,循环执行).

$MAHOUT seqdirectory -i file://${LOCAL_DIR}/input/chunk-${i} -o file://${LOCAL_SEQ_DIR}/chunk-${i} -chunk 64 -c UTF-8 -ow -xm sequential hadoop fs -put ${LOCAL_SEQ_DIR}/chunk-${i} ${HDFS_SEQ_DIR}/

然后将输出的文件放在hdfs上

3)、使用$MAHOUT seq2sparse 进行各种转化(具体可见官方参数解释)

$MAHOUT seq2sparse -i ${HDFS_SEQ_DIR}/*/ -o ${HDFS_SPARSE_DIR} --weight tfidf --chunkSize 64 -seq -nr 10         --namedVector --analyzerName org.apache.lucene.analysis.core.WhitespaceAnalyzer --maxDFPercent 20

注意analyzerName , 如果你之前的文档没有切词,那么这里可以指定切词算法。如果已经切好词,这需要指定词与词之前的分隔符。我这里是已经切好词的文档,词之间以空格分隔。如果不指定,mahout会对你再节一次。
    --weight就是词的权重,可以选用tf或tfidf..

4)、对文档进行matrix处理。这一步我在网上没有找到。。不知道我的同事在哪搞到的。

  $MAHOUT rowid         -i ${HDFS_SPARSE_DIR}/tfidf-vectors/$A         -o ${HDFS_MATRIX_DIR}/$B

这里的rowid就是对doc id进行编号转换。如果你的docid不是intwritable。还是走一下这一步。这里的输入tfidf-vector取决于上一步的权重算法

5)、算法终于可以开始了。运行mahout cvb

$MAHOUT cvb --input ${HDFS_MATRIX_DIR}/*/matrix/ --output ${HDFS_MODEL_DIR} -k 14         -ow -x 100 --num_train_threads 5         -dict ${HDFS_SPARSE_DIR}/dictionary.file-*         -dt ${HDFS_DOC_TOPICS_DIR}         -mt ${HDFS_TOPIC_MODEL_DIR}

这里的输入就是上一步的输出,可以指定topic个数(-k) , 迭代次数(-x) , 如果你想知道训练集中每个文档的topic分布,需要指定 -dt .

这样就可以等待job执行完毕了。

第三步 训练结果的导出

1) 导出topic-model..即topic-term多项分布。因为在运行过程中mahout会对term和doc重新映射id.所以导出的时候需要使用这些字典文件。

$MAHOUT seqdumper -i ${HDFS_SPARSE_DIR}/dictionary.file-0 -o ${LOCAL_OUTPUT_DIR}/dic-dump ;//导出term的字典
$MAHOUT seqdumper -i ${HDFS_MODEL_DIR} -o ${LOCAL_OUTPUT_DIR}/topic-model //导出topic-model

topic-model的格式是key: topicId value:{termid:概率}.所以自己根据dic-dump解析一下就可以看topic及其下面的词了。

2)、导出doc-topics 。如果想试用KL距离之类的算法来计算文档的相似性(我用的是JS距离),那就需要在cvb的时候使用-dt参数。

$MAHOUT seqdumper -i ${HDFS_DOC_TOPICS_DIR} -o ${LOCAL_OUTPUT_DIR}/doc-topics-dump;//导出doc-topics-model
 $MAHOUT seqdumper                 -i ${HDFS_MATRIX_DIR}/0000${index}/docIndex                 -o ${LOCAL_OUTPUT_DIR}/doc-dic-dump-${index} ;//导出docid字典,注意目录在matrix目录下

剩下的工作就与上一步相同 了。。。

时间: 2024-08-05 20:09:20

在hadoop2.0上使用mahout1.0(-SNAPSHOT)提供的lda的相关文章

iis7.0上发布mvc4.0网站

步骤如下: 1.右击需要发布的项目,在弹出的菜单中选择“发布...”选项 2.在“发布web”对话框中进行设置,配置文件名称默认为“配置文件1”可以修改为需要的名字,以便识别,也可以不改.发布方法选择“文件系统”,目标位置处选一个文件夹用于存放将要发布的整个站点所有文件,这里我选择为“D:\我的文档\桌面\ZPGWeb”,然后点击“发布”按钮.如图: 3.点击发布后在指定的文件夹生成站点文件,发布成功! 接下来将发布成功的站点部署到iis7.0. 步骤如下: 1. 安装 Microsoft .n

在CDH5.5.0上安装Kudu6.0

1. 下载安装文件: a. CSD文件:KUDU-0.6.0.jar b. kudu parcel:KUDU-0.6.0-1.kudu0.6.0.p0.334-el6.parcel和manifest.json文件 c. impala-kudu:IMPALA_KUDU-2.3.0-1.cdh5.5.0.p0.15-el6.parcel + manifest.json文件 2.将CSD文件KUDU-0.6.0.jar移到/opt/cloudera/csd下面并重启服务器 3.将KUDU-0.6.0-

Hadoop-2.6.0上调用C的API实现相似云盘的功能

Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传.下载.删除,重命名) 測试系统:CentOS6.6, hadoop-2.6.0 本次測试是调用hadoop下的C的API来訪问HDFS实现类似云盘的上传.下载,删除,重命名的功能,其他功能还请有意者自行加入,废话少说.開始进入正题. 首先我们要能在hadoop-2.6.0上的C的API訪问HDFS 详情能够訪问:http://blog.csdn.net/u013930856/article/details/47660937 以下開

Hadoop-2.6.0上调用C的API实现类似云盘的功能

Hadoop-2.6.0上调用C的API实现类似云盘的功能(上传,下载,删除,重命名) 测试系统:CentOS6.6, hadoop-2.6.0 本次测试是调用hadoop下的C的API来访问HDFS实现类似云盘的上传,下载,删除,重命名的功能,其它功能还请有意者自行添加,废话少说,开始进入正题. 首先我们要能在hadoop-2.6.0上的C的API访问HDFS 详情可以访问:http://blog.csdn.net/u013930856/article/details/47660937 下面开

Ubuntu14.0上编译安装Hadoop

Ubuntu14.0上编译安装Hadoop 环境: hadoop-2.5.0.tar hadoop-2.5.0-src.tar jdk-7u71-linux-x64 protobuf-2.5.0.tar Maven3.0 安装步骤: 1 安装jdk ,配置环境变量 2 安装依赖包 3 安装maven 4安装protobuf-2.5.0.tar 5 编译Hadoop 6 安装hadoop 6.1 单机模式 6.2 伪分布模式 6.3 集群模式 1 安装jdk ,配置环境变量 下载jdk版本:jdk

Hadoop2.0构成之HDFS2.0

HDFS2.0之HA 主备NameNode: 1.主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换: 2.主NameNode的信息发生变化后,会将信息写到共享数据存储系统中让备NameNode合并到自己的内存中: 3.所有DataNode同时向两个NameNode发送心跳信息(块信息): 两种切换方式: 1.手动切换:通过命令实现主备之间的切换,可以用于HDFS升级等场合: 2.自动切换:基于Zookeeper实现: Zookeeper Failover

Hadoop2.6+Zookper3.4+Hbase1.0部署安装

继hadoop完全分布式安装后,再结合zookper+hbase安全.在之前环境配置下继续进行. 一.zookper安装 1.1 下载并解压软件 cd /software wget -c http://apache.fayea.com/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz tar -zxf zookeeper-3.4.10.tar.gz -C /usr/local/ ln -sv /usr/local/zookeeper-3.4.1

在Linux 上安装WAS7.0

1. 系统软硬件环境 硬件及网络环境: n CPU:4核 2.0 GHz及以上 n 内存:8GB及以上 n 磁盘:200G及以上 n IP:192.168.217.133 软件环境: JDK 1.7.0_45 2. 前提条件 查看/etc/hosts中是否已经有正确的主机名定义:192.168.217.133  master wasserver 其中192.168.217.133为本机IP,master wasserver为本机主机名全称.根据实际情况定 如果配置文件中没有主机名定义,需要手工添

Android上使用OpenGLES2.0显示YUV数据

在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源,如果以这样的形式播放视频,手机会很热,所以我们尽量让GPU来做这件事: 3.OpenGLES是Android集成到自身框架里的第三方库,它有很多的可取之处. 博主的C/C++不是很好,所以整个过程是在Java层实现的,大家见笑,我主要参考(但不限于)以下文章,十分感谢这些朋友的分享: 1. htt