使用mahout对Sogou语料库进行分类
软件版本
- Ubuntu Linux
- mahout-0.9,本文写作的时候的最新版本
- Sogou语料库精简版
- ik-analyzer, 这个版本是专门为了在mahout中进行分词而单独做的版本,源码从官方拿来。只更改了停用词,以及适配lucene4.6.1版本。maven化更方便使用。
Sogou语料库处理
下载后的预料库,文档都是GB2312编码的。虽然mahout支持不同的编码方式,但是为了更方便的放到Hadoop里跑,还是建议先转化为标准的UTF-8.
语料库解压后,是sogou目录。我们执行以下代码进行转化,转换后的在utf/sogou目录下:
1 | find sogou -type d -exec mkdir -p utf/{} \; |
使用mahout生成sequence file
进入utf/sogou目录,执行:
1 | mahout seqdirectory -i sogou -o sogou-seq -c UTF-8 -ow |
生成的sequence file存放在sogou-seq目录内。
可以通过seqdumper命令查看:
1 | mahout seqdumper -i sogou-seq/part-m-00000 | more |
如果是在hadoop上跑,可以这样看。
1 | hadoop fs -text sogou-seq/part-m-00000 | more |
使用seq2sparse生成Vectors
执行命令:
1 | mahout seq2sparse -i sogou-seq -o sogou-vectors -lnorm -nv -wt tfidf -a org.wltea.analyzer.lucene.IKAnalyzer -ow |
查看生成的vector
1 | mahout vectordump -i sogou-vectors/tfidf-vectors/part-r-00000 | more |
需要注意的是org.wltea.analyzer.lucene.IKAnalyzer
,是上面提到的ik-analyzer里的。需要将ik-analyzer打包,然后将打出的包,放入$MAHOUT_HOME/lib内。默认是英文的,使用的是org.apache.lucene.analysis.standard.StandardAnalyzer
,空格分割明显不适用中文。
切分训练集和测试集
1 | mahout split -i sogou-vectors/tfidf-vectors/ --trainingOutput sogou-train-vectors --testOutput sogou-test-vectors --randomSelectionPct 40 --overwrite --sequenceFiles -xm sequential |
使用Native Bayes训练model
1 | mahout trainnb -i sogou-train-vectors -el -o sogou-model -li sogou-labelindex -ow -c |
使用测试集来查看效果
1 | mahout testnb -i sogou-test-vectors -m sogou-model -l sogou-labelindex -ow -o sogou-testing -c |
可以看出87%的正确率还是不错的。
参考文档:
http://mahout.apache.org/users/classification/twenty-newsgroups.html
http://www.sogou.com/labs/dl/c.html