iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >ElasticSearch怎么用ik进行中文分词
  • 399
分享到

ElasticSearch怎么用ik进行中文分词

2024-04-02 19:04:59 399人浏览 八月长安
摘要

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

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

全文搜索和精确匹配

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

  • keyWord 类型,存储时不会做分词处理,支持精确查询和分词匹配查询;

  • text 类型,存储时会进行分词处理,也支持精确查询和分词匹配查询。

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

ElasticSearch怎么用ik进行中文分词

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

ElasticSearch怎么用ik进行中文分词

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

  • term 查询,也就是精确查询,不进行分词,而是直接根据输入词进行查询;

  • match 查询,也就是分词匹配查询,先对输入词进行分词,然后逐个对分词后的词元进行查询。

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

ElasticSearch怎么用ik进行中文分词

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

Analyzer 处理过程

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

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

  • 使用字符过滤器(Character filters),对原始的文本进行一些处理,例如去掉空白字符等;

  • 使用分词器(Tokenizer),对原始的文本进行分词处理,得到一些词元(tokens);

  • 使用词元过滤器(Token  filters),对上一步得到的词元继续进行处理,例如改变词元(小写化),删除词元(删除量词)或增加词元(增加同义词),合并同义词等。

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 分析器的功能大致如下:

  • 字符过滤器是 html_strip,会去掉 HTML 标记相关的字符;

  • 分词器是 ElasticSearch 默认的标准分词器 standard;

  • 词元过滤器是小写化 lowercase 处理器,将英语单词小写化。

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

ik 分词原理

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

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

  • main.dic:主词典,包括日常的通用词语,比如程序员和编程等;

  • quantifier.dic:量词词典,包括日常的量词,比如米、公顷和小时等;

  • stopword.dic:停用词,主要指英语的停用词,比如 a、such、that 等。

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

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 相关的抽象类,来提供自身的分词逻辑实现:

  • IKAnalyzer 继承了 Analyzer ,用来提供中文分词的分析器;

  • IKTokenizer 继承了 Tokenizer,用来提供中文分词的分词器,其 incrementToken 是 ElasticSearch 调用 ik  进行分词的入口函数。

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

ElasticSearch怎么用ik进行中文分词

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

  • LetterSegmenter,英文分词器比较简单,就是把连续的英文字符进行分词;

  • CN_QuantifierSegmenter,中文量词分词器,判断当前的字符是否是数词和量词,会把连起来的数词和量词分成一个词;

  • CJKSegmenter,核心分词器,基于前文的字典树进行分词。

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

  • 根据单字去字典树中进行查询,如果单字是词,则生成词元;如果是词前缀,则放入到临时命中列表中;

  • 然后根据单字和之前处理时保存的临时命中列表数据一起去字典树中查询,如果命中,则生成词元。

ElasticSearch怎么用ik进行中文分词

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

  • 首先处理编字;

    • 因为当前 tmpHits 为空,直接进行单字判断;

    • 直接拿 编 字去前文示意图的字典树查询(详见 matchInMainDict 函数),发现能够命中,并且该字不是一个词的结尾,所以将 编  和其在输入词中的位置生成 Hit 对象,存储到 tmpHits 中。

  • 接着处理 码 字;

    • 因为 tmpHits 不为空,所以拿着 编 对应的 Hit 对象和 码字去字典树中查询(详见 matchWithHit 函数), 发现命中了 编码  一词,所以将这个词作为输出词元之一,存入 AnalyzeContext;但是因为 码 已经是叶节点,并没有子节点,表示不是其他词的前缀,所以将对应的 Hit  对象删除掉;

    • 接着拿单字 码 去字典树中查询,看单字是否成词,或者构成词的前缀。

  • 依次类推,将所有字处理完。

三、消除歧义和结果输出

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

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

  • 有效文本长度长优先;

  • 词元个数少优先;

  • 路径跨度大优先;

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

  • 词长越平均优先;

  • 词元位置权重大优先。

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

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

后记

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

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

您可能感兴趣的文档:

--结束END--

本文标题: ElasticSearch怎么用ik进行中文分词

