Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2469036
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类: Java

2013-03-21 17:13:21



输入分析:

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,,这样终端下,就会列出详细的参数选项及说明

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



运行官网上的mahout kmeas示例,结果文件夹有clusteredPoints,clusters-N,data,用命令mahout seqdumper仔细看了一下结果文件

clusteredPoints:存放的是最后聚类的结果,将cluster-id和documents-id都展示出来了,用mahout seqdumper读clusteredPoints结果的key-value类型是(IntWritable,WeightedVectorWritable)

clusters-N:是第N次聚类的结果,其中n为某类的样本数目,c为各类各属性的中心,r为各类属性的半径。 clusters-N结果类型是(Text,Cluster)

data:存放的是原始数据,这个文件夹下的文件可以用mahout vectordump来读取,原始数据是向量形式的,其它的都只能用mahout seqdumper来读取,向量文件也可以用mahout seqdumper来读取,只是用vectordump读取出来的是数字结果,没有对应的key,用seqdumper读出来的可以看到key,即对应的url,而value读出来的是一个类描述,而不是数组向量

为什么mahout seqdumper可以读任何SequenceFiles文件呢?看了一下源文件,是因为用的reader.getValueClass().newInstance()去读取的

clusters-0:读出来的结果(key,value)类型是(Text,Canopy),我猜应该是随机从原始数据里取出五个点来做初始聚类中心点,看到里面有RandomAccessSparseVector类,而后成的clusters-N读出来的(key,value)都是(Text,Cluster)类型,查了一下Canopy,说Canopy 聚类算法经常用于 K 均值聚类算法的预处理,用来找合适的 k 值和簇中心。

bin/mahout clusterdump --seqFileDir output/clusters-10 --pointsDir output/clusteredPoints --output /home/test/output
这个命令会将每一类的点列出来,seqFileDir指向的目录存放的是某类有几个点和该类的质心点及半径,即clusters-N目录,pointsDir指向的是所有输入点归于哪一类,即clusteredPoints目录,两者联合起来,就可以列举出属于同一类的所有点

注意seqFileDir指向的目录,要是最后一次迭代的结果目录,最后一次迭代的结果才是最终的结果

mahout Kmeans聚类有两个重要参数:收敛Delta和最大迭代次数.所以有时候改敛时,并还没有达到最大迭代次数

关于mahout命令的运行的几点说明

1.如果没设置HADOOP_HOME,mahout seqdumper的输入路径是本地的目录,而不是HDFS上的目录,如果要查看HDFS上的结果,需要先将文件从HDFS上拷下来,当设置了HADOOP_HOME后,用seqdumper去查看结果时,输入路径则是HDFS上的目录。

2.读写路径跟源文件中是不是用到hadoop的FileSystem类无关,前面一直理解错了,以为用到这个类,就认为一定是在HDFS上操作,自己写了一个简单的SequenceFile文件读写测试,发现刚开始run as->java application,读写操作是操作的本地目录,如果run as->run on hadoop,则读写操作就在HDFS上,将hadoop停掉后,此时在去run as->java application,一直会提示连接不到hdfs,难道一次操作在hdfs上后,后面不管是run as->java application,还是run as->run on hadoop,都必须是在hdsf上吗?有知道原因的大侠,还请赐教!hadoop在启动过后,需要等一段时间,因为还在安全模式下,此时不能在hdfs上创建文件

3.将(Text,ParseText)->(Text,Text),这样才能用seq2sparse将文本转成向量,如果不这样的话,必须自己将文本信息用tfidf算法转成对应的数组,然后再由

RandomAccessSparseVector类或DenseVector类包装成向量,因为现有的算法中,还没有直接处理文本的,全都要转成数字来度量特征,然后根据某种条件收敛,从这里也可以看出计算机对数学的依赖有多大了,自然语言是不好处理的。



在Mahout_in_Action这本书中,给了一个文本的聚类实例,并提供了原始输入数据,下面结合例子说明

作为聚类算法的主要应用场景 - 文本分类,对文本信息的建模也是一个常见的问题。在信息检索研究领域已经有很好的建模方式,就是信息检索领域中最常用的向量空间模型

词频 - 逆向文本频率 (Term Frequency – Inverse Document Frequency, TF-IDF):它是对 TF 方法的一种加强,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在所有文本中出现的频率成反比下降。举个例子,对于“高频无意义词汇”,因为它们大部分会出现在所有的文本中,所以它们的权重会大打折扣,这样就使得文本模型在描述文本特征上更加精确。在信息检索领域,TF-IDF 是对文本信息建模的最常用的方法。

对于文本信息的向量化,Mahout 已经提供了工具类,它基于 Lucene 给出了对文本信息进行分析,然后创建文本向量。下面给出了一个例子,分析的文本数据是路透提供的新闻数据。将数据集下载后,放在“src/test/input”目录下。数据集下载地址:

1. 将路透的数据解压缩,Mahout 提供了专门的方法

  1. File inputFolder = new File("src/test/input");
  2. File outputFolder = new File("src/test/input-extracted");
  3. ExtractReuters extractor = new ExtractReuters(inputFolder, outputFolder);
  4. extractor.extract();

2. 将数据存储成 SequenceFile

mahout直接进供了seqdirectory方法来将字符文本转成SequenceFile,可以直接bin/mahout seqdirectory -h,查看一下这个命令的帮助,将输入和输出参数设好,这里的输入就直接用上一步提取出的文本,目录在"src/test/input-extracted"

3.将 SequenceFile 文件中的数据,基于 Lucene 的工具进行向量化

mahout直接提供了seq2sparse命令来转向量,可以直接bin/mahout seq2sparse -h,查看一下这个命令的帮助,输入为第二步的输出

生成的向量化文件的目录结构是这样的:

  • df-count 目录:保存着文本的频率信息
  • tf-vectors 目录:保存着以 TF 作为权值的文本向量
  • tfidf-vectors 目录:保存着以 TFIDF 作为权值的文本向量
  • tokenized-documents 目录:保存着分词过后的文本信息
  • wordcount 目录:保存着全局的词汇出现的次数
  • dictionary.file-0 目录:保存着这些文本的词汇表
  • frequcency-file-0 目录 : 保存着词汇表对应的频率信息。

再用mahout kmeans进行聚类,输入参数为tf-vectors 目录下的文件,如果整个过程没错,就可以看到输出结果目录clusters-N

最后可以用mahout提供的结果查看命令mahout clusterdump来分析聚类结果


http://blog.sina.com.cn/s/blog_6e6ef9830101ahs9.html

阅读(6334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~