文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ElasticSearch怎么用ik进行中文分词

2024-04-02 19:55

关注

本篇内容主要讲解“ElasticSearch怎么用ik进行中文分词”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ElasticSearch怎么用ik进行中文分词”吧!

全文搜索和精确匹配

ElasticSearch 支持对文本类型数据进行全文搜索和精确搜索,但是必须提前为其设置对应的类型:

比如,创建名为 article 的索引(Index),并为其两个字段(Filed)配置映射(Mapping),文章内容设置为 text  类型,而文章标题设置为 keyword 类型。

ElasticSearch怎么用ik进行中文分词

Elasticsearch  在进行存储时,会对文章内容字段进行分词,获取并保存分词后的词元(tokens);对文章标题则是不进行分词处理,直接保存原值。

ElasticSearch怎么用ik进行中文分词

上图的右半边展示了 keyword 和 text 两种类型的不同存储处理过程。而左半边则展示了 ElasticSearch 相对应的两种查询方式:

举个例子,有两篇文章,一篇的标题和内容都是“程序员”,另外一篇的标题和内容都是“程序”,那么二者在 ElasticSearch  中的倒排索引存储如下所示(假设使用特殊分词器)。

ElasticSearch怎么用ik进行中文分词

这时,分别使用 term 和 match 查询对两个字段进行查询,就会得出如图右侧的结果。

Analyzer 处理过程

可见,keyword 与 text 类型, term 与 match 查询方式之间不同就在于是否进行了分词。在 ElasticSearch  中将这个分词的过程统称了 Text analysis,也就是将字段从非结构化字符串(text)转化为结构化字符串(keyword)的过程。

Text analysis 不仅仅只进行分词操作,而是包含如下流程:

ElasticSearch怎么用ik进行中文分词

ElasticSearch 中处理 Text analysis 的组件被称为 Analyzer。相应地,Analyzer  也由三部分组成,character filters、tokenizers 和 token filters。

Elasticsearch 内置了 3 种字符过滤器、10 种分词器和 31  种词元过滤器。此外,还可以通过插件机制获取第三方实现的相应组件。开发者可以按照自身需求定制 Analyzer 的组成部分。

"analyzer": {     "my_analyzer": {         "type":           "custom",         "char_filter":  [ "html_strip"],         "tokenizer":      "standard",         "filter":       [ "lowercase",]     } }

按照上述配置,my_analyzer 分析器的功能大致如下:

一般来说,Analyzer 中最为重要的就是分词器,分词结果的好坏会直接影响到搜索的准确度和满意度。ElasticSearch  默认的分词器并不是处理中文分词的最优选择,目前业界主要使用 ik 进行中文分词。

ik 分词原理

ik 是目前较为主流的 ElasticSearch  开源中文分词组件,它内置了基础的中文词库和分词算法帮忙开发者快速构建中文分词和搜索功能,它还提供了扩展词库字典和远程字典等功能,方便开发者扩充网络新词或流行语。

ik 提供了三种内置词典,分别是:

此外,开发者可以通过配置扩展词库字典和远程字典对上述词典进行扩展。

ElasticSearch怎么用ik进行中文分词

ik 跟随 ElasticSearch 启动时,会将默认词典和扩展词典读取并加载到内存,并使用字典树 tire tree  (也叫前缀树)数据结构进行存储,方便后续分词时使用。

ElasticSearch怎么用ik进行中文分词

字典树的典型结构如上图所示,每个节点是一个字,从根节点到叶节点,路径上经过的字符连接起来,为该节点对应的词。所以上图中的词包括:程序员、程门立雪、编织、编码和工作。

一、加载字典

ik 的 Dictionary 单例对象会在初始化时,调用对应的 load 函数读取字典文件,构造三个由 DictSegment 组成的字典树,分别是  MainDict、QuantifierDict 和 StopWords。我们下面就来看一下其主词典的加载和构造过程。loadMainDict  函数较为简单,它会首先创建一个 DictSegment 对象作为字典树的根节点,然后分别去加载默认主字典,扩展主字典和远程主字典来填充字典树。

ElasticSearch怎么用ik进行中文分词

复制代码

在 loadDictFile 函数执行过程中,会从词典文件读取一行一行的词,交给 DictSegment 的fillSegment 函数处理。

fillSegment 是构建字典树的核心函数,具体实现如下所示,处理逻辑大致有如下几个步骤:

一、按照索引,获取词中的一个字;

二、检查当前节点的子节点中是否有该字,如果没有,则将其加入到 charMap中;

三、调用 lookforSegment 函数在字典树中寻找代表该字的节点,如果没有则插入一个新的;

四、递归调用 fillSegment 函数处理下一个字。

ElasticSearch怎么用ik进行中文分词

ik 初始化过程大致如此,再进一步详细的逻辑大家可以直接去看源码,中间都是中文注释,相对来说较为容易阅读。

二、分词逻辑

ik 中实现了 ElasticSearch 相关的抽象类,来提供自身的分词逻辑实现:

incrementToken 函数会调用 IKSegmenter 的 next方法,来获取分词结果,它是 ik 分词的核心方法。

ElasticSearch怎么用ik进行中文分词

如上图所示,IKSegmenter 中有三个分词器,在进行分词时会遍历词中的所有字,然后将单字按照顺序,让三个分词器进行处理:

我们只讲解一下 CJKSegmenter 的实现,其 analyze 函数大致分为两个逻辑:

ElasticSearch怎么用ik进行中文分词

具体的代码逻辑,如上所示。为了方便大家理解,举个例子,比如输入的词是 编码工作:

三、消除歧义和结果输出

通过上述步骤,有时候会生成很多分词结果集合,比如说,程序员爱编程 会被分成 程序员、程序、员、爱 和 编程 五个结果。这也是 ik 的  ik_max_word 模式的输出结果。但是有些场景,开发者希望只有 程序员、爱 和 编程 三个分词结果,这时就需要使用 ik 的 ik_smart  模式,也就是进行消除歧义处理。

ik 使用 IKArbitrator  进行消除歧义处理,主要使用组合遍历的方式进行处理。从上一阶段的分词结果中取出不相交的分词集合,所谓相交,就是其在文本中出现的位置是否重合。比如 程序员、程序 和  员 三个分词结果是相交的,但是 爱 和 编程 是不相交的。所以分歧处理时会将 程序员、程序 和 员 作为一个集合,爱 作为一个集合,编码  作为一个集合,分别进行处理,将集合中按照规则优先级最高的分词结果集选出来,具体规则如下所示:

根据上述规则,在第一个集合中,程序员 明显要比 程序 和 员 要更符合规则,所以消除歧义的结果就是输出 程序员,而不是 程序 和 员。

最后,对于输入字来说,有些位置可能并不在输出结果中,所以会以单字的方式作为词元直接输出(详见AnalyzeContext 的 outputToResult  函数)。比如 程序员是职业,是 字是不会被分词出来的,但是在最终输出结果时,要将其作为单字输出。

后记

ElasticSearch 和 ik  组合是目前较为主流的中文搜索技术方案,理解其搜索和分词的基础流程和原理,有利于开发者更快地构建中文搜索功能,或基于自身需求,特殊定制搜索分词策略。

到此,相信大家对“ElasticSearch怎么用ik进行中文分词”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