使用python制作词云(重点对jieba库和wordcloud库进行介绍)

在海量数据中提取有效的信息,词云不愧是一种有效解决此类问题的方法,他可以突出显示关键词,快速提取有价值的信息。
Python制作词云很简单,要求不高的话,几行代码就可以搞定,主要使用的库有jieba(结巴,一种分割汉语的分词库)和wordcloud库。

一、jieba简介

jieba 是目前最好的 Python 中文分词组件,它主要有以下 3 种特性:

支持 3 种分词模式:精确模式、全模式、搜索引擎模式

用法

#全模式
seg_list = jieba.cut("今天真是个好天气。他来到了西安交通大学。", cut_all=True)
#精确模式
seg_list1 = jieba.cut("今天真是个好天气。他来到了西安交通大学。", cut_all=False)
#搜索引擎模式
seg_list2 = jieba.cut_for_search("今天真是个好天气。他来到了西安交通大学")
print("【全模式】:" + "/ ".join(seg_list))
print("【精确模式】:" + "/ ".join(seg_list1))
print("【搜索引擎模式】:" + "/ ".join(seg_list2))
"""
【全模式】:今天/ 天真/ 真是/ 个/ 好/ 天气/ 。/ 他/ 来到/ 了/ 西安/ 西安交通/ 西安交通大学/ 交通/ 大学/ 。
【精确模式】:今天/ 真是/ 个/ 好/ 天气/ 。/ 他/ 来到/ 了/ 西安交通大学/ 。
【搜索引擎模式】:今天/ 真是/ 个/ 好/ 天气/ 。/ 他/ 来到/ 了/ 西安/ 交通/ 大学/ 西安交通大学
"""

从结果上看,全模式是将所有词语分割出来,但会分割出我们不需要的词语,比如上面例子中的天真就是我们不希望出现的。如果我们做词云,常使用精确模式。搜索引擎常使用搜索引擎模式,将句子切割成关键词。

返回值

jieba.cut 返回值
jieba.lcut 返回值
但切割的词是一致的

seg_list = jieba.cut("今天真是个好天气。他来到了西安交通大学。", cut_all=True)
print(type(seg_list))
print("【全模式】:" + "/ ".join(seg_list))
seg_list = jieba.lcut("今天真是个好天气。他来到了西安交通大学。", cut_all=True)
print(type(seg_list))
print(seg_list)
"""output:

【全模式】:今天/ 天真/ 真是/ 个/ 好/ 天气/ 。/ 他/ 来到/ 了/ 西安/ 西安交通/ 西安交通大学/ 交通/ 大学/ 。


['今天', '天真', '真是', '个', '好', '天气', '。', '他', '来到', '了', '西安', '西安交通', '西安交通大学', '交通', '大学', '。']

"""

支持繁体分词
支持自定义词典
可使用 jieba.cut 和 jieba.cut_for_search 方法进行分词,两者所返回的结构都是一个可迭代的 generator,可使用 for 循环来获得分词后得到的每一个词语(unicode),或者直接使用 jieba.lcut 以及 jieba.lcut_for_search 直接返回 list。

参数

jieba.cut 和 jieba.lcut 接受 3 个参数:
需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
cut_all 参数:是否使用全模式,默认值为 False
HMM 参数:用来控制是否使用 HMM 模型,默认值为 True
jieba.cut_for_search 和 jieba.lcut_for_search 接受 2 个参数:
需要分词的字符串(unicode 或 UTF-8 字符串、GBK 字符串)
HMM 参数:用来控制是否使用 HMM 模型,默认值为 True

HMM 模型

HMM 模型,即隐马尔可夫模型(Hidden Markov Model, HMM),是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。在 jieba 中,对于未登录到词库的词,使用了基于汉字成词能力的 HMM 模型和 Viterbi 算法,其大致原理是:

采用四个隐含状态,分别表示为单字成词,词组的开头,词组的中间,词组的结尾。通过标注好的分词训练集,可以得到 HMM 的各个参数,然后使用 Viterbi 算法来解释测试集,得到分词结果。

调整词典

seg_list = jieba.cut("我叫刘赵语", cut_all=False)
print("【精确模式】:" + "/ ".join(seg_list))
jieba.add_word('刘赵语')
seg_list = jieba.cut("我叫刘赵语", cut_all=False)
print("【添加后的精确模式】:" + "/ ".join(seg_list))
""""
【精确模式】:我/ 叫/ 刘/ 赵语
Loading model cost 1.102 seconds.
【添加后的精确模式】:我/ 叫/ 刘赵语
"""

关键词提取

jieba 提供了两种关键词提取方法,分别基于 TF-IDF 算法和 TextRank 算法。

1.基于 TF-IDF 算法的关键词提取
  TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的一份文件的重要程度,其原理可概括为:

一个词语在一篇文章中出现次数越多,同时在所有文档中出现次数越少,越能够代表该文章
如果还不明白,(请看这篇文章
),你一定会有所收获

计算公式:TF-IDF = TF * IDF,其中:

TF(term frequency, TF):词频,某一个给定的词语在该文件中出现的次数。

IDF(inverse document frequency, IDF):逆文件频率,如果包含词条的文件越少,则说明词条具有很好的类别区分能力。

通过 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法进行关键词提取,该方法共有 4 个参数:

sentence:为待提取的文本
topK:为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight:是否一并返回关键词权重值,默认值为 False
allowPOS:仅包括指定词性的词,默认值为空

