mahout学习过程记录--seq2sparse流程

来源:互联网 发布:mac 软件安装路径 编辑:程序博客网 时间:2024/05/16 08:35

我用的mahout-0.6,对应的类为org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;


光看名字应该知道,输入应该是SequenceFiles,文本文件会用seqdirectory命令处理成一行一个文本的形式。

在这个程序一开始,一大堆参数设置,命令行解析,这些可以先不管,第一个比较用用的程序行是:

DocumentProcessor.tokenizeDocuments(inputDir, analyzerClass, tokenizedPath, conf);

 然后我们去看DocumentProcessor这个类,它是做什么的呢?这是一个mr程序,功能呢是将文章全部token,生成tokenized-documents文件下的内容,对于我这里来讲就是将中文分词,并且按照一定格式存入tokenized-documents文件夹。这里面的mapper即为SequenceFileTokenizerMapper,在这个里面你可以更改它所使用的对于字符串分词的方法。

接下来,我选择的是-wt tf,比较重要的是这么一行:

DictionaryVectorizer.createTermFrequencyVectors(tokenizedPath, outputDir, tfDirName, conf, minSupport, maxNGramSize, minLLRValue, norm, logNormalize, reduceTasks, chunkSize, sequentialAccessOutput, namedVectors);

这个名称很明显,创建tf-vectors。在这个函数中,主要完成字典生成,给词编号,统计词频。


之后是对idf的一些处理。没什么可说的。


这里来吐槽一下:假如我要做naive bayes的文本分类,是没办法直接用它这个类做向量转换的。

原因:1、首先,SparseVectorsFromSequenceFiles是将一个输入序列文件转换为一个文本向量。假设我们用的tf向量。在这个类中,他会得到这个文件中一个总的字典,字典对应到相应的词与其唯一的一个编号,后面无论是统计词频还是生成向量,都用到了这个字典。

    2、其次,新来一批文章,对于他这个类并没有给出如何将已有的字典加载到内存中供新来的文章生成向量,也就是说,新来一个文章对于这个类来说处理方法是一样的,会生成另外一个字典,这个时候新生成的文本向量与之前训练出来的模型是没有办法做分类的。

    3、想要解决这个问题,只能修改这个类的逻辑,去动态的加载已有的字典文件。


原创粉丝点击