现在,网上很多可视化的方法,有一种就是词云图。

词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,方便领略文本的主旨。

词云图的原理整体来说比较简单,但是效果还是蛮不错的,可以从纷繁复杂的信息中找到最关键的信息~感觉可以用来进行政策分析、新闻舆情的分析~

主要研究的是用python和第三方包的方式来进行制作~当然,网上也有一些在线的网站可以支持,但是直接写好脚本调用,就不用自己一个一个导入啦,批量生成最近政策的关键图像,也是蛮不错的哟~

之前接触词云图一直用的是worldcloud这个包,最近又接触到了pyecharts,也可以进行词云图的制作。

wordcloud生成词云图

wordcloud 安装

直接使用pip安装wordcloud~因为涉及到要进行图片生成,所以,也要下载安装matplotlib。

pip install wordcloud
pip install matplotlib

wordcloud API

wordcloud 库把词云当作一个WordCloud对象来进行处理:

  • WordCloud([font_path, width, height, …]) - 进行词云图对象的创建和绘制
  • ImageColorGenerator(image[, default_color]) - 根据图片颜色生产词云绘制颜色
  • random_color_func([word, font_size, …]) - 随机生成词云绘制颜色
  • get_single_color_func(color) - 使用单色进行词云绘制

使用Wordcloud对象可以进行词云图的绘制,其中,可以设置图片的形状。

wordcloud使用

词云图生成准备

对于中文来说,和英文不太一样,英文本身使用单词的空格进行了天然的划分~所以,在进行词云图生成的时候,需要和英文一样对于中文进行分词的处理,也就是按照中文词语的意思进行词的划分~

目前,国内最常采用的中文分词工具是jieba包。

jieba分词包下载安装

pip install jieba

jieba分词包使用

使用jieba的方法进行文章分词,常用的是cut()和lcut(),可以根据需要进行选用。

  • jieba.cut() - 生成一个生成器,如果想要得到list,需要使用for循环得到
  • jieba.lcut() - 直接得到分词后的list
import jieba


text = '你想要分词的文本数据'

# jieba.cut() - 生成一个生成器,如果想要得到list,需要使用for循环得到
word_list1 = [word for word in jieba.cut(text)]

# jieba.lcut() - 直接得到分词后的list
word_list2 = jieba.lcut(text))

如果文本为从txt等文件中获得,则使用open()的方式进行文本获取,并且,使用re的函数来进行中文提取~

import jieba
import re

# 使用open()进行文件读取
text = [i.strip() for i in open('你的文件.txt').readlines()]

# cut_all = False - 表示使用精确模式进行拆分
# re.findall('[\u4e00-\u9fa5]', text) - 表示进行中文提取
word_list = []
for sentence in text:
    text = jieba.lcut(''.join(re.findall('[\u4e00-\u9fa5]', sentence)), cut_all = False)
    word_list.append(text)

停用词使用

 因为中文中有很多语气词和连接词,出现的次数多,但是意义并不大,而词云图又会对这些词进行统计,所以,在生成最终的词的频率分布时,需要将这些意义不大的词给剔除掉~

目前,网上已经有很多成熟的停用词库,可供使用。因此,我们可以创建我们自己的分词方法,便于后续的调用。

# stopwords为停用词list
# stopwords = [i.strip() for i in open('stop_words.txt').readlines()]
# 直接读取转为list后使用

# cut_word() - 针对于每一句进行处理
def cut_word(sentence, stopwords):
	text = jieba.lcut(''.join(re.findall('[\u4e00-\u9fa5]', sentence)), cut_all = False)
	for i in range(len(text)-1, -1, -1):
		if text[i] in stopwords:
			del text[i]
	return text

这样,我们通过目标文件读取 - 目标文件分词 - 停用词剔除,得到最终分词频率分布表。全流程如下:

# muziyi1994 code
import jieba
import jieba.analyse
import re

