在运行Mahout中的算法之前需要将文本数据(数字或者字符串)转化为SequenceFile格式作为Mahout中算法的输入,待Mahout中的算法执行完成后结果文件也是SequenceFile格式的,SequenceFile格式是Hadoop特有的二进制格式,所以需要将其转化为人可以读懂的文本格式。以上的这一数据转化过程,在上面几章中可见一斑。
本章中将对Mahout中存在的输入、输出格式转化的接口进行总结,其中一些事在以上某些章节中已经使用到的,有的是新增加的。
方法名称 |
方法描述 |
InputDriver |
数字文件转化为SequenceFile格式 |
|
|
|
|
|
|
|
|
|
|
数字文件指的是文件中包含的是数字,整型或者浮点型都是可以的,如synthetic_control.data数据,每一行代表了一个样本,每个样本中包括60个属性。
上面已经说过Mahout所能够识别的文件类型是SequenceFile格式的,所以需要首先将数字文本转化为SequenceFile格式,SequenceFile格式是Hadoop所特有的二进制数据文件,以压缩的形式存储信息。
在Mahout中,对数字文件向SequenceFile格式的转化功能已经做了相应封装,在包mahout-integrations-0.6.jar中,可以找到org.apache.mahout.clustering.conversion.InputDriver类中,该类中有个main函数可以通过命令行传递参数进去,进行文件格式转化。
表1-1 数字文件转化为SequenceFile文件的命令行参数
参数名 |
参数说明 |
-input (-i) input |
文 本数据文件的输入路径 |
--output (-o) output |
SequenceFile文件输出路径 |
--vector (-v) v |
|
经过InputDriver类转换后的SequenceFile文件中的键值对数据类型分别为Text和VectorWritable。
注意:不过在下面的聚类例子中,已经把InputDriver的功能又做了一次封装,所以下面的聚类算法中直接传递文本数据是可以执行的。
1)将synthetic_control.data从本地复制到HDFS
$HADOOP_HOME/bin/hadoopfs -mkdir DataTrans/Numeric
$HADOOP_HOME/bin/hadoopfs -put /home/zhongchao/workspace/data/DataTrans/Numeric/synthetic_control.dataDataTrans/Numeric
2)执行转化命令
$MAHOUT0P6_HOME/bin/mahoutorg.apache.mahout.clustering.conversion.InputDriver -iDataTrans/Numeric/synthetic_control.data -o DataTrans/Numeric/seq_synthetic_control.data
执行完上面命令后,生成了SequenceFile文件,存储在seq_synthetic_control.data文件下。如下图,其中转化后的信息存储在part-r-00000中。
图1.2-1 seq_synthetic_control.data中的文件
3)读取seq_synthetic_control.data中文件结果
$MAHOUT0P6_HOME/bin/mahoutvectordump -s DataTrans/Numeric/seq_synthetic_control.data/part-m-00000 -o/home/zhongchao/workspace/data/DataTrans/Numeric/res_text -p -c -ac
用vectordump命令读取结果,格式如下:
60 28.7812,34.4632,31.3381,31.2834,28.9207,33.7596,25.3969,27.7849,35.2479,27.1159,32.8717,29.2171,36.0253,32.337,34.5249,32.8717,34.1173,26.5235,27.6623,26.3693,25.7744,29.27,30.7326,29.5054,33.0292,25.04,28.9167,24.3437,26.1203,34.9424,25.0293,26.6311,35.6541,28.4353,29.1495,28.1584,26.1927,33.3182,30.9772,27.0443,35.5344,26.2353,28.9964,32.0036,31.0558,34.2553,28.0721,28.9402,35.4973,29.747,31.4333,24.5556,33.7431,25.0466,34.9318,34.9879,32.4721,33.3759,25.4652,25.8717
60 24.8923,25.741,27.5532,32.8217,27.8789,31.5926,31.4861,35.5469,27.9516,31.6595,27.5415,31.1887,27.4867,31.391,27.811,24.488,27.5918,35.6273,35.4102,31.4167,30.7447,24.1311,35.1422,30.4719,31.9874,33.6615,25.5511,30.4686,33.6472,25.0701,34.0765,32.5981,28.3038,26.1471,26.9414,31.5203,33.1089,24.1491,28.5157,25.7906,35.9519,26.5301,24.8578,25.9562,32.8357,28.5322,26.3458,30.6213,28.9861,29.4047,32.5577,31.0205,26.6418,28.4331,33.6564,26.4244,28.4661,34.2484,32.1005,26.691
。
。
。
可以看出转化后的SequenceFile格式中key是60,表示的是每个样本中元素/属性的个数,value就是每个样本中的数据。
如果利用Mahout对文本进行分类、聚类等处理,就需要对文本文件进行处理将其转化为SequenceFile文件,可以使用命令seqdirectory,该命令的实现在包mahout-core-0.6-job.jar中,org.apache.mahout.text.SequenceFilesFromDirectory
表2-1 控制seqdirectory的参数
参数名称 |
参数解释 |
可选值 |
默认值 |
--input (-i) input |
HDFS上文本文件所在路径 |
|
|
--output (-o) output |
HDFS上输出路径,是转化后的SequenceFile格式 |
|
|
-overwrite (-ow) |
如果使用此参数则在运行job前覆盖输出文件 |
|
|
--chunkSize (-chunk) chunkSize |
输出文件块大小 |
|
|
--fileFilterClass (-filter) fileFilterClass |
解析文件所用到的类名 |
|
org.apache.mahout.text.PrefixAdditionFilter |
--keyPrefix (-prefix) keyPrefix |
追加在key值的前缀 |
|
|
--charset (-c) charset |
编码类型 |
|
UTF-8 |
--help (-h) |
打印帮助信息 |
|
|
1)将文本文件拷贝到HDFS
$HADOOP_HOME/bin/hadoopfs –mkdir DataTrans/Text
$HADOOP_HOME/bin/hadoopfs -put /home/zhongchao/workspace/data/DataTrans/Text/text.data DataTrans/Text
text.data中存储内容如下:
packageorg.apache.mahout.text;
importjava.lang.reflect.Constructor;
importjava.nio.charset.Charset;
importjava.util.Map;
importcom.google.common.collect.Maps;
importcom.google.common.io.Closeables;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.SequenceFile;
importorg.apache.hadoop.util.ToolRunner;
importorg.apache.mahout.common.AbstractJob;
importorg.apache.mahout.common.HadoopUtil;
importorg.apache.mahout.common.commandline.DefaultOptionCreator;
importorg.apache.mahout.utils.io.ChunkedWriter;
2)执行转化命令
$MAHOUT0P6_HOME/bin/mahoutseqdirectory -c UTF-8 -i DataTrans/Text/text.data -o DataTrans/Text/seq_text
3)读取结果
$MAHOUT0P6_HOME/bin/mahoutseqdumper -s DataTrans/Numeric/Text/seq_text/chunk-0 -o/home/zhongchao/workspace/data/DataTrans/Text/res_text
结果如下:
Input Path:DataTrans/Text/seq_text/chunk-0
Key class: classorg.apache.hadoop.io.Text Value Class: class org.apache.hadoop.io.Text
Key:/seq_text/chunk-0: Value:
Key: /text.data:Value: package org.apache.mahout.text;
importjava.lang.reflect.Constructor;
importjava.nio.charset.Charset;
importjava.util.Map;
importcom.google.common.collect.Maps;
importcom.google.common.io.Closeables;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.SequenceFile;
importorg.apache.hadoop.util.ToolRunner;
importorg.apache.mahout.common.AbstractJob;
importorg.apache.mahout.common.HadoopUtil;
importorg.apache.mahout.common.commandline.DefaultOptionCreator;
importorg.apache.mahout.utils.io.ChunkedWriter;
Count: 2
从中可以看出key为文件名,value为文件中的内容。
vectordump专门从SequenceFile中读取数字信息,其在包mahout-integration-0.6.jar中org.apache.mahout.utils.vectors
表1.1.2-1VectorDumper命令行参数说明(VectorDumper类)
参数名称 |
参数解释 |
可选参数 |
默认值 |
-s |
SequenceFile格式结果文件,在HDFS文件系统 |
无 |
|
-o |
转换后的结果文件,文本格式,如果不设置该项,结果将打印到控制台,在本地 |
无 |
|
-u |
如果key是向量,可以使用这个参数控制其输出 |
|
|
-p |
如果-u参数给定,使用-p控制控制键按照空格分隔输出键 |
|
|
-d |
|
|
|
-dt |
字典文件格式 |
text/sequenefile |
|
-c |
输出向量的格式按照csv格式 |
|
|
-ac |
如果用csv格式输出时,用此参数可以给每行向量信息加上一条说明信息(如结果文件中的说明信息:#eigenVector0, eigenvalue = 5888.20818554016) |
|
|
-sort |
|
|
|
-sz |
|
|
|
-n |
|
|
|
-vs |
|
|
|
-fi |
|
|
|
-h |
|
|
|
见本章1.2节中第3)点。
用seqdumper命令从SequenceFile文件中读取文本信息,其实现在mahout-example-0.6-job.jar中,org.apache.mahout.utils.SequenceFileDumper
命令行参数如下
表4.1-1 seqdumper 的执行参数
参数名称 |
参数解释 |
可选参数 |
默认值 |
--seqFile (-s) seqFile |
输入路径在HDFS上 |
|
|
--output (-o) output |
输出文件路径,在本地 |
|
|
--substring (-b) substring |
The number of chars to print out per value |
|
|
--count (-c) |
Report the count only |
|
|
--numItems (-n) numItems |
Output at most <n> key value pairs |
|
|
--facets (-fa) |
Output the counts per key. Note, if there are a lot of unique keys, this can take up a fair amount of memory |
|
|
--help (-h) |
Print out help |
|
|
见本章2.2节第3)点
在对文本进行分类、聚类处理时,第一步是将文本文件转化为SequcnceFile格式,这在上面已经介绍了,本节介绍的是将SequenceFile格式的文件文件转化为向量化的SequenceFile格式。
使用seq2sparse命令可以完成此功能。其在mahout-example-0.6-job.jar包中,org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles
表5.1-1 seq2sparse向量化过程参数说明
参数名 |
说明 |
可选值 |
缺省值 |
--input (-i) input |
输入路径(转换为sequencefile格式的文本) |
|
_ |
--output (-o) output |
输出路径 |
|
_ |
--chunkSize (-chunk) chunkSiz |
一次处理的数据块大小(MB) |
|
100 |
--analyzerName (-a) analyzerName |
指定使用的分词器(org.apache.lucene.analysis.standard.StandardAnalyzer、org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer) |
|
org.apache.lucene.analysis.standard.StandardAnalyzer |
--minSupport (-s) minSupport |
词频大于minSupport的词才会成为特征词 |
|
2 |
--minDF (-md) minDF |
DF值小于minDF的单词计算tfidf值时将使用minDF计算,而不是原来的DF值。 |
|
1 |
--maxDFPercent (-x) maxDFPercent |
去除在%maxDFPercent的文档中都出现的词 |
|
99 |
--weight (-wt) weight |
向量化的方法(tf、tfidf) |
|
tfidf |
--norm (-n) norm |
按指定的范数进行规范化 |
|
0 |
--minLLR (-ml) minLLR |
当maxNGramSize>1时起作用,可以去除不常用的单词组合 |
|
1.0 |
--numReducers (-nr) numReducers |
指定reduce数目 |
|
1 |
--maxNGramSize (-ng) ngramSize |
指定ngrams |
|
1 |
--overwrite (-ow) |
如指定,则覆盖上次执行结果 |
|
_ |
--sequentialAccessVector (-seq) |
如指定,则输出结果使用连续访问效率较高的向量SequentialAccessSparseVectors,否则使用默认 |
|
RandomAccessSparseVectors |
--namedVector (-nv) |
如指定,则输出结果向量类型为nameVector |
|
false |
--logNormalize (-lnorm) |
(Optional) Whether output vectors should be logNormalize. If set true else false |
|
false |
--maxDFSigma (-xs) maxDFSigma |
What portion of the tf (tf-idf) vectors to be used, expressed in times the standard deviation (sigma) of the document frequencies of these vectors. Can be used to remove really high frequency terms. Expressed as a double value. Good value to be specified is 3.0. In case the value is less then 0 no vectors will be filtered out. Default is -1.0. Overrides maxDFPercent |
|
|
见第八部分,2.1.1节。