import jieba
import jieba.analyse
s='新时代党的建设总要求是:坚持和加强党的全面领导,坚持党要管党、全面从严治党,以加强党的长期执政能力建设、先进性和纯洁性建设为主线,以党的政治建设为统领,以坚定理想信念宗旨为根基,以调动全党积极性、主动性、创造性为着力点,全面推进党的政治建设、思想建设、组织建设、作风建设、纪律建设,把制度建设贯穿其中,深入推进反腐败斗争,不断提高党的建设质量,把党建设成为始终走在时代前列、人民衷心拥护、勇于自我革命、经得起各种风浪考验、朝气蓬勃的马克思主义执政党'
for x, w in jieba.analyse.extract_tags(s, topK=20, withWeight=True):
    print('%s %s' % (x, w))
"""****************output:*************
建设 0.6379845884389611
党的建设 0.24997432553142854
全面 0.2191179945409091
党要 0.1552567208168831
管党 0.1552567208168831
从严治党 0.1552567208168831
以党 0.1552567208168831
理想信念 0.1552567208168831
坚持 0.15102792509896104
推进 0.14902094377974026
时代 0.14302156598857144
朝气蓬勃 0.14299098563766233
纯洁性 0.14162266725194805
加强 0.13917926442051948
先进性 0.13872469905324675
政治 0.1333985308477922
经得起 0.12572947982857144
反腐败 0.12428499106090908
衷心 0.12361884438051948
勇于 0.1231407408335065   
"""

2.基于 TextRank 算法的关键词提取
  TextRank 是另一种关键词提取算法,基于大名鼎鼎的 PageRank,其原理可参见论文—— TextRank: Bringing Order into Texts 。

通过 jieba.analyse.textrank 方法可以使用基于 TextRank 算法的关键词提取,其与 ‘jieba.analyse.extract_tags’ 有一样的参数,但前者默认过滤词性(allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))。

import jieba
import jieba.analyse
s='新时代党的建设总要求是:坚持和加强党的全面领导,坚持党要管党、全面从严治党,以加强党的长期执政能力建设、先进性和纯洁性建设为主线,以党的政治建设为统领,以坚定理想信念宗旨为根基,以调动全党积极性、主动性、创造性为着力点,全面推进党的政治建设、思想建设、组织建设、作风建设、纪律建设,把制度建设贯穿其中,深入推进反腐败斗争,不断提高党的建设质量,把党建设成为始终走在时代前列、人民衷心拥护、勇于自我革命、经得起各种风浪考验、朝气蓬勃的马克思主义执政党'
for x, w in jieba.analyse.textrank(s, topK=20, withWeight=True):
    print('%s %s' % (x, w))
*********************************************
建设 1.0
全面 0.31305336465433126
推进 0.24988322703377466
根基 0.2023823670227818
政治 0.20011925581269993
勇于 0.19985144097069485
时代 0.19744139577204686
坚持 0.1952999190477676
拥护 0.1948755863080678
衷心 0.1923882028975174
人民 0.18956245015329035
经得起 0.1884612805201713
加强 0.17696960657574184
革命 0.17566018593830074
先进性 0.1739879730615762
考验 0.17286015889170933
深入 0.1598748904726119
前列 0.15461978439374305
调动 0.15426309636494243
全党 0.15291315688258042

*********************************************

二、wordcloud库简介

wordcloud是优秀的词云展示第三方库,以词语为基本单位,通过图形可视化的方式,更加直观和艺术的展示文本。

基本使用

wordcloud 库把词云当作一个WordCloud对象

wordcloud.WordCloud()代表一个文本对应的词云
可以根据文本中词语出现的频率等参数绘制词云
绘制词云的形状、尺寸和颜色均可设定
以WordCloud对象为基础,配置参数、加载文本、输出文件
import wordcloud
c=wordcloud.WordCloud()            #1.配置对象参数
c.generate("I love python")  #2.加载词云文本
c.to_file("test.png")       #3.输出词云文件

使用python制作词云(重点对jieba库和wordcloud库进行介绍)_第1张图片
wordcloud如何将文本转化为词云
1.分隔:以空格分隔单词
2.统计:单词出现次数并过滤
3.字体:根据统计配置字号
4.布局:颜色环境尺寸
配置相关的参数,比较简单,不做详细介绍,请看下面实例

三 、制作词云实例代码

下面是一个实例额,将19大报告先分词,然后用词云显示


# Created by 老刘 on 2020/5/1
import PIL.Image as image
from wordcloud import WordCloud,ImageColorGenerator
import numpy as np
import matplotlib.pyplot as plt
import jieba

#分词函数
def cut_text(text):
   word_list=jieba.cut(text)
   return " ".join(word_list)
#d读取文本
text = open('C://Users/Administrator/Desktop/txt/19da.txt', 'r',encoding='utf-8').read()
#使用分词函数进行分词
text=cut_text(text)
#设置遮罩参数
mask = np.array(image.open("C://Users/Administrator/Desktop/pic/ChinaMap.jpg"))
#生成词云
my_wordcloud = WordCloud(
   mask=mask,#使用遮罩
   font_path="C:/Windows/Fonts/STZHONGS.TTF",    # 设置字体
   background_color='white'
   ).generate(text)
#生成颜色值,词云使用背景图的颜色
image_color=ImageColorGenerator(mask)
#print(image_color)#调试用
#显示词云
plt.imshow(my_wordcloud.recolor(color_func=image_color))
plt.axis('off')
plt.savefig("temp.jpg",dpi=200)#将生成的词云图片进行保存
plt.show()

效果图如下
使用python制作词云(重点对jieba库和wordcloud库进行介绍)_第2张图片
初学者在写代码的时候会遇到很多坑,大家可以参考新手词云常见得坑
,里面有常见坑的处理方法,希望对大家能有所用。
本来所有的文字就是在中国地图上显示,但是调试一整天还是没有达到预期效果,请大家多多指教。

你可能感兴趣的:(词云,python)