用python全方位解析2019新冠疫情词云图

用python全方位解析2019新冠疫情词云图

  • wordcloud模块
  • jieba分词器模块
  • PyCharm创建工程
  • 生成词云的方法
  • wordcloud.WordCloud()的参数介绍
  • 影响词云图像清晰的WordCloud的参数
    • mask
    • background_color
    • mode
    • max_font_size
    • min_font_size
    • relative_scaling
    • scale
  • python实现
    • 打开文件
    • 中文分词
    • 设置词云样式
    • 显示词云
    • 保存生成的词云文件
    • 未加载背景图片的词云图
    • 加载背景代码

wordcloud模块

wordcloud是一个非常优秀的词云展示的第三方库,词云是以词语为基础,通过汇总不用的字更加直观和艺术性的展示我们的文本

首先,安装wordcloud包时,直接用 pip install wordcloud是会报错的,会出现文件缺失的问题。这一点不少人都有类似反馈。

解决方案可看我一下两篇博客:
python快速安装资源包
手把手教你进行pip换源

当然也可以通过下载.whl文件进行安装:.whl文件链接
在cmd中命令:pip install .whl文件的路径
这种方法比较麻烦,每次安装模块时都要去找.whl文件,我反正是拒绝的。。。。。。

正确打开方式:
打开cmd在命令框中输入:

pip install wordcloud -i https://pypi.doubanio.com/simple

安装速度很快,可以说是秒安装。。。。不信你可以试试。。。
用python全方位解析2019新冠疫情词云图_第1张图片

wordcloud官方简介:github:https://github.com/amueller/word_cloud
官方地址:
https://amueller.github.io/word_cloud/

jieba分词器模块

jieba分词器模块有三种分词的模式:

  1. 全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,会根据字典,将所有出现的字词全部匹配划分,所以会出现重复,但是不能解决歧义。
  2. 精确模式:试图将句子最精确地切开,适合文本分析(类似LTP分词方式)
  3. 搜索引擎模式:在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词。

jieba分词器模块安装同wordcloud模块安装一样,在cmd在输入:

pip install jieba -i https://pypi.doubanio.com/simple

PyCharm创建工程

工程创建具体我就不阐述了,看图:
用python全方位解析2019新冠疫情词云图_第2张图片

生成词云的方法

wordcloud 生成词云有两个方法:from text 和 from frequencies ,即文本生成和频率生成,每一个都有对应的函数可以使用。

generate(text)      			Generate wordcloud from text.
generate_from_text(text)    	Generate wordcloud from text.
generate_from_frequencies      	Create a word_cloud from words and frequencies.

wordcloud.WordCloud()的参数介绍

参数 描述
width 指定词云对象生成图片的宽度,默认400像素
height 指定词云对象生成图片的高度,默认200像素
min_ font_size 指定词云中字体的最小字号,默认4号
max_ font_ size 指定词云中字体的最大字号,根据高度自动调节
font_ step 指定词云中字体字号的步进间隔,默认为1
font_ path 指定字体文件的路径,默认None,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf’
max_ words 指定词云显示的最大单词数量,默认200
stop_ words 指定词云的排除词列表,即不显示的单词列表,设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
mask 指定词云形状,默认为长方形,需要引用imread()函数,如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代
background_ color 指定词云图片的背景颜色,默认为黑色
prefer_horizontal 词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
scale 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
mode 当参数为“RGBA”并且background_color不为空时,背景为透明
relative_scaling 词频和字体大小的关联性
color_func 生成新颜色的函数,如果为空,则使用 self.color_func
regexp 使用正则表达式分隔输入的文本
collocations 是否包括两个词的搭配
colormap 给每个单词随机分配颜色,若指定color_func,则忽略该方法
fit_words(frequencies) 根据词频生成词云【frequencies,为字典类型】
generate(text) 根据文本生成词云
generate_from_frequencies(frequencies[, …]) 根据词频生成词云
generate_from_text(text) 根据文本生成词云
process_text(text) 将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap]) 对现有输出重新着色。重新上色会比重新生成整个词云快很多
to_array() 转化为 numpy array
to_file(filename) 输出到文件

