所谓一张图胜过千言万语, 在信息爆炸时代,一张形象生动的信息图往往要比一篇深度长文章更容易赢得眼球和青睐,万能的python怎么会少了这种工具呢,wordcloud是python的一个词云生成库,只需要简单的几段代码就能提炼出一篇文章出现频率最多的关键词。
sudo pip3 install --upgrade pip #python3升级pip
pip3 install --user wordcloud #安装词云生成工具
-
保存生成的词云图
import wordcloud #导入词云生成模块
text_path = '/home/ly/Desktop/file.txt'
save_path = '/home/ly/Desktop/wordCloud.png'
with open(text_path, encoding='utf-8') as f:
text = f.read()
w = wordcloud.WordCloud(width=800,
height=600,
background_color='white')
w.generate(text) #生成词云图
w.to_file(save_path) #保存词云图
-
只生成并显示词云图而不保存
from wordcloud import WordCloud
import PIL.Image as image
import numpy as np
with open("/home/ly/Desktop/file.txt", encoding='utf-8') as f: #读取文本
text = f.read()
img = np.array(image.open("/home/ly/Downloads/4f8fd0b583bb50d0f05ea791d3b0916b.jpg")) #读取参考图
word_cloud = WordCloud(width=800, #词云图宽
height=600, #词云图高
background_color='white', #词云图背景颜色
mask=img).generate(text) #词云图的参考图
word_cloud_picture = word_cloud.to_image() #生成词云图
word_cloud_picture.show() #显示词云图
运行结果:
-
中文乱码问题
这看起来还不错,但是有一个问题,一旦遇到中文的字体就会乱码,而且遇到一长串的中文字符时,wordcloud也不知道该从哪里开始断句提炼出关键词,既然叫词云那肯定提炼的是词而不是一个个字或者一长串的句子,所以还要使用到jieba模块进行中文字符的断句,并且还要指定字体库防止乱码。
首先我们要安装jieba模块
pip3 install --user jieba #安装jieba分词模块
然后查看我们系统中的字体有那些,以我的ubuntu1804为例,查看字体命令。
fc-list 查看所有的字体
fc-list :lang=zh 查看所有的中文字体
这里我们选择查看中文字体路径,怎么选择呢?随便选择自己喜欢的字体,复制其路径就好了,比如第一个字体的路径为/usr/share/fonts/truetype/arphic/uming.ttc,取第一个冒号前的内容。
$ fc-list :lang=zh
/usr/share/fonts/truetype/arphic/uming.ttc: AR PL UMing TW MBE:style=Light
/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc: Noto Serif CJK SC:style=Bold
/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc: Noto Serif CJK TC:style=Bold
/usr/share/fonts/truetype/arphic/ukai.ttc: AR PL UKai CN:style=Book
/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc: Noto Sans CJK HK,Noto Sans CJK HK Black:style=Black,Regular
/usr/share/fonts/truetype/arphic/ukai.ttc: AR PL UKai HK:style=Book
/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc: Noto Serif CJK JP:style=Bold
/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc: Noto Serif CJK KR:style=Bold
/usr/share/fonts/truetype/arphic/ukai.ttc: AR PL UKai TW:style=Book
...此处省略几百行输出
然后修改代码如下,这里只是添加了中文分词模块和指定了字体的路径,然后生成词云图并保存。
import wordcloud
import jieba #导入中文分词模块
text_path = '/home/ly/Desktop/file.txt'
save_path = '/home/ly/Desktop/wordCloud.png'
with open(text_path, encoding='utf-8') as f:
text = f.read()
w = wordcloud.WordCloud(width=800, #指定词云图的宽
height=600, #指定词云图的高
background_color='white', #指定背景颜色
font_path='/usr/share/fonts/truetype/arphic/uming.ttc') #指定字体的路径 font_path='/usr/share/fonts/opentype/noto/NotoSerifCJK-Light.ttc'
text_list = jieba.lcut(text)
string = ''.join(text_list)
w.generate(string)
w.to_file(save_path)
生成词云图并显示而不保存代码如下 ,文本是我在linuxprobe.com主页上随便复制的一段。
import wordcloud
import jieba #导入中文分词模块
text_path = '/home/ly/Desktop/file.txt'
save_path = '/home/ly/Desktop/wordCloud.png'
with open(text_path, encoding='utf-8') as f:
text = f.read()
w = wordcloud.WordCloud(width=800, #指定词云图的宽
height=600, #指定词云图的高
background_color='white', #指定背景颜色
font_path='/usr/share/fonts/truetype/arphic/uming.ttc') #指定字体的路径 font_path='/usr/share/fonts/opentype/noto/NotoSerifCJK-Light.ttc'
text_list = jieba.lcut(text)
string = ''.join(text_list)
w.generate(string)
word_cloud_picture = w.to_image()
word_cloud_picture.show()
运行结果:
emm…
中文显示出来了,但是并不怎么好看,我们让它显示在一张图片上,让其根据图片自动调整显示区域,在模块中填入mask参数。
import wordcloud
import jieba #导入中文分词模块
import PIL.Image as image
import numpy as np
text_path = '/home/ly/Desktop/file.txt'
save_path = '/home/ly/Desktop/wordCloud.png'
with open(text_path, encoding='utf-8') as f:
text = f.read()
img = np.array(image.open("/home/ly/Pictures/Screenshot from 2019-12-14 21-41-08.png")) #读取参考图
w = wordcloud.WordCloud(width=800, #指定词云图的宽
height=600, #指定词云图的高
background_color='white', #指定背景颜色
mask=img, #指定参考图
font_path='/usr/share/fonts/truetype/arphic/uming.ttc') #指定字体的路径
text_list = jieba.lcut(text)
string = ''.join(text_list)
w.generate(string)
word_cloud_picture = w.to_image()
word_cloud_picture.show()
运行结果:
最后找到一个参数比较全面的博主的代码
https://me.csdn.net/qq_38741229
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
with open('/home/ly/Desktop/file.txt', "r", encoding="utf-8") as f:
text = f.read()
'''ut_all=True是全模式,cut_all=False是精确模式,默认是精确模式
将文本已词语的方式分割 分割后赋值给Word'''
cutData = jieba.cut(text, cut_all=False)
word = " ".join(cutData) # 空格分割词语
mask = np.array(Image.open("/home/ly/pic/57.jpg")) #背景图
'''
WordCloud()可选的参数
font_path:可用于指定字体路径,包括otf和ttf
width:词云的宽度,默认为400
height:词云的高度,默认为200
mask:蒙版,可用于定制词云的形状
min_font_size:最小字号,默认为4
max_font_size:最大字号,默认为词云的高度
max_words:词的最大数量,默认为200
stopwords:将被忽略的停用词,如果不指定则使用默认的停用词词库
background_color:背景颜色,默认为black
mode:默认为RGB模式,如果为RGBA模式且background_color设为None,则背景将透明
'''
wc = WordCloud(mask=mask,
font_path='/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc',
mode='RGBA',
background_color='black').generate(word)
# 下面代码表示显示图片
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
# 保存图片
wc.to_file('cloud_img.png')