分词的目的:把一句话,分解成单字、数量词 、词 (分词算法中称为“词元”)

  1. 初始化词典Trie树结构

  2. 把句子分解成词

  3. 处理歧义与冲突词,删除多余的低权重词元

应用目的: 搜索引擎为一段文字建索引,先是把句子折成词然后按词反向索引 文章段落 (称为倒排序索引)

版本:

<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
</dependency>

测试程序:

public class IKAnalyzerTest {public static void main(String[] args) {String str = "这的的确确是一个不折不扣的大优惠";String word = "告"; // 不成词的单字String words = "的的确确是";// System.out.println(segText(str, false));System.out.println(segText(words, true));// System.out.println(segText(str, true));}private static String segText(String text, boolean useSmart) {StringBuilder result = new StringBuilder();IKSegmenter ik = new IKSegmenter(new StringReader(text), useSmart);try {Lexeme word = null;while ((word = ik.next()) != null) {result.append(word.getLexemeText()).append(" ");}} catch (IOException ex) {throw new RuntimeException(ex);}return result.toString();}
}

测试数据:

句子:

这的的确确是一个不折不扣的大优惠

普通分词:

这 [ 的的确确 的 的确 的 确 确是 ] [一个 一 个] [不折不扣 不折 不扣] 的 大 优惠

合并分词:

这 ( 的 的确 确是 ) 一个 不折不扣 的 大 优惠

[]()符号解释:

[ 这里放的是分词后有冲突歧义的词,词与词之间有重叠 ]

(合并冲突,删除重复后是没有重叠词的)

学习过程的疑问:

  1. [ 的的确确 的 的确 的 确 确是 ]     的的确确 分词输出后,cursor 已经移动到后面,什么情况下需要回过去把 '的' 这个单字也输出?  (Rep:这块是IK分词写的比较好的地方,一次遍历输出所有分词)

  2. 冲突歧义词合并策略? (Rep:这个问题的解答在下一篇文章)

分解 “的的确确是”  的分词过程:

注:下标为自然语义的数字,下面表格为IKAnalyzer分词器依次描述这5个字的处理步骤与解析过程

描述下标

前缀词元列表 tmpHits

下标范围

匹配方式

分词结果 orgLexemes

1

(的)

(0,0)

前缀 & 单字成词 -->

2

的(的)

(0,1)

前缀

(的)

(1,1)

前缀 & 单字成词 -->

3

的的(确)

(0,2)

前缀

的(确)

(1,2)

前缀 & 成词 -->

的确

(确)

(2,2)

前缀

4

的的确(确)

(0,3)

词尾 (结束)-->

的的确确

的确(确)

(1,3)

无法成词(删除)

确(确)

(2,3)

无法成词(删除)

(确)

(3,3)

5

确(是)

(3,3)

词尾 (结束)-->

确是

(是)

前缀 (结束,且无法单字成词)

步骤详述:

状态码: 1 成词,0 词前缀(单字无法成词)

Trie树-局部示例
  1. 第一个字 “的” ,即是单字,也是词前缀,所以输出到原始结果集 AnalyzeContext.orgLexemes中,同时不能作为词前缀加入中文分词器的临时词前缀列表中CJKSegmenter.tmpHits,参与到下一个字的前缀匹配。
  2. 第二个字还是 “的” ,作为单字输出到原始结果集,拼接前面的词前缀 变成 “的的” ,成为新的词前缀参与下一个字的前缀匹配,同时也作为单字前缀加入到前缀列表中。
  3. 第三个“确”字,根据Trie树判断,“确”字无法单字成词,不加入结果集,可以与前面两个词前缀拼接为新的词前缀 “的的确” 和 “的确” ,“的确” 作为单独词加入结果集。
  4. 第四个“确”字,单字作为前缀加入前缀列表,与前缀列表中3个前缀再次拼接匹配,其中“的确确”、“确确” 两字无法成词,从前缀列表中删除,“的的确确”作为完整词加入结果集。
    此时前缀列表是:[ "确" ]
  5. 最后一个字 “是” ,单字作为前缀加入前缀列表,与前缀列表中前缀拼接为 “确是” ,成为词加入结果集。
    此时前缀列表是:[ "是" ] ,但 “的的确确是” 这句子已经遍历完成,所以清空前缀列表。
    最后结果集是:[ "的的确确"、"的"、"的确"、"的"、"确是" ]

最后分词结果通过AnalyzeContext#outputToResult 方法输出到最终结果集:

[ "的的确确"、 "的"、 "的确"、 "的"、 "确"、 "确是" ]  ,其中句子中第3个字 "确" 作为遗漏单字输出。至此,普通分词完成。

【IKAnalyzer中文分词器详解-(1)分词逻辑】相关推荐