本文链接: https://www.lsjlt.com/news/56252.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ElasticSearch怎么用ik进行中文分词
    本篇内容主要讲解“ElasticSearch怎么用ik进行中文分词”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ElasticSearch怎么用ik进行中文分词...
    99+
    2022-10-18
  • 中文分词入门:使用IK分词器进行文本分词(附Java代码示例)
    1. 介绍 中文分词是将连续的中文文本切分成一个个独立的词语的过程,是中文文本处理的基础。IK分词器是一个高效准确的中文分词工具,采用了"正向最大匹配"算法,并提供了丰富的功能和可定制选项。 2. I...
    99+
    2023-09-14
    中文分词 java python
  • php Laravel 使用elasticsearch+ik中文分词器搭建搜索引擎
    文章目录 开发环境效果展示开发前准备及注意事项部署与安装安装ES到服务器为ES分配新用户并给新用户分配对应权限ES启动与停止修改配置与错误处理错误1错误2 启动ES安装IK分词器现在与你...
    99+
    2023-09-27
    搜索引擎 elasticsearch php linux 中文分词
  • ​ElasticSearch怎么实现分词全文检索
    Elasticsearch是一个基于Lucene的搜索引擎,它提供了强大的全文搜索和分析能力。要实现分词全文检索,你可以按照以下步骤...
    99+
    2023-10-21
    ​ElasticSearch
  • python怎么对文本进行分词
    在Python中,可以使用多种库来对文本进行分词,包括NLTK、jieba、spaCy等。下面分别介绍一下这些库的用法:1. 使用N...
    99+
    2023-08-18
    python
  • Node.js 中怎么对文本内容进行分词
    今天就跟大家聊聊有关Node.js 中怎么对文本内容进行分词,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。nodejieba 的安装和使用十分简单:...
    99+
    2022-10-19
  • python中文分词,使用结巴分词对python进行分词(实例讲解)
    在采集美女站时,需要对关键词进行分词,最终采用的是python的结巴分词方法。 中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词。 其基本实现原理有三点: 1.基于Trie树结构实现高效的词...
    99+
    2022-06-04
    分词 结巴 中文
  • 使用ES对中文文章进行分词,并进行词频统计排序
    前言:首先有这样一个需求,需要统计一篇10000字的文章,需要统计里面哪些词出现的频率比较高,这里面比较重要的是如何对文章中的一段话进行分词,例如“北京是×××的首都”,“北京”,“×××”,“中华”,“华...
    99+
    2022-10-18
  • 怎么在Python中利用Spacy进行分词
    本篇文章给大家分享的是有关怎么在Python中利用Spacy进行分词,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、...
    99+
    2023-06-14
  • Python怎么使用Spacy进行分词
    这篇文章主要介绍“Python怎么使用Spacy进行分词”,在日常操作中,相信很多人在Python怎么使用Spacy进行分词问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么使用Spacy进行分词...
    99+
    2023-06-30
  • PHP 中使用 Elasticsearch 进行用户行为分析与推荐
    概述:随着互联网的不断发展,用户行为分析和个性化推荐已经成为了各大应用领域中不可或缺的一部分。而Elasticsearch作为一个高性能、分布式的全文搜索和分析引擎,正因其强大的搜索能力和灵活的扩展性而被广泛运用于用户行为分析与个性化推荐系...
    99+
    2023-10-21
    PHP elasticsearch 用户行为分析
  • Hive中怎么利用UDF实现文本分词
    Hive中怎么利用UDF实现文本分词,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。UDF 简介Hive作为一个sql查询引擎,自带了一些基本的...
    99+
    2022-10-18
  • 使用java怎么对elasticsearch进行操作
    这期内容当中小编将会给大家带来有关使用java怎么对elasticsearch进行操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java操作es集群步骤1:配置集群对象信息;2:创建客户端;3:查看集...
    99+
    2023-05-30
  • 如何在spark集群环境下使用hanlp进行中文分词
    这篇文章主要介绍“如何在spark集群环境下使用hanlp进行中文分词”,在日常操作中,相信很多人在如何在spark集群环境下使用hanlp进行中文分词问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在sp...
    99+
    2023-06-02
  • Python中怎么使用Jieba进行词频统计与关键词提取
    这篇文章主要介绍“Python中怎么使用Jieba进行词频统计与关键词提取”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中怎么使用Jieba进行词频统计与关键词提取”文章能帮助大家解决问...
    99+
    2023-07-05
  • PHP 中使用 Elasticsearch 进行数据分析与可视化
    引言:随着大数据时代的到来,数据分析和可视化成为了企业决策和数据洞察的重要手段。而 Elasticsearch 作为一种强大的分布式搜索和分析引擎,为开发人员提供了丰富的API接口,使得可以方便地将数据存储到 Elasticsearch 中...
    99+
    2023-10-21
    数据分析 PHP elasticsearch
  • PHP 中使用 Elasticsearch 进行用户画像分析与推荐
    概述:用户画像分析与推荐是一种利用用户的行为数据和个人信息来构建用户标签,进而实现个性化推荐的方法。Elasticsearch 是一个强大的分布式搜索和分析引擎,它提供了丰富的功能和灵活的API,可用于构建用户画像分析与推荐系统。本文将介绍...
    99+
    2023-10-21
    推荐 elasticsearch 用户画像
  • 基于java的中文分词工具ANSJ怎么使用
    这篇文章主要讲解了“基于java的中文分词工具ANSJ怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于java的中文分词工具ANSJ怎么使用”吧!ANSJ这是一个基于n-Gram+...
    99+
    2023-06-19
  • Java中的word分词怎么使用
    本篇内容介绍了“Java中的word分词怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!word分词是一个Java实现的分布式的中文分...
    99+
    2023-06-04
  • C++中怎么利用LeetCode拆分词
    这期内容当中小编将会给大家带来有关C++中怎么利用LeetCode拆分词,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。[LeetCode] 140.Word Break II 拆分词句之二Given a&...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作