词云进阶(高大上的词云其实很简单)
大家好,我是【Python办公自动化】:闲暇之余分享点文字、编程、设计等干货,希望和你一起成长。
一起学习Python办公自动化,教你快速学习Python的方法,可以站内私信我。
在海量数据中提取有效的信息,词云不愧是一种有效解决此类问题的方法,它可以突出显示关键词,快速提取有价值的信息。Python制作词云很简单,一般几行代码就可以搞定,主要使用的库有jieba(结巴,一种分割汉语的分词库)和wordcloud库。
1.jieba库jieba 是目前最好的Python中文分词组件,它支持3种分词模式:精确模式、全模式、搜索引擎模式。
jieba.cut()方法接受两个输入参数,第一个参数为需要分词的字符串,第二个参数cut_all用来控制是否采用全模式。返回一个列表。
jieba.lcut()方法接受两个输入参数,第一个参数为需要分词的字符串,第二个参数cut_all用来控制是否采用全模式。返回一个生成器。该方法与jieba.cut()方法返回切割的词是一致的。
jieba.cut_for_search()方法接受一个参数,参数为需要分词的字符串,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。
从结果上看全模式是将所有词语分割出来,但会分割出我们不需要的词语。如果我们做词云,常使用精确模式。搜索引擎常使用搜索引擎模式,将句子切割成关键词。
通过下段代码演示这3种模式的区别。
import jieba
#全模式,cut()方法返回列表
seg_list = jieba.cut("南京市长江大桥欢迎你。", cut_all=True)
print(type(seg_list),seg_list)
#精确模式,lcut()方法返回生成器模式
seg_list1 = jieba.lcut("南京市长江大桥欢迎你。", cut_all=False)
print(type(seg_list1),seg_list1)
#搜索引擎模式
seg_list2 = jieba.cut_for_search("南京市长江大桥欢迎你。")
print(type(seg_list2),seg_list2)
print("全模式:" "/ ".join(seg_list))
print("精确模式:" "/ ".join(seg_list1))
print("搜索引擎模式:" "/ ".join(seg_list2))
代码执行结果如下所示。
<class 'list'> ['南京市', '长江大桥', '欢迎', '你', '。']
<class 'generator'> <generator object Tokenizer.cut_for_search at 0x000002E04D1C43C0>
全模式:南京/ 南京市/ 京市/ 市长/ 长江/ 长江大桥/ 大桥/ 欢迎/ 你/ 。
精确模式:南京市/ 长江大桥/ 欢迎/ 你/ 。
搜索引擎模式:南京/ 京市/ 南京市/ 长江/ 大桥/ 长江大桥/ 欢迎/ 你/ 。
2.wordcloud库
wordcloud库是优秀的词云展示第三方库,主要功能是用文本词汇和词频以图片展示。直观形象反映词汇在所有文章中的比重,如:人物标签的特性、评论区情绪等等。通过图形可视化的方式,更加直观和艺术的展示文本。
词云生成主要使用了wordcloud 库中的WordCloud类,可以根据文本中词语出现的频率等参数绘制词云,绘制词云的形状、尺寸和颜色均可设定。
以WordCloud类为基础,配置参数、加载文本、输出文件,其语法格式如下。
class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None,background_color='black', max_font_size=None, font_step=1, mode='RGB')
其中常用参数font_path指字体路径或者字体名称。
width指输出的画布宽度,默认400像素。height指输出的画布高度,默认200像素。
mask参数如果为空,以默认宽和高绘制。如果mask非空,设置的宽高值将被忽略,遮罩形状被具体的mask取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。比如用Pillow读取某张图片,转换成Numpy的array格式,并将其设置为mask(遮罩)。除图片全白的部分将不会被绘制,其余部分会用于绘制词云。
scale指按照比例进行放大画布,默认为1。如设置为1.5,则长和宽都是原来画布的1.5倍。
min_font_size指显示的最小的字体大小,默认为4。max_font_size指显示的最大的字体大小。
max_words指要显示的词的最大个数,默认为200。
stopwords指需要停用的词,如果为空,则使用内置的STOPWORDS停用库。
background_color指背景颜色,默认为黑色(black)。如background_color='white',背景颜色为白色。
mode参数默认为RGB,当参数为RGBA并且background_color不为空时,背景为透明。
color_func指生成新颜色的函数,如果为空,则使用 self.color_func
wordcloud库如何将文本转化为词云呢?
(1)分隔,以空格分隔单词,如果是中文,使用jieba分词库切割。
(2)统计,单词出现次数并过滤
(3)字体,根据统计配置字号
(4)布局,颜色环境尺寸
接下来我们一起进行代码编写,通过3步来演示词云效果。
(1)准备分词文件和背景图片。
我们在网上找一些关于爱情美好的语句,黏贴到文本文件,命名为7xi.txt。然后找一个好的背景,比如心型图案,要求背景白色或者透明,格式为png。
(2)词云效果。
通过下段代码实现一个词云效果。
from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator
import jieba
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import os
curpath = os.path.dirname(__file__)
filename = os.path.join(curpath, '7xi.txt')
backimg = os.path.join(curpath, 'back3.png')
savefilename = os.path.join(curpath, 'wordcloud.png')
#设置模板
backgroud_Image=np.array(Image.open(backimg))
#创建对象
wcd = WordCloud(background_color='white',width=400,height=200,font_path='simhei.ttf',mask=backgroud_Image,max_font_size=100, min_font_size=10,scale=1.5)
text=open(filename,'r',encoding='utf-8').read()
#对读取的文件进行分词
text=" ".join(jieba.lcut(text))
#生成词云
wcd.generate(text)
#保存图片
wcd.to_file(savefilename)
代码执行后生成wordcloud.png,文件内容如图所示。
(3)美化效果。
默认词云的颜色以蓝绿冷色调偏多,看起来不是很舒服。我们换个颜色来显示,如下列代码。
image_colors = ImageColorGenerator(backgroud_Image)
wcd.recolor(color_func=image_colors)
#保存图片
wcd.to_file(savefilename)
代码执行后,文件内容如图所示。
除此之外,还可以显示在Matplotlib的窗口中,只需要增加如下代码即可。
plt.imshow(wcd)
plt.axis('off') #关闭坐标轴
plt.show()
请读者自行测试验证。
需要相关文件代码,请站内私信。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com