IKAnalyzer结合Lucene实现中文分词
1、基本介绍
随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生。对于英文分词处理相对简单,经过拆分单词、排斥停止词、提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的复杂导致分词并没英文分词那么简单,一般都是通过相关的分词工具来实现,目前比较常用的有庖丁分词以及IKAnalyzer等。这里我们主要通过一个简单的Demo聊聊IKAnalyzer的基本使用。IKAnalyzer是一个开源的,基于java开发的分词工具包,它独立于Lucene项目,同时提供了Lucene的默认实现。
2、IKAnalyzer结合Lucene实现简单的中文分词
我们通过一个基本的Demo来实践说明,步骤如下:
step1:准备相关的Jar依赖,lucene-core-5.1.0.jar、ik.jar,然后新建项目,引入相关依赖项目结构如下:
IkDemo-src
-con.funnyboy.ik
-IKAnalyzer.cfg.xml
-stopword.dic
-ext.dic
-Reference Libraries
-lucene-core-5.1.0.jar
-ik.jar
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;</entry>
</properties>
其中的ext.dic配置自己的扩展字典,stopword.dic配置自己的扩展停止词字典
step2:通过java代码验证测试
public class MyIkTest {
public static String str = "中国人民银行我是中国人";
public static void main(String[] args) {
MyIkTest test = new MyIkTest();
test.wordCount("", str);
}
private void wordCount(String arg,String content) {
Analyzer analyzer = new IKAnalyzer(true); // IK实现分词 true:用最大词长分词 false:最细粒度切分
StringReader reader = null;
TokenStream ts = null; try {
reader = new StringReader(content);
ts = analyzer.tokenStream(arg,reader);
CharTermAttribute term = ts.addAttribute(CharTermAttribute.class);
ts.reset();
Map<String, Integer> map = new HashMap<String, Integer>(); //统计
while (ts.incrementToken()) {
String str = term.toString();
Object o = map.get(str);
if (o == null) {
map.put(str, new Integer(1));
} else {
Integer i = new Integer(((Integer) o).intValue() + 1);
map.put(str, i);
}
}
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2) {
return (o2.getValue() - o1.getValue());
} });
for (int k=0;k<list.size();k++) {
Entry<String, Integer> it=list.get(k);
String word = it.getKey().toString();
System.err.println(word+"["+it.getValue()+"]");
}
} catch (Exception e) {
} finally {
if(reader != null){
reader.close();
}
if (analyzer != null) {
analyzer.close();
}
}
}
}
执行程序测试结果如下:
中国人民银行[1]
中国人[1]
我[1]
3、配置说明
a、如何自定义配置扩展词典和停止词典 IKAnalyzer.cfg.xml中定义了扩展词典和停止词典,如果有多好个可以通过;配置多个。扩展词典是指用户可以根据自己定义的词义实现分词,比如人名在默认的词典中并未实现,需要自定义实现分词,卡可以通过在ext.dic中新增自定义的词语。停止词是指对于分词没有实际意义但出现频率很高的词,比如吗、乎等语气词,用户也可以通过在stopword.dic中自定义相关的停止词。
b、关于最大词长分词和最小粒度分词的区分 在IKAnalyzer构造方法中可以通过提供一个标示来实现最大词长分词和最小粒度分词,true为最大词长分词,默认是最小粒度分词。对"中国人民银行我是中国人"分别测试结果如下:
最大词长分词结果如下:
中国人民银行[1]
中国人[1]
我[1]
最小粒度分词结果如下:
国人[2]
中国人[2]
中国[2]
人民[1]
中国人民银行[1]
我[1]
人民银行[1]
中国人民[1]
银行[1]
IKAnalyzer结合Lucene实现中文分词的更多相关文章
- Lucene的中文分词器IKAnalyzer
分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Ana ...
- Lucene的中文分词器
1 什么是中文分词器 学过英文的都知道,英文是以单词为单位的,单词与单词之间以空格或者逗号句号隔开. 而中文的语义比较特殊,很难像英文那样,一个汉字一个汉字来划分. 所以需要一个能自动识别中文语义的分 ...
- (转)全文检索技术学习(三)——Lucene支持中文分词
http://blog.csdn.net/yerenyuan_pku/article/details/72591778 分析器(Analyzer)的执行过程 如下图是语汇单元的生成过程: 从一个Re ...
- lucene之中文分词及其高亮显示(五)
中文分词:即换个分词器 Analyzer analyzer = new StandardAnalyzer();// 标准分词器 换成 SmartChineseAnalyzer analyze ...
- Lucene整理--中文分词
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hai_cheng001/article/details/37511379 看lucene主页(htt ...
- lucene之中文分词及其高亮显示
参考:http://www.cnblogs.com/lirenzhujiu/p/5914174.html http://www.cnblogs.com/xing901022/p/3933675.htm ...
- Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...
- Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Lucene学习——IKAnalyzer中文分词
一.环境 1.平台:MyEclipse8.5/JDK1.5 2.开源框架:Lucene3.6.1/IKAnalyzer2012 3.目的:测试IKAnalyzer的分词效果 二.开发调试 1.下载框架 ...
随机推荐
- 一、Java 23 种设计模式简介
一.23种设计模式分类: 二.设计模式的六大原则: 1.开闭原则(Open Close Principle):对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效 ...
- 使用Fiddler获取OAuth2认证的access token时候返回502
微软动态CRM专家罗勇 ,回复322或者20190402可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 我这里Fiddler的Composer功能来获取OAuth2 认 ...
- 如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)
相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集 首先添加测试数据 ), Age INT) go CREATE INDEX idx_age ON TempList (Age) ...
- Cesium3DTileset示例
3D Tiles是Cesium中很核心的一部分,尤其是用来实现大范围的模型场景数据的加载应用. 三维倾斜模型.人工建模.BIM模型等等,都可以转换成3D Tiles,进而为我们所用. 从Cesium1 ...
- 对 Undefined 与 Null 的一些理解
Undefined 和 Null 是 Javascript 中两种特殊的原始数据类型(Primary Type),它们都只有一个值,分别对应 undefined 和 null ,这两种不同类型的值,既 ...
- ng6.1 新特性:滚回到之前的位置
在之前的版本中滚动条位置是一个大问题,主要表现在 1. 使用快捷键或者手势前进/后退的时候,滚动条的位置经常是错乱的,所以只能每个页面都要重置一个滚动条的位置: 2. #anchor1 锚点位置无法定 ...
- python之读取配置文件模块configparser(二)参数详解
configparser.ConfigParser参数详解 从configparser的__ini__中可以看到有如下参数: def __init__(self, defaults=None, dic ...
- 【工利其器】必会工具之(一)Source Insight篇
前言 “Source Insight(以下简称SI)是世界上最好的编辑器”,说这句话不知道会不会出门被打呢?-_- 中国古话说得好,“文无第一,武无第二”,所以不敢说SI是最好的,但是 ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
- Docker最全教程——数据库容器化(十)
终于按时完成第二篇.本来准备着手讲一些实践,但是数据库部分没有讲到,部分实践会存在一些问题,于是就有了此篇以及后续——数据库容器化.本篇将从SQL Server容器化实践开始,并逐步讲解其他数据库的容 ...