ik_smart 与 ik_max_word到底有啥区别?

ik_smart 与 ik_max_word 的异同

首先来看下官方的FAQs

What is the difference between ik_max_word and ik_smart?

ik_max_word: Performs the finest-grained segmentation of the text. For example, it will segment "中华人民共和国国歌" into "中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌", exhaustively generating various possible combinations, suitable for Term Query.

ik_smart: Performs the coarsest-grained segmentation of the text. For example, it will segment "中华人民共和国国歌" into "中华人民共和国,国歌", suitable for Phrase queries.

Note: ik_smart is not a subset of ik_max_word.

官方这里简单的描述了一下使用用途,即:

  1. ik_smart 比较适合 match_phrase query,而 ik_max_word 更合适 term query。
  1. ik_smart 的分词结果并不是 ik_max_word 的分词结果的子集。

那这两个分词器在具体实现上会有什么不一样呢?

哪些场景两个分词器的分词结果肯定不同呢?

造成分词结果不一样的原因是什么?

3、ik 分词器源码分析

3.1. 量词处理源码剖析

这里先看一下这段代码。

复制代码
  private void compound(Lexeme result){

  if(!this.cfg.isUseSmart()){
   return ;
  }
     //数量词合并处理
  if(!this.results.isEmpty()){

   if(Lexeme.TYPE_ARABIC == result.getLexemeType()){
    Lexeme nextLexeme = this.results.peekFirst();
    boolean appendOk = false;
    if(Lexeme.TYPE_CNUM == nextLexeme.getLexemeType()){
     //合并英文数词+中文数词
     appendOk = result.append(nextLexeme, Lexeme.TYPE_CNUM);
    }else if(Lexeme.TYPE_COUNT == nextLexeme.getLexemeType()){
     //合并英文数词+中文量词
     appendOk = result.append(nextLexeme, Lexeme.TYPE_CQUAN);
    }
    if(appendOk){
     //弹出
     this.results.pollFirst(); 
    }
   }
   
   //可能存在第二轮合并
   if(Lexeme.TYPE_CNUM == result.getLexemeType() && !this.results.isEmpty()){
    Lexeme nextLexeme = this.results.peekFirst();
    boolean appendOk = false;
     if(Lexeme.TYPE_COUNT == nextLexeme.getLexemeType()){
      //合并中文数词+中文量词
      appendOk = result.append(nextLexeme, Lexeme.TYPE_CQUAN);
     }  
    if(appendOk){
     //弹出
     this.results.pollFirst();       
    }
   }

  }
 }

这里由 smart 模式触发的 合并英文数词+中文量词 的处理中,把 token 的属性修改成了 TYPE_CQUAN (中文数量词)。

这是 smart 模式下拥有而 max 模式下没有的分词方式和 token 类型。

举个例子:"7天" 这个词的分词结果,结果中分别展示了位置:内容:类型

复制代码
ik_max_word:
0-1 : 7 :  ARABIC
1-2 : 天 :  COUNT

ik_smart
0-2 : 7天 :  TYPE_CQUAN

也就是说 ik_max_word 与 ik_smart 在'英文数词+中文量词'的分词场景下,分词结果必定不一样。

3.2. 切分模式和歧义消除剖析

ik分词器的算法原则还是基于中文字典进行字典树的匹配。

也就是说词元匹配的前提是丰富的中文字典库(ik 已经默认加载了几十万的字典库了)。

我们先来看 ik_max_word 的切分模式:执行文本的最细粒度分割,将分段详尽地生成各种可能的组合。

来看下"中华人民共和国国歌"的例子,这里为了更加直观的体现字典树的匹配模式,我们把字典库的内容也列出来。

复制代码
文本:中华人民共和国国歌

字典库:中华人民共和国国歌,中华人民,中华,华人,人民共和国,人民,共和国,共和,国国,国歌

ik_max_word 分词结果:
0-9 : 中华人民共和国国歌 :  CN_WORD
0-4 : 中华人民 :  CN_WORD
0-2 : 中华 :  CN_WORD
1-3 : 华人 :  CN_WORD
2-7 : 人民共和国 :  CN_WORD
2-4 : 人民 :  CN_WORD
4-7 : 共和国 :  CN_WORD
4-6 : 共和 :  CN_WORD
6-8 : 国国 :  CN_WORD
7-9 : 国歌 :  CN_WORD

可以看出 ik_max_word 分词器把所有的字典结果都匹配出来了,同时也看到了好几个词元的位置是有重叠的,比如:"中华人民""中华""华人"这几个词元,位置在0-4这段有着不同的重叠。

这也就是造成了代码中所需要处理的"歧义",我们这里可以把"歧义"理解为多个词元组合去代表一段内容。

而 ik_smart 分词器主要作用就是通过对词元组合进行歧义裁决 来消除词元间的歧义,消除歧义后的直观体现就是不再会有位置重叠的词元(这也是 ik_smart 更适合 match_phrase 查询的原因)。

ik_smart 遵循歧义裁决的主要原则顺序如下:

  1. 比较有效文本长度,越长越好;

  2. 比较词元个数,越少越好;

  3. 路径跨度越大越好;

  4. 根据统计学结论,逆向切分概率高于正向切分,因此位置越靠后的优先;

  5. 词元位置权重比较,词长越平均越好。

同样的文本内容,同样的字典库,ik_smart 的分词结果如下:

复制代码
ik_smart 分词结果:
0-9 : 中华人民共和国国歌 :  CN_WORD

由于字典库中"中华人民共和国国歌"可以覆盖整个文本,并满足上诉大多数条件,ik_smart 就只保留了第一个词元。

为了更直观的感受,我们把"中华人民共和国国歌"从词库中去除。

复制代码
字典库:中华人民,中华,华人,人民共和国,人民,共和国,共和,国国,国歌

ik_smart 分词结果:
0-4 : 中华人民 :  CN_WORD
4-7 : 共和国 :  CN_WORD
7-9 : 国歌 :  CN_WORD

对于 ik_smart 歧义裁决原理有兴趣的同学可以看源码中 LexemePath 类的 compareTo 方法。

相关推荐
yangmf204016 小时前
私有知识库 Coco AI 实战(一):Linux 平台部署
大数据·linux·运维·人工智能·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客16 小时前
Elasticsearch:理解政府中的人工智能 - 应用、使用案例和实施
大数据·人工智能·elasticsearch·机器学习·搜索引擎·ai·全文检索
Elastic 中国社区官方博客1 天前
Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
大数据·人工智能·elasticsearch·搜索引擎·pdf·全文检索·azure
光仔December2 天前
【Elasticsearch入门到落地】10、初始化RestClient
elasticsearch·搜索引擎·全文检索·ik分词器·restclient
梦想画家4 天前
SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索
全文检索·sqlalchemy
码农爱java5 天前
Elasticsearch 之 ElasticsearchRestTemplate 普通查询
大数据·elasticsearch·全文检索·jenkins·springboot·es·es 查询
李昊哲小课7 天前
垃圾短信分类
人工智能·python·机器学习·自然语言处理·分类·数据挖掘·中文分词
Elastic 中国社区官方博客7 天前
Elasticsearch:构建 AI 驱动的搜索体验
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
梦想画家8 天前
SQLAlchemy系列教程:全文检索实战指南
全文检索·sqlalchemy
Elastic 中国社区官方博客9 天前
Elasticsearch:可配置的推理 API 端点分块设置
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索