从92行开始,脚本完成了一系列操作:提取语料库中的文本保存到指定目录,把指定目录的文件转换为sequencefile,一气呵成!
实际上,mahout通过MapReduce执行的操作比上面的更详细。深入分析这一过程,可以了解到更多的处理细节。一起来分析它的处理步骤:
- 将文本文件转换为sequencefile
- 分词(DocumentProcessor::DocumentTokenizer)
- 统计词频(DictionaryVectorizer::WordCount)
- 生成分区向量空间(DictionaryVectorizer::MakePartialVectors)
- 合并分区向量空间(PartialVectorMerger)
- 用tfidf算法计算文档向量空间各分量的权重(VectorTfIdf Document Frequency Count )
- 优化向量空间(Prune Vectors)——将维
- 合并优化后的向量空间(PrunerPartialVectorMerger)
- 再次生成分区向量空间(MakePartialVectors)
- 再次合并分区向量空间(PartialVectorMerge)
- 聚类(Cluster Iterator running)
- 分类(Cluster Classification Driver running)
- 输出聚类结果(Representative Points Driver running)
最终的聚类输出20个分类以及他们的编号,并给出每一个分类的类间密度:
每一个类包含的节点信息保存在目录${WORK_DIR}/reuters-kmeans/clusteredPoints中:
part-m-00000是一个由map过程输出的文件,里面内容格式如下:
2949是类编号,[]中的是(词,权重)键值对。这里的词经过词典转换,存的是词典索引,具体的词典放在${WORK_DIR}/reuters-out-seqdir-sparse-kmeans/dictionary.file-0件中。
空白符的前部分是词,后半部分是词索引。
整个过程分析下来,mahout的聚类过程变得更清晰?但还有几点没有涉及:
- 分词,特别是中文分词如何处理。
- 读取聚类结果,展示给最终用户。
- 权重算法。
- 向量空间将维算法。
- 距离算法。