1 前言
昨天在nutch中添加了JE中文分词,今天有试了下基于中科院的多层隐马模型的分词组件,imdict-chinese-analyzer,目前这个组件已经正式集成到lucene-3.0,具体在要用到lucene-analyzers-3.0.1.jar 和 lucene-smartcn-3.0.1.jar 这二个包在contrib\analyzers文件,由于nutch-1.0中的lucene包还没有用到lucene-3.0,所以如果需要在 nutch1.0中直接调用 lucene-smartcn-3.0.1.jar还需要lucene-core-3.0.1.jar包,我简介下:
SmartChineseAnalyzer 是一个智能中文分词模块, 能够利用概率对汉语句子进行最优切分, 并内嵌英文tokenizer,能有效处理中英文混合的文本内容。 它的原理基于自然语言处理领域的隐马尔科夫模型(HMM), 利用大量语料库的训练来统计汉语词汇的词频和跳转概率, 从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分。 因为智能分词需要词典来保存词汇的统计值,SmartChineseAnalyzer的运行需要指定词典位置,如何指定词典位置请参考 org.apache.lucene.analysis.cn.smart.AnalyzerProfile
SmartChineseAnalyzer 的算法和语料库词典来自于ictclas1.0项目(http://www.ictclas.org)
但是我不建议这不做,可能会出现冲突,因为nutch-1.0中是lucene-core-2.4.*.jar,因此还是等nutch的更高的版本,因该也会集成这中给予隐马模型的中文分词。好了,还是说说我的方法吧!
2 修改源代码方式添加imdict-chinese-analyzer
2.1 工具:eclipse ant javacc
2.1 准备工作
1> 首先下载 imdict-chinese-analyzer分词包和nutch源代码,下载来的imdict-chinese-analyzer- java5.zip里面只是一个eclipse工程,我们要利用这个工程生成一个jar来用,或者也可以直接放到nutch的源代码项目中。这里注意的是如果要编译 imdict-chinese-analyzer-java5.zip需要在项目中加入lucene-core-2.4.0.jar 和junit-4.1.jar
2> 将 jar放入nutch的类路径。
3> 修改org.apache.nutch.analysis下 NutchAnalysis.jj文件。
将
| <SIGRAM: <CJK> >
改成
| <SIGRAM: (<CJK>)+ >
然后用javacc编译NutchAnalysis.jj文件,编译出7个java源文件。
注意修改 org.apache.nutch.analysis.ParseException.java。
原来是
public class ParseException extends Exception
改为public class ParseException extends IOException
确保这7个文件放入工程后还能都编译过去。
4> 修改 org.apache.nutch.analysis.NutchDocumentAnalyzer.java
将源文件最后的那个函数修改为下面
就是使用了新的分词程序。
public TokenStream tokenStream(String fieldName, Reader reader) { Analyzer analyzer;
analyzer = new org.apache.lucene.analysis.cn.SmartChineseAnalyzer(true); return analyzer.tokenStream(fieldName, reader);
}
6>修改根目录下的build.xml文件,加入chinese-analyzer.jar包,具体可以参考上篇文章
5> ant 编译
进入nutch-1.0目录下
执行:ant 产生nutch-1.0.job
执行:ant jar产生nutch-1.0.jar
执行:ant war产生nutch-1.0.war
3 实验发现
相比于JE分词,基于多层隐马模型具有高好的召回率和准确率,并且可以没有丢失英文的信息部分,而JE似乎将英文过滤了,因而使得加入JE分词后搜索英文关键词时召回率几乎畏0.实验证明,基于多层隐马模型的imdict-chinese-analyzer 可以提高搜索引擎的召回率和准确率。