def cut_word(sentence, stopwords):
	text = jieba.lcut(''.join(re.findall('[\u4e00-\u9fa5]', sentence)), cut_all = False)
	for i in range(len(text)-1, -1, -1):
		if text[i] in stopwords:
			del text[i]
	return text

def main():
	filename = "十三五规划.txt"
	stopword_file = "stopwords.txt"
	# 读取目标文本
	target_list = [i.strip() for i in open(filename).readlines()]
	# 读取停用词
	# 网上搜到的一些常用的停用词
	stopwords = [i.strip() for i in open(stopword_file).readlines()]
	# 使用jieba包进行分词拆分
	word_list = [" ".join(cut_word(sentence, stopwords)) for sentence in target_list]
    # 使用空格来成为分隔符,并连接生成新文本
	new_text = ' '.join(word_list)

词云图生成

在得到了处理过后的新文本后,就可以使用wordcloud创建对象后进行处理了。

wordcloud对象创建

wordcloud.WordCloud(font_path=Nonewidth=400height=200margin=2ranks_only=Noneprefer_horizontal=0.9mask=Nonescale=1color_func=Nonemax_words=200min_font_size=4stopwords=Nonerandom_state=Nonebackground_color='black'max_font_size=Nonefont_step=1mode='RGB'relative_scaling='auto'regexp=Nonecollocations=Truecolormap=Nonenormalize_plurals=Truecontour_width=0contour_color='black'repeat=Falseinclude_numbers=Falsemin_word_length=0collocation_threshold=30)

上述为wodcloud创建是可使用的参数,比较常用的参数为:

  • font_path: 字体文件路径,找到自己喜欢的字体并配置上路径即可,特别是中文词云图是一定需要配置的。
  • max_font_size: 最大字号设置
  • width/height: 画布的宽和高,默认为400/200
  • background_color: 背景颜色,默认是黑色
  • contour_width/contour_color: 轮廓线宽/轮廓线颜色
  • max_words: 所展示词的最大容量,默认为200
  • mask: 蒙版功能,白色部分会默认不会进行绘制。可以搭配图片进行特定样式词云图生成。

词云图简单配置生成

如果只是想要进行简单的词云图生成,简单配置好字体路径,搭配generate()进行使用就可以啦~最后,使用to_file()进行对应生成图片生成即可完成整体创建。

font_path = 'simhei.ttf'
# new_text以空格区分的字符串
wordcloud1 = WordCloud(font_path=font_path).generate(new_text) 
# 在当前目录下生成对应的图片
wordcloud1.to_file("wordcloud1.png")

 输出结果:

 词云图生成特定模式

如果想要生成有不同样式的词云图,可以使用mask进行操作。为了读取图片,可以使用对应的包进行图片的读取,本人选用的是matplotlib.image进行相应的操作。因为图片的读取是一个非常常用的操作,很多图片处理的包都可以进行操作。

import matplotlib.image as mpig
# 读取对应的图片
mask = mpig.imread("mask.jpeg")

# 使用wordcloud中的mask进行相应版式词云图生成
font_path = 'simhei.ttf'
wordcloud2 = WordCloud(font_path=font_path, mask=mask).generate(new_text)
wordcloud2.to_file("wordcloud2.png")

使用图片:

我使用的是一个四叶草的图片,生成了四叶草词云图,大家可以使用自己喜欢的图片进行生成,注意让背景是白色地板就行啦~

输出结果:

 

词云图输出

一般为了直接生成词云图,直接使用to_file()即可,还可以输出其他格式。

  • to_array() - 输出numpy格式的array
  • to_file(filename) - 输出为图片
  • to_svg([embed_font, optimize_embedded_font, …]) - 输出为svg

pyecharts生成词云图

Echarts 是百度基于JavaScript 开源的可视化图表库,而 Pyecharts 则可以使用python来调用echarts的开源库,从而制作精美的图表。主要使用上还是会来做一些其他图表的生成,但是它也提供词云图的生成办法。