影响词云图像清晰的WordCloud的参数

mask

遮罩图即背景图片。字的大小布局和颜色都会依据遮罩图生成。其实理论上这对字大小和清晰程度的影响不大,但是遮罩图色和背景色background_color混淆,则可能导致看起来不清晰;另外遮罩图自身各个颜色之间的对比不强烈,也可能使图看起来层次感不够。

比如,一些图明度比较高,再加上背景白色,有可能导致字色太浅(背景色background_color又是白色)于是看起来不够“清晰”。

background_color

背景色默认为黑色。就像在mask中提到的,如果遮罩图像颜色过浅、背景设置白色,可能导致字看起来“不清晰”。而实际上,对一个浅色遮罩图分别用白、黑两种背景色后发现,黑色背景的强烈对比之下会有若干很浅也很小的词浮现出来,而之前因背景色、字色过于相近而几乎无法用肉眼看出这些词。

mode

默认“RGB”,根据说明文档,如果想设置透明底色的云词图,那么可以设置background_color=None, mode="RGBA"
但是!!!实际中我尝试设置透明背景色并没有成功过!
当我选取的遮罩图是白色底时,如果background_color设置为"white"或"black"时,生成的云词确实是对应的“白色”“黑色”;但是按照上述参数设置透明色时,结果出来依然是白色。

max_font_size

最大字号,图的生成会依据最大字号等因素去自动判断词的布局。

经测试,哪怕同一个图像,只要图本身尺寸不一样(比如我把一个300×300的图拉大到600×600再去当遮罩),那么同样的字号也是会有不同的效果。

原理想想也很自然,字号决定了字的尺寸,而图的尺寸变了以后,最大字相对于图的尺寸比例自然就变了。

所以,需要根据期望显示的效果,去调整最大字号参数值。

min_font_size

最小字号,不设置的情况下,默认是4。尝试了设置比4大的字号,例如8、10,结果就是原本小于设定值且大于4号的词都直接不显示了,其它内容和未设置该值时都一样。

relative_scaling

表示词频和云词图中字大小的关系参数,默认0.5。为0时,表示只考虑词排序,而不考虑词频数;为1时,表示两倍词频的词也会用两倍字号显示。

scale

根据说明文档,当云词图很大的,加大该值会比使用更大的图更快,但值越高也会越慢(计算更复杂)。默认值是1。实际测试中,更大的值,确实输出图像看起来更精细(较小较浅的词会颜色更重,也感觉清楚,大的词差异不明显)。

python实现

文本信息:2019nCov.txt
用python全方位解析2019新冠疫情词云图_第3张图片

打开文件

用open函数打开文件,编码用utf-8

text_from_file_with_apath = open('2019nCov.txt', encoding='utf-8').read()

中文分词

sep’.join(seq)sep作为分隔符,将seq所有的元素合并成一个新的字符串

wordlist_after_jieba = jieba.cut(text_from_file_with_apath, cut_all=True)
#sep’.join(seq)以sep作为分隔符,将seq所有的元素合并成一个新的字符串
wl_space_split = " ".join(wordlist_after_jieba)

设置词云样式

wc = WordCloud(
    background_color="white",   # 设置背景颜色
    mask=backgroud_Image,       # 设置背景图片
    width=1000,
    height=860,
    font_path="C:\\Windows\\Fonts\\msyhbd.ttc",   # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
    max_words=2000,         # 设置最大现实的字数
    stopwords=STOPWORDS,    # 设置停用词
    max_font_size=150,      # 设置字体最大值
    # min_font_size=10,     # 设置字体最小值
    random_state=30,        # 设置有多少种随机生成状态,即有多少种配色方案
    scale=8,
)

显示词云

调用plt.imshow()函数显示词云

plt.imshow(my_wordcloud)
#是否显示x轴、y轴下标
plt.axis("off")

