Mahout笔记

Mahout下出路的文件必须是SequenceFile格式的,所以需要把TxtFile转换成SequenceFile。

//数据序列化
原始数据   ——>  SequenceFile  

//SparseVectorsFromSenceFile工具 
数据   ——>   向量

1. Mahout的mahout-examples模块中有一个Dispalykmeans类,它是二维平面内算法可视化的一个有力工具

2. 在Mahout中,bin/mahout这个shell脚本会自动从$HADOOP_CONF环境变量寻找Hadoop配置文件

3. DictionaryVectorizer将文本转换为向量

4. Seqdirectory把内容转换成Hadoop序列文件mahout中提供了一种将指定文件下的文件转换成sequenceFile的方式

使用方法如下:

$MAHOUT_HOME/mahout seqdirectory \
--input<文件所在的父目录> --output <输出目录>\
<-c <输入文件的字符集名称> {UTF-8|cp1252|ascii...}> \
<-chunk <每一块的最大尺寸,以MB为单位> 64> \
<-prefix <将要添加到文档标识的前缀>>

上述命令蕴含了2个大坑,在其他文档中均没有仔细说明:

(1) -xm sequential,表示在本地执行,而不是用MapReduce执行。如果是后者,我们势必要将这些小文件上传到HDFS上,那样的话,还要SequenceFile做甚……

(2) 然而seqdirectory在执行的时候,并不因为十本地模式,就在本地文件系统上寻找。而是根据-i
-o的文件系统前缀来判断文件位置。也就是说,默认情况,依然十在HDFS上查找的……所以,这个file://的前缀是非常有必要的。

举个例子:

$MAHOUT_HOME/mahout seqdirectory --input /hive/hadoopuser/ --output /mahout/seq/ --charset UTF-8

处理好的输出文件也是序列文件,查看结果作如下处理:

$MAHOUT_HOME/mahout vectordump --seqFile /user/hadoopuser/output/data/part-00000

查看序列化文件使用如下命令:

hadoop fs -text /data/seqfile/part-m-00000/

5.mahout – help 查看mahout提供了哪些算法以及如何使用

  1. mahout seq2sparse:将SequenceFile转成向量文件,对应的源文件是org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles.java
mahout seq2sparse -i ~/mahout-dirs/seq -o ~/mahout-dirs/vectors -lnorm -nv -wt tfidf -a org.apache.lucene.analysis.core.WhitespaceAnalyzer
最后一个参数是修改了默认的分词器,因为之前已经对文档进行过分词,词与词之间是用空格分开的(就像英文是用空格分开的一样),在向量化的时候就用 WhitespaceAnalyzer ,当然也可以用自定义的 Analyzer ,但必须是从 lucene 继承过来的。
  1. mahout seqdumper:将SequenceFile文件转成文本形式,对应的源文件是org.apache.mahout.utils.SequenceFileDumper.java

  2. mahout vectordump:将向量文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.vectors.VectorDumper.java

  3. mahout clusterdump:分析最后聚类的输出结果,对应的源文件是org.apache.mahout.utils.clustering.ClusterDumper.java

不仅是bayes等分类,包括聚类也都需要文本的向量化,所以我们需要了解下Mahout的向量实现。对于文本信息的向量化,Mahout 已经提供了工具类,它基于 Lucene对文本信息进行分析,然后创建文本向量。在Mahout中,向量(Vector)有很多不同的实现,适用于不同的算法场景,主要介绍下面三种(对他们也可以用其他的Vector进行再包装):
(1)DenseVector,它的实现就是一个浮点数数组,对向量里所有域都进行存储,适合用于存储密集向量。
(2)RandomAccessSparseVector 基于浮点数的 HashMap 实现的,key 是整形 (int) 类型,value 是浮点数 (double) 类型,它只存储向量中不为空的值,并提供随机访问。
(3)SequentialAccessVector 实现为整形 (int) 类型和浮点数 (double) 类型的并行数组,它也只存储向量中不为空的值,但只提供顺序访问。下面简单介绍一下Mahout向量化的过程。
1、mahout seqdirectory

对应的源文件是org.apache.mahout.text.SequenceFilesFromDirectory。使用mahout seqdirectory命令可以将文本文件转成Hadoop 的SequenceFile文件, SequenceFile文件是一种二制制存储的key-value键值对。以邮件分类为例,mahout seqdirectory的输入是一堆分类目录,每个目录名就是类别名,目录里面包含的是属于此类的一些文档(一个文件是一篇文章);输出是一个SequenceFile文件,key-value类型是(Text,Text),每个key-value键值对的key是目录名(类别名),本目录下所有文件的内容作为value。

2、mahout seq2sparse

