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


猜你喜欢
- OkHttp 提供了对用户认证的支持。当 HTTP 响应的状态代码是 401 时,OkHttp 会从设置的 Authenticator 对象
- 实现 bean 初始化、摧毁方法的配置与处理spring支持我们自定义 bean 的初始化方法和摧毁方法。配置方式可以通过 xml 的 in
- 使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要
- 常见Bean后处理器的作用:public static void main(String[] args) { &
- public interface ICacheStrategy { &
- 1.概览该教程中,我将向你展示:如何在测试时设置spring boot 日志级别。虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测
- SpringMVC异常处理机制(一)项目前准备首先参照文章Spring课程工程构建+SpringMVC简介及其快速入门搭建项目搭建好一个项目
- 我们初学java的第一个程序是"hello world" public class HelloWorld {  
- 这次我们来说一下hibernate的层次设计,层次设计也就是实体之间的继承关系的设计。 也许这样比较抽象,我们直接看例子。&nbs
- using System;using System.Diagnostics;using System.Runtime.InteropServ
- Java * 模式 代理:一个角色代表别一个角色来实现某些特定的能功。 比
- 本文实例讲述了Android网络数据开关用法。分享给大家供大家参考,具体如下:api中没有开放这部分接口。因此大家可以使用这个方法,true
- 状态转移方程:d(i,j) = min(d(i,j),d(i,k)+d(k,j)),其中i<k<j思路对于每一个k(i<k
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且
- 使用udp实现消息的接收和发送代码比较简单,但是别忘记关闭防火墙进行测试。首先便是服务端,使用Socket进行实现,参考代码如下: 
- [LeetCode] 131.Palindrome Partitioning 拆分回文串Given a string s, par
- •静态构造函数既没有访问修饰符,也没有参数。•如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静
- 在上一篇文章《驱动开发:内核字符串转换方法》中简单介绍了内核是如何使用字符串以及字符串之间的转换方法,本章将继续探索字符串的拷贝与比较,与应
- 接着上篇文章,我们继续来学习 Java 中的字节流操作。装饰者缓冲流 BufferedInput/OutputStream装饰者流其实是基于
- 什么是枚举?枚举是JDK5引入的新特性。在某些情况下,一个类的对象是固定的,就可以定义为枚举。在实际使用中,枚举类型也可以作为一种规范,保障