保存生成的词云文件

我这里用的是WordCloud中自带.to_file可以将云词图输出到文件

my_wordcloud.to_file('wordcloud6.png')

另一种输出图片的方式:用plt.savefig("这里是生成图片的路径")来存储生成的云词图

plt.savefig('wordcloud6.png',dpi=200) 
plt.show()

注意:一定要把plt.savefig放在plt.show之前,否则得到的是一张空白的图

未加载背景图片的词云图

import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import jieba

# 打开文件
text_from_file = open('2019nCov.txt',encoding='utf-8').read()
# 中文分词
wordlist_after_jieba = jieba.cut(text_from_file, cut_all=True)
# sep’.join(seq)以sep作为分隔符,将seq所有的元素合并成一个新的字符串
txt = " ".join(wordlist_after_jieba)
# 生成对象
'''设置词云样式'''
wc = WordCloud(
    background_color="white",   # 设置背景颜色
    width=1000,
    height=860,
    font_path="C:\\Windows\\Fonts\\STFANGSO.ttf",   # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
    max_words=2000,         # 设置最大现实的字数
    stopwords=STOPWORDS,    # 设置停用词
    max_font_size=150,      # 设置字体最大值
    random_state=30         # 设置有多少种随机生成状态,即有多少种配色方案
)
my_wordcloud = wc.generate(txt)
# 显示词云
plt.imshow(my_wordcloud)
# 是否显示x轴、y轴下标
plt.axis("off")
plt.show()
# 保存文件
my_wordcloud.to_file('wordcloud.png')

用python全方位解析2019新冠疫情词云图_第4张图片
用python全方位解析2019新冠疫情词云图_第5张图片

加载背景代码

import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import jieba

# 打开文件
text_from_file = open('2019nCov.txt',encoding='utf-8').read()
# 中文分词
wordlist_after_jieba = jieba.cut(text_from_file, cut_all=True)
# sep’.join(seq)以sep作为分隔符,将seq所有的元素合并成一个新的字符串
txt = " ".join(wordlist_after_jieba)
# 背景图片
backgroud_Image = plt.imread('yuntu.jpg')
print('加载图片成功!')
# 生成对象
'''设置词云样式'''
wc = WordCloud(
    background_color="white",   # 设置背景颜色
    mask=backgroud_Image,       # 设置背景图片
    width=1000,
    height=860,
    font_path="C:\\Windows\\Fonts\\msyhbd.ttc",   # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
    max_words=2000,         # 设置最大现实的字数
    stopwords=STOPWORDS,    # 设置停用词
    max_font_size=150,      # 设置字体最大值
    random_state=30         # 设置有多少种随机生成状态,即有多少种配色方案
)
my_wordcloud = wc.generate(txt)
print('开始加载文本')
# 显示词云
plt.imshow(my_wordcloud)
# 是否显示x轴、y轴下标
plt.axis("off")
plt.show()
# 保存文件
my_wordcloud.to_file('wordcloud1.png')
print('生成词云成功!')

背景图:
用python全方位解析2019新冠疫情词云图_第6张图片

STFANGSO.ttf:字体为华文仿宋 字体
用python全方位解析2019新冠疫情词云图_第7张图片
msyhbd.ttc:字体为微软雅黑粗体
用python全方位解析2019新冠疫情词云图_第8张图片
背景图:
用python全方位解析2019新冠疫情词云图_第9张图片
STFANGSO.ttf:字体为华文仿宋 字体
用python全方位解析2019新冠疫情词云图_第10张图片

msyhbd.ttc:字体为微软雅黑粗体
用python全方位解析2019新冠疫情词云图_第11张图片

用python全方位解析2019新冠疫情词云图_第12张图片

有帮助的话来个三连击,鼓励鼓励一下我
有帮助的话来个三连击,鼓励鼓励一下我
有帮助的话来个三连击,鼓励鼓励一下我

你可能感兴趣的:(用python全方位解析2019新冠疫情词云图)