IKAnalyzer结合Lucene实现中文分词(示例讲解)
作者:funnyboy0128 发布时间:2022-10-13 03:24:44
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]
来源:http://www.cnblogs.com/funnyboy0128/p/7657453.html
猜你喜欢
- springboot集成mybatis plus和dynamic-datasource注意事项环境spring-boot-starter-p
- 1、说明使用Directory类对指定文件夹下的今天或者更早日期之前的文件进行删除。2、代码//文件夹路径string strFolderP
- maven周期maven的生命周期不止package,compile,clean。其实这是主要部分。以下截图其实展示的是maven的所有周期
- 被kafka-client和springkafka版本坑上周刚刚欢天喜地的在linux上部了kafka,这周打算用spring-boot框架
- 这篇文章主要介绍了Spring Data Jpa的四种查询方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 前后端分离的项目,前端有菜单(menu),后端有API(backendApi),一个menu对应的页面有N个API接口来支持,本文介绍如何基
- 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位。当投递了无数份简历后,终于收到了一个
- Grpc是googe开发的,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。新公司的项目服务之间的调用使用的Grpc来实现服务间
- 引言根据 C# 语言规范,不可能从一个方法返回多个值。使用 C# 提供的一些其他功能,我们可以将多个值返回给调用者方法。本文概述了一些可用的
- CancellationTokenCancellationToken有一个构造函数,可以传入一个bool类型表示当前的Cancellatio
- 最近在一本J2EE的书中看到了很不错的对集合框架的说明文章,筛选后发上来和大家共享,集合框架提供管理对象集合的接口和类.它包含接口,类,算法
- 本文实例讲述了Android编程开发之NotiFication用法。分享给大家供大家参考,具体如下:notification就是通知的意思,
- 汽车前后轮倒车轨迹计算附C#源码(Unity),供大家参考,具体内容如下原理很简单, 都是高中的几何数学部分需要的参数有:车前后轴距;车宽(
- 本文实例为大家分享了C#请求http向网页发送数据、网页接收,供大家参考,具体内容如下首先,我们需要的是什么东西?用POST方式请求http
- CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout
- 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 【微信JSSDK中Config配置】 ,但是我们在真正的使用中我们不仅仅只是为了
- 目录一、服务的概念二、Android的多线程编程2.1 线程的基本用法2.2 在子线程中更新UI更新方式一更新方式二2.3 解析异步消息处理
- 本文实例为大家分享了如何使用ItemTouchHelper实现侧滑删除和拖拽的具体代码,供大家参考,具体内容如下1. 定义一个简单bean类
- 在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往
- 这篇文章主要介绍了基于SPRINGBOOT配置文件占位符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值