11.3.2 IK分词器的使用
IK分词器是一个开源的基于Java语言开发的中文分词工具包,它采用的是“正向迭代最细粒度切分算法”,支持细粒度和智能分词两种切分模式。从2006年12月推出1.0版开始至本书写作时,IK分词器已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
IK分词器的下载地址为https://code.google.com/p/ik-analyzer/downloads/list,注意一定要下载IK Analyzer2012FF_hf1.zip,其他的不支持Lucene4.0以上版本。下载后将其解压,可以看到IKAnalyzer2012FF_u1.jar、IKAnalyzer.cfg.xml和stopword.dic文件,这3个文件的作用如下。
1)IKAnalyzer2012FF_u1.jar是IK Analyzer的开发工具包。
2)IKAnalyzer.cfg.xml是IK分词器的扩展配置文件。IK分词器自带的词典包含27万左右的中文词语,能够满足基本的分词要求,但如果将IK分词器应用在专业领域,还需要对IK分词器的词典进行扩充,增加专业词汇。例如,“途观”、“君威”、“帕萨特”是汽车领域的词汇,“劲霸”、“柒牌”、“利郎”是服装领域的词汇,“来电提醒”、“随e行”、“139邮箱”是电信行业的词汇,默认情况下,IK分词器无法识别这些专业词汇,只能将其切分成一个个汉字,这显然不是我们所期望的。
3)stopword.dic是停用词词典。针对特定的应用场景,任何词语都可能是停用词,不可能有一个通用的停用词词典。默认情况下,IK分词器的分词结果会包含文章中的每一个字,不会过滤任何词。开发者可以根据实际应用需要,扩充停用词词典。
在全文检索应用中,对专业词汇和停用词的扩充是一项很重要的工作,但这并不是本章的重点,笔者就不过多介绍了,读者可以从使用手册中了解到IK分词器词典扩充的两种方法(基于配置的词典扩充和基于API的词典扩充)。
说明 ①IK分词器自带的词典文件位于JAR包的org.wltea.analyzer.dic中,它是无BOM的UTF-8编码的文本文件,每行一个词语。②如果实际项目中不需要扩充IK分词器的词典,也不需要添加停用词,那么只需引入IK分词器的JAR包即可,不需要IKAnalyzer.cfg.xml和stopword.dic。
下面是使用IK分词器结合Lucene进行分词的示例。
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- /**
- * 演示分词
- *
- * @author liufeng
- * @date 2013-11-27
- */
- public class AnalyzerTest {
- public static void main(String[] args) throws Exception {
- String content = "IK Analyzer分词测试:生科院的研究生研究生命科学。";
- // true:智能切分,false:细粒度切分
- Analyzer analyzer = new IKAnalyzer(true);
- // 对content进行分词,得到的结果是分词流
- TokenStream ts = analyzer.tokenStream("text", content);
- ts.reset();
- CharTermAttribute attr = null;
- // 遍历分词流
- while (ts.incrementToken()) {
- attr = ts.getAttribute(CharTermAttribute.class);
- System.out.print(attr.toString() + " ");
- }
- }
- }
代码中使用了IKAnalyzer类对content文本进行分词,并将分词结果打印到控制台。IKAnalyzer类的构造方法需要传入一个boolean类型的值,用于表示采用哪种分词模式,如果为true,采用智能切分;如果为false,采用最细粒度切分。上述示例要用到两个JAR包IKAnalyzer2012FF_u1.jar和lucene-core-4.6.0.jar,示例的运行结果如下:
- ik analyzer 分词 测试 生科院 的 研究生 研究 生命科学
如果采用最细粒度切分,得到的结果如下:
- ik analyzer 分词 测试 生科院 的 研究生 研究 生 研究生 研究 生命科学 生命 科学
IK分词器的两种分词模式各有优势,对于同样数量的文章,智能切分得到的关键词少,生成的索引文件小,用相同关键词检索得到的结果少、匹配度高,而最细粒度切分则相反。