  1. 【Lucene】分词器详解,常用的分词器,IKANalyzer

    [Lucene]分词器详解,常用的分词器,IKANalyzer 1. 分词器详解 1.1 分词器的作用 1.2 分词器API 1.2.1 示例 1.2.2 Analyzer 1.2.3 createC ...

  2. ansj中文分词器详解

    ansj中文分词器详解   最近在做一个人工智能的项目,其中用到了分词功能.从网上找了一些java用于分词的工具,最终选择了ansj中文分词器.个人认为效果和功能是比较优秀的.本文将对ansj的所有功 ...

  3. python统计词频瓦尔登湖_自然语言处理之中文分词器-jieba分词器详解及python实战...

    (转https://blog.csdn.net/gzmfxy/article/details/78994396) 中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自 ...

  4. python中文分词器-jieba分词器详解及wordcloud词云生成

    jieba分词 jieba分词支持三种分词模式: 精确模式, 试图将句子最精确地切开,适合文本分析 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义 搜索引擎模式,在精确模 ...

  5. Lucene分词器详解

    一.分词器作用 在创建索引的时候需要用到分词器,在使用字符串搜索的时候也会用到分词器,并且这两个地方要使用同一个分词器,否则可能会搜索不出来结果. 分词器(Analyzer)的作用是把一段文本中的词按 ...

  6. Elasticsearch 分词器详解(热更新词库)

    1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...

  7. ElasticSearch之 ik分词器详解

    IK分词器 本文分为简介.安装.使用三个角度进行讲解. 简介 倒排索引 众所周知,ES是一个及其强大的搜索引擎,那么它为什么搜索效率极高呢,当然和他的存储方式脱离不了关系,ES采取的是倒排索引,就是反 ...

  8. hanlp java_HanLP-实词分词器详解

    在进行文本分类(非情感分类)时,我们经常只保留实词(名.动.形)等词,为了文本分类的分词方便,HanLP专门提供了实词分词器类NotionalTokenizer,同时在分类数据集加载处理时,默认使用了 ...

  9. 英语语法---分词短语详解

    英语语法 Table of Contents 短语-分词短语详解 1. 分词短语的定义 2. 分词短语的分类 2.1 分词短语作定语 2.2 分词短语作状语 2.3 分词短语作补语 2.4 分词短语作 ...

最新文章

  1. 《SQL Server 管理与维护指南》章节目录
  2. ML之XGBoost:XGBoost算法模型(相关配图)的简介(XGBoost并行处理)、关键思路、代码实现(目标函数/评价函数)、安装、使用方法、案例应用之详细攻略
  3. optee3.12.0 qemu_v8的环境搭建篇(ubuntu20.04)
  4. IdentityServer4实战 - JWT Token Issuer 详解
  5. 循环比赛日程表(信息学奥赛一本通-T1325)
  6. 依赖反转原则DIP 与使用了Repository模式的asp.net core项目结构
  7. 统计学习方法第15章-奇异值分解SVD
  8. 开源中国开源世界高峰论坛如期将至
  9. VS2010使用c++、gSOAP调用WebService 图文教程
  10. 什么是EJB?EJB到底是什么?
  11. 静态市盈率和动态市盈率
  12. 这些屏幕特效是咋实现的
  13. html 倒计时毫秒,实现毫秒级倒计时
  14. Juniper防火墙丢失ScreenOS重新安装ScreenOS
  15. linux表示一序列ip,linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
  16. 计算机启动修复怎么还原,电脑开机出现系统恢复选项该怎么办
  17. 据说这些用来问一两年工作经验的人(吓死宝宝了)
  18. mysql异地多活方案_数据库异地多活解决方案
  19. CWRU(凯斯西储大学) 轴承数据集简介
  20. arm-linux-g++: command not found,解决Linux “g++: Command not found”报错问题 | 老左笔记

热门文章

  1. PAT 乙级 1033 旧键盘打字 python
  2. C语言 输入一个正整数,判断它是素数还是合数
  3. 日志打印利器logback的使用和配置
  4. Spring基本使用
  5. android 耳机检测,android 检测耳机是否插入方法
  6. 一款黑苹果系统引导工具,系统来解Clover带来的限制和问题
  7. Gbit以太交换BCM56504
  8. python爬虫--scrapy框架的学习和使用(七)⭐---第二部分
  9. oracle rfs进程过多,oracle 11.2 DataGuard少了日志应用进程RFS
  10. KubeVela解读