Java分词器 -- IKAnalyzer分词器
- 简介
- Ikanalyzer在Maven项目中的应用
- 进阶补充,自定义字典
- 参考文献
简介
java大概有11个大的开源分词器,分别是:
1.word分词器
2.Ansj分词器
3.Stanford分词器
4.FudanNLP分词器
5.Jieba分词器
6.Jcseg分词器
7.MMSeg4j分词器
8.IKAnalyzer分词器(本文要说的)
9.Paoding分词器
10.smartcn分词器
11.HanLP分词器
这里只简单说一下IKAnalyzer的使用和简单的原理,其他分词器在以后用上的时候在写文章进行详细介绍。
Ikanalyzer在Maven项目中的应用
首先pom,这里说一点,如果有什么依赖需要找的,可以去Maven官网进行下载;
<!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer -->
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
原生态的Ikanalyzer是apache提供的,这里是调用了一个第三方的封装依赖,提供了更为丰富的一些其他的功能,具体可以到Maven官网看介绍。
代码实例:
import java.io.StringReader;
import org.wltea.analyzer.cfg.DefaultConfig;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.cfg.Configuration;
/**
* 测试 IK Analyzer 分词架构中的独立使用分词方法 IK Segmenter
* 需要加载 IKAnalyzer2012_u6.jar
* @author zsoft
*/
public class IKSegmenterTest {
private static Configuration m_wordCut_cfg;
public String parse(String content, boolean useSmart) throws Exception{
StringReader sr = new StringReader(content);
// 参数2为是否使用智能分词
// true:使用智能分词
// false:使用最细粒度分词
IKSegmenter ikSegmenter = new IKSegmenter(sr, useSmart);
Lexeme word = null;
String w = null;
StringBuffer sb = new StringBuffer();
while((word = ikSegmenter.next()) != null){
w = word.getLexemeText();
// int nTtype = word.getLexemeType();
// if (nTtype == 64) continue;
if(sb.length() > 0){
sb.append("|");
}
sb.append(w);
}
return sb.toString();
}
public static void main(String[] args) {
m_wordCut_cfg = DefaultConfig.getInstance();
System.out.println(m_wordCut_cfg.getQuantifierDicionary());
String text = "网红徐如林穿着连衣裙来北京了";
try {
IKSegmenterTest ikSegmenterTest = new IKSegmenterTest();
String strs = ikSegmenterTest.parse(text,true);
System.out.println("使用智能分词结果:"+strs);
strs = ikSegmenterTest.parse(text, false);
System.out.println("最细粒度分词结果:"+strs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
进阶补充,自定义字典
需要创建IKAnalyzer.cfg.xml,和自定义ext.dic字典,如果我们看IKAnalyzer提供给我们的原生字典的话,就会知道,他们分词的依据也来自于大量的字典词汇,而我们要实现自定义扩充字典,也就需要IKAnalyzer.cfg.xml配置文件将我们自定义的字典进行读取。
代码实例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典 -->
<!-- <entry key="ext_stopwords">stopword.dic;org/wltea/analyzer/dic/main2012.dic;</entry>-->
</properties>
字典信息:
网红
徐如林
不动如山
这样的话,一些人名之类的词汇,也会被分出来,输出结果为:
org/wltea/analyzer/dic/quantifier.dic
加载扩展词典:ext.dic
使用智能分词结果:网红|徐如林|穿着|连衣裙|来|北京|了
最细粒度分词结果:网红|徐如林|如林|穿着|连衣裙|衣裙|来|北京|了
最后补充一下我项目的目录结构
参考文献
11大Java开源中文分词器的使用方法和分词效果对比 如果需要使用其他分词器,可以参考这篇博客。