vlambda博客
学习文章列表

ELK中文分词并创建可视化词云

Elasticsearch提供了分词功能,能对文本进行分词并进行聚合查询。今天就利用Elasticsearch的IK中文分词插件对几篇文章进行关键词分析,并使用Kibana生成词云。




1.Elasticsearch安装IK分词器



进入Elasticsearch目录输入命令行安装IK分词器

.\elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip




安装完成后重启elasticsearch,并查看插件是否安装成功


.\elasticsearch-plugin list



ELK中文分词并创建可视化词云


analysis-ik即为安装成功的插件。


2.创建index索引及mapping映射



2.1创建index

启动Kibana,打开开发工具界面,输入命令创建index,命名为news


PUT news



2.2创建mapping

为字段content配置分词器,其中analyzer是导入数据时用的分词器,search_analyzer是查询时用的分词器,同时启用fielddata进行分词后的词频统计。


注意:fielddata启用会对堆内存占用较大,谨慎使用,推荐使用term_vector方式进行词频计算


PUT news/_mapping{ "properties": { "content": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "ik_smart", "fielddata":"true", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } }}



2.3导入数据

在学习强国上随便找了几篇文档作为数据来源并进行导入。


PUT news/_doc/1{ "title":"科学家们可以使用个人电脑几分钟内组装整个基因组", "author":"cnbeta.com", "date":"2021-09-15", "content":"麻省理工学院(MIT)和法国巴斯德研究所的科学家们已经开发出一种在个人电脑上重建全基因组的技术,包括人类基因组。这项技术比目前最先进的方法快约100倍,并使用五分之一的资源。"}
PUT news/_doc/2{ "title":"研究发现气候变化可能会突然影响全球海洋中的藻类", "author":"cnbeta.com", "date":"2021-09-16", "content":"根据东安格利亚大学和厄尔尼诺研究所的研究,由于海洋中生物多样性断点边界的变化,全球变暖可能会导致重要的藻类群落发生突然的变化。今天发表在《自然通讯》杂志上的一项新研究发现,随着气候变化使暖半球延伸,这些界限预计将在未来100年内向极地转移。"}
PUT news/_doc/3{ "title":"研究发现制造业的计算机数据面临过度曝光的风险", "author":"cnbeta.com", "date":"2021-09-16", "content":"数据安全公司Varonis根据对制造业50个组织的40亿个文件的分析发布了一项研究,发现该行业存在着数据过度暴露的巨大问题。每个员工在工作的第一天平均可以访问600万个文件,每10个组织中就有4个向每个员工开放1000多个敏感文件。"}
PUT news/_doc/4{ "title":"研究人员利用电场创造出形状奇特的液体", "author":"cnbeta.com", "date":"2021-09-15", "content":"我们都见过水滴,知道无论水滴是由什么液体制成的,它们都倾向于采取相同的基本形状。芬兰阿尔托大学的研究人员希望破坏所谓的热力学平衡,以探索会发生什么,并确定他们是否能够控制平衡被破坏时发生的情况。该技术创造出的液滴被制成方形和具有直边的六边形,两者几乎都是不可能自然产生的。在自然界中,液滴和气泡通常形成球体。研究人员还成功地迫使两种不同的液体创造出一个相互连接的格子。格子在自然界的固体材料中很常见,但在液体的世界中却没有见到过。项目研究人员创造的最复杂的形状之一是一个环形,这是一个甜甜圈形状。只要电场施加在液体上,这种不常见的形状就稳定。在自然界中,液体自然塌陷,以填补其中心的孔洞。实验中发现的关键是,由于界面上电荷的运动,这些形状是可持续的,防止它们坍塌到平衡状态。"}



3.使用聚合查询统计词频并创建可视化图云

3.1使用聚合查询统计词频

查询命令为


GET news/_search{ "size": 0,  "aggs": { "messages": { "terms": { "field": "content",        "size"10 } } }}



查询结果示例为


{ "took" : 503, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "messages" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 209, "buckets" : [ { "key" : "上", "doc_count" : 3 }, { "key" : "中", "doc_count" : 3 }, { "key" : "和", "doc_count" : 3 }, { "key" : "一项", "doc_count" : 2 }, { "key" : "发现", "doc_count" : 2 }, { "key" : "发生", "doc_count" : 2 }, { "key" : "大学", "doc_count" : 2 }, { "key" : "技术", "doc_count" : 2 }, { "key" : "最", "doc_count" : 2 }, { "key" : "根据", "doc_count" : 2 } ] } }}




3.2创建可视化词云

打开kibana,选择可视化库Visualize,点击按钮“创建可视化”,选择“基于聚合”


ELK中文分词并创建可视化词云



选择“标签云图”


ELK中文分词并创建可视化词云




选择索引record,添加存储桶,设置聚合类型为“词”,字段为“content”,刷新后可以看到生成的词云


ELK中文分词并创建可视化词云




附1.ik_max_word 和 ik_smart的区别 


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

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


附2.添加自定义词典

使用分词器进行词频统计时会发现有一些不必要的分词或者不满足要求的分词,比如一些语气词、介词等(与、和、的、从、而),以及一些专有名词(公众版APP、数据采集)。可以添加自定义词典定义专有名词并去除一些不必要的分词。


IK插件安装后会自动在elasticsearch的config目录下生成文件夹analysis-ik,包含了IK的字典模板和字典配置文件。



修改配置文件IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict">my_main.dic</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">my_stopword.dic</entry> <!--用户可以在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --></properties>



其中my_main.dic为自己的扩展字典,my_stopword.dic为自己的扩展停止字典。字典格式如下:


注意:IK分词器插件安装后或自定义词典修改后都需要重启ES使其生效




新技能GET,又学到了。