分词器——ik——分词算法
IK Analyzer 3.0特性
采用了特有的"正向迭代最细粒度切分算法",具有80万字/秒的高速处理能力
采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
优化的词典存储,更小的内存占用。支持用户词典扩展定义
针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
IK 分词算法理解
根据官方说法 IK 分词器采用"正向迭代最细粒度切分算法", 分析它的源代码,可以看到分词工具类 IKQueryParser 起至关重要的作用, 它对搜索关键词采用从最大词到最小词层层迭代检索方式切分。
比如搜索词:"人民大会堂",
若按最大词长切分,到词库中检索该搜索词中最大分割词, 即分割为:"人民大会堂"。
若按最细粒度切分,首先到词库中检索该搜索词中最大分割词, 即分割为:"人民大会堂",然后对"人民大会堂"切分为"人民大会"和"大会堂",以此类推。最后,"人民大会堂"切分为:"人民大会堂|人民大会|人民|民大|大会堂|大会|会堂"。
复制代码
package org.apache.lucene.demo;
import java.io.StringReader;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Util {
static final Logger logger = LoggerFactory.getLogger(Util.class);
/**
* 分词器分词
*
* @param text
* @param analyzer
* @throws Exception
*/
private static String token(String text, boolean isMaxWordLength)
throws Exception {
try {
java.util.List<String> list = new java.util.ArrayList<String>();
org.wltea.analyzer.IKSegmentation ikSegmenter = new org.wltea.analyzer.IKSegmentation(new StringReader(text), isMaxWordLength);
org.wltea.analyzer.Lexeme lexeme;
while ((lexeme = ikSegmenter.next()) != null) {
list.add(lexeme.getLexemeText());
}
return StringUtils.join(list, "|");
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) throws Exception {
String text = "希腊晋级16强不要奖金要基地 称是为人民而战 人民大会堂";
// String text = "希腊总理:相信希腊人民希望留在欧元区";
System.out.println(token(text, false));
System.out.println(token(text, true));
}
}
复制代码
分词结果是:
希腊|晋级|16|强不|奖金|金|基地|称是|是为|为人民|为人|人民|民而|而战|人民大会堂|人民大会|人民|民大|大会堂|大会|会堂
希腊|晋级|16|强不|奖金|基地|称是|是为|为人民|民而|而战|人民大会堂
附录:IK分词处理过程
IK<IKAnalyzer-3.2.8>的整个分词处理过程首先,介绍一下IK的整个分词处理过程:
1. Lucene的分词基类是Analyzer,所以IK提供了Analyzer的一个实现类IKAnalyzer。首先,我们要实例化一个IKAnalyzer,它有一个构造方法接收一个参数isMaxWordLength,这个参数是标识IK是否采用最大词长分词,还是采用最细粒度切分两种分词算法。实际两种算法的实现,最大词长切分是对最细粒度切分的一种后续处理,是对最细粒度切分结果的过滤,选择出最长的分词结果。
2. IKAnalyzer类重写了Analyzer的tokenStream方法,这个方法接收两个参数,field name和输入流reader,其中filed name是Lucene的属性列,是对文本内容进行过分词处理和创建索引之后,索引对应的一个名称,类似数据库的列名。因为IK仅仅涉及分词处理,所以对field name没有进行任何处理,所以此处不做任何讨论。
3. tokenStream方法在Lucene对文本输入流reader进行分词处理时被调用,在IKAnalyzer的tokenStream方法里面仅仅实例化了一个IKTokenizer类,该类继承了Lucene的Tokenizer类。并重写了incrementToken方法,该方法的作用是处理文本输入流生成token,也就是Lucene的最小词元term,在IK里面叫做Lexeme。
4. 在IKtokenizer的构造方法里面实例化了IK里面最终要的分词类IKSegmentation,也称为主分词器。它的构造方法接收两个参数,reader和isMaxWordLength。
5. IKsegmentation的构造方法里面,主要做了三个工作,创建上下文对象Context,加载词典,创建子分词器。
6. Contex主要是存储分词结果集和记录分词处理的游标位置。
7. 词典是作为一个单例被创建的,主要有量词词典、主词典和停词词典。词典是被存储在字典片段类DictSegment 这个字典核心类里面的。DictSegment有一个静态的存储结构charMap,是公共词典表,用来存储所有汉字,key和value都是一个中文汉字,目前IK里面的charMap大概有7100多的键值对。另外,DictSegment还有两个最重要的数据结构,是用来存储字典树的,一个是DictSegment的数组childrenArray,另一个是key为单个汉字(每个词条的第一个汉字),value是DictSegment的HashMap childrenMap。这两个数据结构二者取其一,用来存储字典树。
8. 子分词器才是真正的分词类,IK里面有三个子分词器,量词分词器,CJK分词器(处理中文),停词分词器。主分词器IKSegmentation遍历这三个分词器对文本输入流进行分词处理。
9. IKTokenizer的incrementToken方法调用了IKSegmentation的next方法,next的作用是获得下一个分词结果。next在第一次被调用的时候,需要加载文本输入流,并将其读入buffer,此时便遍历子分词器,对buffer种的文本内容进行分词处理,然后把分词结果添加到context的lexemeSet中。
关键API说明
类org.wltea.analyzer.lucene.IKAnalyzer
说明:IK分词器的主类,是IK分词器的Lucene Analyzer类实现。
该类使用方法请参考 “代码样例”章节
类org.wltea.analyzer.lucene.IKQueryParser
public static Query parse(String field , String query) throws IOException
说明:单条件,单Field查询分析
参数1 :String field, 查询的目标域名称
参数2 :String query , 查询的关键字
返回值:构造一个单条件,单Field查询器
public static Query parseMultiField(String[] fields , String query) throws IOException
说明:多Field,单条件查询分析
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String query , 查询的关键字
返回值:构造一个多Field,单条件的查询器
public static Query parseMultiField(String[] fields , String query , BooleanClause.Occur[] flags) throws IOException
说明:多Field,单条件,多Occur查询分析
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String query , 查询的关键字
参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
返回值:构造一个多Field,单条件,多Occur的查询器
public static Query parseMultiField(String[] fields , String[] queries) throws IOException
说明:多Field,多条件查询分析
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String[] queries , 对应多个查询域的关键字数组
返回值:构造一个多Field,多条件的查询器
public static Query parseMultiField(String[] fields , String[] queries , BooleanClause.Occur[] flags) throws IOException
说明:多Field,多条件,多Occur查询
参数1 :String[] fields, 多个查询的目标域名称的数组
参数2 :String[] queries , 对应多个查询域的关键字数组
参数3 :BooleanClause.Occur[] flags , 查询条件的组合方式(Or/And)
返回值:构造一个多Field, 多条件, 多Occur的查询器
类org.wltea.analyzer.lucene.IKSimilarity
说明: IKAnalyzer 的相似度评估器。该类重载了DefaultSimilarity的coord方法,提高词元命中个数在相似度比较中的权重影响,即,当有多个词元得到匹配时,文档的相似度将提高。
该类使用方法请参考 “代码样例”章节
类org.wltea.analyzer.IKSegmentation
说明: 这是IK分词器的核心类。它是真正意义上的分词器实现。IKAnalyzer的3.0版本有别于之前的版本,它是一个可以独立于Lucene的Java分词器实现。当您需要在Lucene以外的环境中单独使用IK中文分词 组件时,IKSegmentation正是您要找的。
public Lexeme next() throws IOException
说明:读取分词器切分出的下一个语义单元,如果返回null,表示分词器已经结束。
返回值:Lexeme 语义单元对象,即相当于Lucene的词元对象Token
类org.wltea.analyzer.Lexeme
说明: 这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于3.0版本被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。
public int getBeginPosition()
说明:获取语义单元的起始字符在文本中的位置
返回值:int , 语义单元相对于文本的绝对起始位置
public int getEndPosition()
说明:获取语义单元的结束字符的下一个位置
返回值:int , 语义单元相对于文本的绝对终止位置的下一个字符位置
public int getLength()
说明:获取语义单元包含字符串的长度
返回值:int , 语义单元长度 = getEndPosition – getBeginPosition
public String getLexemeText()
说明:获取语义单元包含字符串内容
返回值:String, 语义单元的实际内容,即分词的结果
参考:
http://www.cnblogs.com/dennisit/archive/2013/04/07/3005847.html
http://interview.group.iteye.com/group/wiki/1899-ik-analyzer
分词器——ik——分词算法相关推荐
- 本地elasticsearch中文分词器 ik分词器安装及使用
ElasticSearch 内置了分词器,如标准分词器.简单分词器.空白词器等.但这些分词器对我们最常使用的中文并不友好,不能按我们的语言习惯进行分词. ik分词器就是一个标准的中文分词器.它可以根据 ...
- ElasticSearch中文分词器-IK分词器的使用
IK分词器的使用 首先我们通过Postman发送GET请求查询分词效果 GET http://localhost:9200/_analyze {"text":"农业银行& ...
- IK分词器-自定义分词算法与自定义分词配置
一.分词的概念 分词:就是把我们要查询的数据拆分成一个个关键字,我们在搜索时,ElasticSearch会把数据进行分词,然后做匹配.默认的中文分词器会把每一个中文拆分,比如"迪丽热巴&qu ...
- Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展
一.ik中文分词器 上篇文章我们学习了ES集群分片和水平扩容,前面再使用的时候应该就会发现,在做match 匹配时,默认会进行分词,但当查询内容是中文时,分词效果是一个字被认定了一个词,这显然不符合我 ...
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...
- ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库
文章目录 # 实验环境 # ik分词器的下载.安装.测试 ## 安装方法一:使用elasticsearch-plugin 安装 ## 安装方法二:下载编译好的包进行安装 1.下载 2.安装 3.重启` ...
- Elasticsearch之分词器查询分词效果
0.引言 Elasticsearch之分词器中文的我们一般使用IK,如果没有指定分词器.默认使用的是standard分词. IK分词能将中文分成词组: standard分词则会将每个中文分成一个单个的 ...
- CentOS安装Elasticsearch_IK分词器拼音分词器_部署kibana_部署es集群
CentOS安装Elasticsearch_IK分词器_部署kibana_部署es集群 一.部署单点es ①:创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联.这里先 ...
- ELK系列(十)、ES中文分词器IK插件安装和配置远程词库热加载
简介 IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包: 最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件:从 3.0 版本开始 ...
最新文章
- 在WP7下自定义RelativeSource 的Binding
- 大众点评订单分库分表实践之路
- 成为更优秀的程序员:退后一步看问题
- java1.7开发环境_在Windows平台搭建Java 1.7开发环境
- React开发(262):react中活动时间回显用moment
- Cocos2dx中零散知识点
- RCD:Residual Current Device,剩余电流装置
- java invoke 返回类型_java-控制器处理程序方法支持的返回类型
- asp中的session使用方法详解
- 卡巴斯基实验室2017年威胁预测
- sla java_Grafana中滑动窗口的Prometheus正常运行时间或SLA百分比
- 巴菲特致股东的一封信:1989年
- 解决“双系统删除其中一个,BIOS仍然有其启动项”问题
- python全栈开发中级班全程笔记(第三模块、第一章(多态、封装、反射、内置方法、元类、作业))...
- 计算机系统概论基本知识
- 【C语言】以通讯录为例理解宿舍管理系统,图书管理系统完成C语言期末作业。源代码见文章末尾
- 人工智能导论-动物识别专家系统
- 支小蜜智慧食堂刷脸就餐让学生不再刷卡吃饭
- 《高级计算机网络》之无线传感网——大连理工大学研究生课程整理笔记(非常详细,通俗易懂)
- 搭建系统App、小程序到底要多少钱?