mahout seq2sparse将上面生成的SequenceFile转成向量文件,对应的源文件是
org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles。seq2sparse实际上是一个计算文本TF,DF,TFIDF的过程,依次产生的向量文件目录结构是:

(1)tokenized-documents 目录:保存着分词过后的文本信息。

(2)wordcount 目录:保存着全局的词汇出现的次数。

(3)dictionary.file-0 目录:保存着这些文本的词汇表。

(4)tf-vectors 目录:保存着以 TF 作为权值的文本向量。

(5)df-count 目录:保存着文本的频率信息。

(6)frequcency-file-0 目录 : 保存着词汇表对应的频率信息。

(7)tfidf-vectors 目录:保存着以 TFIDF 作为权值的文本向量

下面简单介绍seq2sparse的工作流程:
(1)(Text,Text)变成(text,StringTuple)。
将上面seqdirectory生成的的序列文件的(Text,Text)变成(text,StringTuple),放在tokenized-documents目录。StringTuple是一种适合做hadoop处理的有序字符串列表,本质是一个List。使用DocumentProcessor::DocumentTokenizer MR实现,使用了lucene的org.apache.lucene.analysis.Analyzer来对文本进行分析。
(2)将上面生成的(Text,StringTuple)转成词频TF向量(Text,VectorWritalbe)。
(2.1)使用名为DictionaryVectorizer::WordCount 的MR计算所有单词的数目,放在wordcount目录。
(2.2)读取上一步生成的word count文件,并且为每个单词分配唯一的id。这个函数没有使用mr,直接使用hdfs api操作,并且考虑到了块划分的问题,生成多个dictionary.file-*文件。
(2.3)使用每个dictionary.file-,对tokenized-documents中的文件进行TF计算,生成多个partial-vectors-。这个过程使用了DictionaryVectorizer::MakePartialVectors MR,对于每个在当前字典中找到的term,累加次数即可。注意maxNGramSize参数,根据用户设置max.ngrams,如果maxNGramSize >= 2,那么需要首先使用org.apache.lucene.analysis.shingle.ShingleFilter进行可能的单词组合,作为新的单词。
(2.4)PartialVectorMerger.mergePartialVectors将(3)生成的各个partial-vectors-合并,并删除每个partial-vectors-
(3)计算每个term在所有文档中的df。
(3.1)以(2)生成的TF向量文件为输入,输出每个term在所有文档中的频率以及所有的向量个数,生成的文件在df-count中。由VectorTfIdf Document Frequency Count mr完成。
(3.2)直接使用hdfs api读取上一步生成的DF 文件,生成多个frequency.file-*文件。并统计一共有多少个vector和feature。
(3.3)计算tfidf向量。类似上面求tf,计算tfidf也是拆成多个makePartialVectors,每个makePartialVectors使用了名为MakePartialVectors 的MR,输入是上面(2)生成的tf-vectors,和(3.2)中生成的frequency.file-作为字典文件,生成针对这个字典文件的partial-vectors-。对于在当前字典中存在的feature 的df,会根据maxDf,minDf的配置做一下调整,然后使用TFIDF类的calculate方法根据tf,df,文档总数目计算tfidf。TFIDF类的calculate方法会使用Similarity接口的的tf()和idf()方法,tf()使用(float)Math.sqrt(freq),idf()使用(float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0)。可以看到,算出的tfidf,与tf成正比,与idf成反比。
(3.4)最后使用PartialVectorMerger::MergePartialVectors MR,对于上一步生成的所有partial-vectors-合并,并删除每个partial-vectors-

  • 输入分析:

mahout下处理的文件必须是SequenceFile格式的,所以需要把txtfile转换成sequenceFile,而聚类必须是向量格式的,mahout提供下面两个命令来将文本转成向量形式

1.mahout seqdirectory:将文本文件转成SequenceFile文件,SequenceFile文件是一种二制制存储的key-value键值对,对应的源文件是org.apache.mahout.text.SequenceFilesFromDirectory.java

2.mahout seq2sparse:将SequenceFile转成向量文件,对应的源文件是org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles.java

- 输出分析:即查看结果

mahout seqdumper:将SequenceFile文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.SequenceFileDumper.java

mahout vectordump:将向量文件转成可读的文本形式,对应的源文件是org.apache.mahout.utils.vectors.VectorDumper.java

mahout clusterdump:分析最后聚类的输出结果,对应的源文件是org.apache.mahout.utils.clustering.ClusterDumper.java

具体每种命令如何用及参数选择,可以在命令行后面加-h或-help,例如,查看mahout seqdumper -h,这样终端下,就会列出详细的参数选项及说明

最重要的是读读这几个命令的源代码,看看是如何实现的,这样才可以灵活运用到自己的应用中去

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值