在运行Mahout中的算法之前需要将文本数据(数字或者字符串)转化为SequenceFile格式作为Mahout中算法的输入,待Mahout中的算法执行完成后结果文件也是SequenceFile格式的,SequenceFile格式是Hadoop特有的二进制格式,所以需要将其转化为人可以读懂的文本格式。以上的这一数据转化过程,在上面几章中可见一斑。
本章中将对Mahout中存在的输入、输出格式转化的接口进行总结,其中一些事在以上某些章节中已经使用到的,有的是新增加的。
方法名称 | 方法描述 |
InputDriver | 数字文件转化为SequenceFile格式 |
|
|
|
|
|
|
|
|
|
|
1 数字文件转化为SequenceFile格式
1.1 简介
数字文件指的是文件中包含的是数字,整型或者浮点型都是可以的,如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.2 使用方式介绍
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就是每个样本中的数据。
2 文本文件转化为SequenceFile格式
2.1 简介
如果利用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) | 打印帮助信息 |
|
|
2.2 使用方式
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为文件中的内容。
3 从SequenceFile中读取数字信息
3.1 简介
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 |
|
|
|
3.2 使用方式
见本章1.2节中第3)点。
4 从SequenceFile文件读取文本信息
4.1 简介
用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 |
|
|
4.2 使用方式
见本章2.2节第3)点
5 将SequenceFile格式的文本文件转化为向量文件
5.1 简介
在对文本进行分类、聚类处理时,第一步是将文本文件转化为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 |
|
|
5.2 使用方式
见第八部分,2.1.1节。