整体的词云图生成逻辑是和上述一致的,首先需要进行分词处理和停用词删除操作,然后调用pyecharts的函数WordCloud()来进行处理,当然,输入的data也需要是规定的模式。

pyecharts安装

直接使用pip进行安装

pip install piecharts

WordCloud()函数介绍

官方有针对于词云图的使用函数进行详细的介绍:

pyecharts 词云图函数介绍Descriptionhttps://pyecharts.org/#/zh-cn/basic_charts?id=wordcloud%EF%BC%9A%E8%AF%8D%E4%BA%91%E5%9B%BE

pyecharts生成词云图

有很多参数可以进行调整后制作精美的效果,但是,对于简单的词云图生成,只需要知道在那边灌入数据就好了~

词云图数据准备

# 同样的方式处理拿到的原始数据
target_list = [i.strip() for i in open(filename).readlines()]
stopwords = [i.strip() for i in open(stopword_file).readlines()]
# cut_word为前面所写的方法
word_list = [" ".join(cut_word(sentence, stopwords)) for sentence in target_list]
new_text = ' '.join(word_list)

# 生成对应的输入版式
# 使用jieba.analyse提取前200的分词标签
tags=jieba.analyse.extract_tags(new_text,topK=2000,withWeight=True)
# 构建输入
tf=dict((a[0],a[1]) for a in tags)
data=[[k,v] for k,v in tf.items()]

这样,我们就可以得到一个list,可供后续词云数据输入。

词云图生成

使用WordCloud()函数进行生成。

简单生成

# (1)简单生成
wc1 = (WordCloud()
.add(series_name="词云图", data_pair=data, word_size_range=[6, 66])
.set_global_opts(
	title_opts=opts.TitleOpts(
		title="词云图", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
	),
	tooltip_opts=opts.TooltipOpts(is_show=True),
))
# 生成词云图html
wc1.render("wordcloud1.html")

输出结果:

使用shape参数丰富输出

shape: 词云图轮廓,有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选。

# (2)使用shape参数丰富输出
# shape: 词云图轮廓,有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选
wc2 = (WordCloud()
.add(series_name="词云图", data_pair=data, word_size_range=[6, 66], shape = 'cardioid')
.set_global_opts(
	title_opts=opts.TitleOpts(
		title="词云图", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
	),
	tooltip_opts=opts.TooltipOpts(is_show=True),
))
# 生成词云图html
wc2.render("wordcloud2.html")

输出结果

自定义图片

 使用mask_image参数进行图片形状自定义。

mask_image自定义的图片(目前支持 jpg, jpeg, png, ico 的格式)

该参数支持:

  1. base64;
  2. 本地文件路径(相对或者绝对路径都可以)
# 直接使用路径进行操作
mask_img = "mask.png"
wc3 = (WordCloud()
	.add(series_name="词云图", data_pair=data, word_size_range=[6, 66], mask_image=mask_img)
	.set_global_opts(title_opts=opts.TitleOpts(title="词云图-自定义图片"))
)
wc3.render("wordcloud3.html")

 使用的是同样的四叶草图片,得到输出结果

整体来说,用起来还是相对来说比较简单和方便的,大家可以尝试用一下呀~

我这边选择的是十三五规划的一些文本,我们可以看到信息化这个关键词是非常关键的,所以,一定程度上意味着,国内针对于信息技术的重视程度在不断的提升。

相应的参考文本和代码我整理了一下,希望可以和大家一起学习和成长~

词云图学习(wordcloud&pyecharts)-统计分析文档类资源-CSDN下载用wordcloud和pyecharts中的WordCloud方法进行词云图创建更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u014530058/85060913

资料来源:

(1)worldcloud 官方文档:http://amueller.github.io/word_cloud/

(2)pyechart 官方文档: https://pyecharts.org/#/zh-cn/intro

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