IK分词器实战

简介: 本文介绍了IK分词器的构成及使用方式

ES中分词器Analyzer的组成

分词器是专门处理分词的组件,由三部分组成。

  • Character filter:针对原始文本处理,例如去除html
  • Tokenizer:按照规则切分为单词
  • Token Filter:将切分的单词进行加工,小写,删除stopwords,增加同义词

以上三部分是串行处理的关系,除Tokenizer只能一个外,其他两个都可以多个。IK分词器仅实现了Tokenizer

IK分词器原理

IK分词器在是一款基于词典和规则的中文分词器。具有以下特性:

  1. 采用了特有的“正向迭代最细粒度切分算法“
  2. 支持细粒度和智能分词两种切分模式
  3. 智能分词模式支持简单的分词排歧义处理和数量词合并输出
  4. 采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

IK内部有3个子分词器(Segmenter),CJKSegmenter(中日韩文分词器),CN_QuantifierSegmenter(中文数量词分词器),LetterSegmenter(英文分词器)。

LetterSegmenter:从遇到第一个英文字符往后,直到碰到第一个非英文字符,这中间的所有字符则切分为一个英文单词。

CN_QuantifierSegmenter:从遇到每一个中文数量词,然后检查该数量词后一个字符是否为中文量词(根据是否包含在中文量词词典中为判断依据),如是,则分成一个词,如否,则不是一个词。

CJKSegmenter:处理逻辑较为复杂,整体思路是从字典树中寻找匹配的词

分词裁决器IKArbitrator:只有在Smart模式才会生效,仅根据几条可能是最佳的分词实践规则,并没有用到任何概率模型,也不具有新词发现的功能。

两种分词模式

智能模式

对应es的IK插件的ik_smart,会做最粗粒度的拆分。比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

细粒度模式

对用es的插件ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。

IK分词实践

IK分词的效果主要取决于词库,目前自带主词典拥有27万左右的汉语单词量。对于应用领域的不同,需要各类专业词库的支持。

分词规律

es检索的核心数据结构为倒排索引,分词是否合理正确,直接影响数据的检索结果,在自定义词典及分词器时,可以采取以下方式来验证分词的结果:

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": ["甲三"]
}

ik_max_word

  1. 当查询词在词典中不存在时,会按字拆分

例如:在北-->在,北

  1. 当查询词在词典中存在,且长度为两个字时,有时拆分有时不拆分

例如:甲乙-->甲乙
联通-->联通,联,通

  1. 当查询词在词典中存在,且查询词的一部分也在词典在中存在,则分别拆分

例如:甲乙丙丁-->甲乙丙丁,甲乙,丙丁
中国联通-->中国联通,中国,国联,联通,通(没弄明白为啥这里联通不拆成联、通)

  1. 当查询词任意部分都不在词典中存储,则按字拆分

ik_smart

  1. 当查询词在词典中不存在时,会按字拆分

例如:在北-->在,北

  1. 当查询词在词典中存在,不做拆分

例如:甲乙-->甲乙
甲乙丙丁-->甲乙丙丁

  1. 当查询词任意部分都不在词典中存储,则按字拆分

依据上述规律,我们可以在写入数据时使用ik_max_word,增加分词数量,提高被命中几率,在查询数据时使用ik_smart,减少分词数量,提升结果准确率,减少无关结果

去掉分词结果中的单个字

使用es内置的token filter:length

POST _analyze
{
  "text": "一中华人民共和国国歌",
  "filter": [
    {
      "type": "length",
      "min": "2"
    }
  ],
  "tokenizer": "ik_smart"
}

分词结果中“一”被过滤掉,但对于某些查询词,例如“父与子”,该设置会导致无分词结果

相关文章
|
自然语言处理 算法 搜索推荐
ES-IK分词器的概念和基本使用
ES-IK分词器的概念和基本使用
594 2
LaTeX中的多行数学公式
LaTeX中的多行数学公式
3096 0
LaTeX中的多行数学公式
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
视觉感知RAG×多模态推理×强化学习=VRAG-RL
通义实验室自然语言智能团队发布并开源了VRAG-RL,一种视觉感知驱动的多模态RAG推理框架。它能像人一样“边看边想”,通过粗到细的视觉仿生感知机制,逐步聚焦关键区域,精准提取信息。VRAG-RL结合强化学习与多专家采样策略,优化检索与推理路径,在多个视觉语言基准数据集上表现出色,显著提升准确性和效率。项目已发布技术方案并开源代码,支持快速部署和二次开发。
384 11
|
机器学习/深度学习 自然语言处理 算法
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
474 0
|
10月前
|
前端开发 安全 开发工具
CMS系统是什么?CMS用来做什么的?
CMS是网站开发工具,包括前端模版和后端后台。支持私有化部署,包含页面管理、会员管理、标签管理等。用户无需建站基础和专业知识,即可快速建设和管理网站。大型企业网站、新闻网站等多采用CMS。
588 8
|
11月前
|
SQL 存储 Apache
Apache Doris 3.0.3 版本正式发布
亲爱的社区小伙伴们,Apache Doris 3.0.3 版本已于 2024 年 12 月 02 日正式发布。该版本进一步提升了系统的性能及稳定性,欢迎大家下载体验。
446 16
|
存储 算法 安全
|
自然语言处理 达摩院 索引
Elasticsearch 中文分词器
在使用Elasticsearch 进行搜索中文时,Elasticsearch 内置的分词器会将所有的汉字切分为单个字,对用国内习惯的一些形容词、常见名字等则无法优雅的处理,此时就需要用到一些开源的分词器,以下分别介绍几种常见的中文分词器
10422 2
Elasticsearch 中文分词器
|
安全 API 数据安全/隐私保护
关于API安全设计5A原则
【6月更文挑战第1天】5A原则包括身份认证、授权、访问控制、可审计性和资产保护,是安全设计的核心要素。
|
缓存 Java 程序员
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码
本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可。
函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码