Java 代码实现——使用 IK 分词器进行词频统计

r660926
发布于 2022-4-20 11:21
浏览
0收藏

本文主要介绍如何通过 IK 分词器进行词频统计。

 

使用分词器对文章的词频进行统计,主要目的是实现如下图所示的词云功能,可以找到文章内的重点词汇。

 

后续也可以对词进行词性标注,实体识别以及对实体的情感分析等功能。

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区词频统计服务具体模块如下:

 

 •  数据输入:文本信息
 •  数据输出:词 - 词频(TF-IDF等) - 词性等内容
 •  使用的组件:分词器、语料库、词云展示组件等
 •  功能点:白名单,黑名单,同义词等


现存的中文分词器有 IK、HanLP、jieba 和 NLPIR 等几种,不同分词器各有特点,本文使用 IK 实现,因为 ES 一般使用 medcl 等大佬封装的 IK 分词器插件作为中文分词器。

 

由于 ES 的 IK 分词器插件深度结合了 ES,仅对文本分词使用不到 ES 的内容,所以文本采用申艳超大佬版本的 IK。

 

IK 地址:https://github.com/blueshen/ik-analyzer

 

1. IK 分词统计代码


IK 的代码相对比较简单,东西不多,将 String 拆分为词并统计代码如下:

 

1.单纯统计词频:
Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区2.统计词频和文档频率:

 

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区2. 获取词云 TopN 个词


获取 TopN 个词用于词云展示有多种排序方式,可以直接根据词频、文档频率或者 TF-IDF 等算法进行排序,本文仅根据词频求取 TopN。M 个数字获取 TopN 有以下算法:

 

 •  M 小 N 小:快速选择算法
 •  M 大 N 小:小顶堆
 •  M 大 N 大:归并排序


本文采用小顶堆方式实现,对应JAVA中的优先队列数据结构 PriorityQueue:

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

3. IK 代码浅析


核心主类为IKSegmenter,需要关注的点有dic包也就是词典相关内容以及字符处理工具类CharacterUtilidentifyCharType()方法,目录结构如下:

 IK 代码结构

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区IK 代码结构


IKSegmenter类结构如下图,其中 init() 为私有方法,初始化加载词典采用非懒加载模式,在第一次初始化IKSegmenter实例时会调用并加载词典,代码位于结构图下方。

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

 IKSegmenter 类结构

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

词典私有构造方法Dictionary()内会加载 IK 自带的词典以及扩展词典,我们也可以把自己线上不变的词典放到这里这样IKAnalyzer.cfg.xml中就只需要配置经常变更词典即可。

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

IKSegmenter类调用next()方法获取下一个词元时,会调用CharacterUtil类中的identifyCharType()方法识别字符种类,这里我们也可以自定义一些字符种类针对处理新兴的网络语言,如@、##等内容:

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

 

由于 IK 内容不多,建议大家可以从头捋一遍,包括各个实现ISegmenter接口的各个自分词器等内容。

 

4. 进行词云展示


词云展示可以使用 Kibana 自带的词云 Dashboard,或者比较热门的 WordCloud。自己测试可以使用线上的微词云快速便捷查看词云效果:导入两列的 XLS 文件即可,左侧控制栏也可以对形状字体等进行配置美化。

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区
展示效果如下图所示:

Java 代码实现——使用 IK 分词器进行词频统计-鸿蒙开发者社区

 微词云效果图


5. 总结


本文主要通过 IK 分词器实现了词频统计功能,用于词云的展示,不仅仅适用于 ES,任何数据源文档都可以进行词频统计。

 

但是功能比较基础,感兴趣的同学可以实现一下词排序方式变更(tf/idf)、词性标注、实体识别和情感分析等功能;IK 分词器较为局限,需要使用 HanLP(自带词性标注)等更高级的分词器以及 NLP 相关知识来辅助,也可以参考百度 AI 的词法分析模块。

 

作者:caster(Elastic 认证工程师)

 

作者博客:https://www.jianshu.com/u/cc7ee7454afc

 

审核:铭毅天下

 

说明
 

上个月,死磕 Elasticsearch 知识星球搞了:“群智涌现”杯输出倒逼输入——Elastic干货输出活动。

 

后续会不定期逐步推出系列文章,目的:以文会友,“输出倒逼输入”。

 

分类
收藏
回复
举报
回复
    相关推荐