原文地址:http://itdarcy.wang/index.php/20200104/355
python:3.7
功能模块:wordcloud 1.6.0、matplotlib 3.1.2
安装wordcloud
现在应该是能直接通过
pip install wordcloud
的方式安装了,如果不能安装可以从 这里 下载
选择的时候cp37表示python的版本是3.7,win_amd64表示64位,win32表示32位。然后通过
pip install wordcloud下载到本地后的全路径
比如:
pip install C:\Users\Administrator\Desktop\wordcloud-1.6.0-cp37-cp37m-win_amd64.whl
安装wordcloud。
一个最简单的实例
# 导入 wordcloud 模块和 matplotlib 模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 读入一个txt文件
text = open('articles.txt', 'r').read()
# 生成WordCloud对象并调用其中的generate()方法生成词云,其中传的参数为词的来源
wordcloud = WordCloud().generate(text)
# 显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
# to_file()用来保存词云的方法
wordcloud.to_file('test.jpg')
效果如下
自定义词列表、词频
将词表定义为字典的形式
text_dict = {
'you': 2993,
'and': 6625,
'in': 2767,
'was': 2525,
'the': 7845,
}
将这个text_dict
传入相应的构造词云的generate_from_frequencies()
方法即可
WordCloud().generate_from_frequencies(text_dict)
完整代码如下
# 导入 wordcloud 模块和 matplotlib 模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 自定义词频字典
text_dict = {
'you': 2993,
'and': 6625,
'in': 2767,
'was': 2525,
'the': 7845,
}
# 传入test_dict生成词表
wordcloud = WordCloud().generate_from_frequencies(text_dict)
# 显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
# 保存图片
wordcloud.to_file('test.jpg')
中文词云
1. 字体
中文的话需要自行指定字体,wordcloud这个模块中并没有封装中文字体。可以用系统的字体,字体的位置在 C:\Windows\Fonts
下
在字体上右击可以查看字体的名称
在生成wordcloud时通过 font_path = 'C:/Windows/Fonts/STKAITI.TTF'
属性指定字体位置,也可以自行下载字体样式,同样通过该属性指定其位置即可。
2. 分词
英文原生就是分好了词了的,就是空格。中文的句子中没有空格,需要通过其他的方式来分出词,jieba
是一个用来做中文分词的模块。
text = open('4test.txt').read()
list_text = list(jieba.cut(text))
这样就从一篇文章中分出来了所有的词形成了一个词列表
一个完成的程序
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
from collections import Counter
# 读入词来源文件
text = open('4test.txt',encoding='utf-8',errors='ignore').read()
# 使用 jieba 分词
text_jieba = list(jieba.cut(text))
# 使用 counter 做词频统计,选取出现频率前 100 的词汇
c = Counter(text_jieba)
common_c = c.most_common(100)
# 配置词云参数
wc = WordCloud(
# 设置字体
font_path = 'C:/Windows/Fonts/STKAITI.TTF'
)
# 生成词云
wc.generate_from_frequencies(dict(common_c))
# 生成图片并显示
plt.figure()
plt.imshow(wc)
plt.axis('off')
plt.show()
# 保存图片
wc.to_file('test.jpg')
效果如下
可以看到它居然把标点符号也分出来了😂要去掉这些请看下面一节。
stopwords
stopwords(在有的教程中翻译成 停用词)的话就是一个词表,通过在生成wordcloud对象时通过stopwords
属性来指定,指定了这个词表后词云中将不会再显示stopwords中的词,可以用这个表去掉一些无意义的词。
from wordcloud import STOPWORDS
wordcloud = WordCloud(stopwords=STOPWORDS).generate(text)
在cloudword模块中封装了一套sotpwords,这个概念应该是从自然语言处理的领域来的吧,自然语言处理要把文本生成词向量,但是能想象其中有些词对于处理目的是没有意义的,在英文中诸如the、on、in、at…在中文中如“的”、“呢”、“了”之类的,这些需要从词库中去掉。stopwords就是就是这么一套此列表,我们在构造wordcloud时去掉停用词也是可以理解的。cloudwrod模块提供的停用词是英文的,类型是set,print出来如下所示
我们也可以自行构造这样一个停用词列表,也可以在它的基础上追加自行一的词。
中文的话去网上也能找到类似的词表关键词:中文停用词,中文stopwords
。
增加分辨率
通过设置scale
属性,值为float型,表示对图像放缩的倍数,默认值为1,指定比较高的值可以提高分辨率
WordCloud(scale=4).generate(text_dict).to_file('test.jpg')
通过其.to_file()的方法保存下来的才是高分辨率的图像,通过matplotlib.pyplot.imshow()不会发现分辨率的改变。
其他属性
还可以自定义词云图片的一些其他属性
查看它的源码可以发现其初始化函数中有如下一些属性。
def __init__(self, font_path=None, width=400, height=200, margin=2,
ranks_only=None, prefer_horizontal=.9, 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",
relative_scaling='auto', regexp=None, collocations=True,
colormap=None, normalize_plurals=True, contour_width=0,
contour_color='black', repeat=False,
include_numbers=False, min_word_length=0):
…
font_path=None, # 自定义字体的位置
width=400, # 画布宽度
height=200, # 画布长度
margin=2, # 边缘宽度,单位大概是像素
mask=None, # 指定图片蒙版对象,实现效果大概就是生成指定造型词云图像
scale=1, # 放缩图像,数值指图像放大的倍数,比较高的值可以增加 分辨率
max_words=200, # 最多可以显示的词的数量
min_font_size=4,# 最小的字体字号
stopwords=None, # 停用词列表,即在词云中不显示哪些词
random_state=None # int, or None,词的位置是随机生成的,如果指定一个定值,每次执行生成的词位置和颜色就是固定的。
background_color='black', # 词云的背景颜色
max_font_size=None, # 最大的字体字号
font_step=1, # 大概是两个规格/等级的词的字号差
relative_scaling='auto' # 字体大小与词频的相关度,默认是0.5,=0时按出现顺序显示大小,=1时词频比例设置字体比例
属性设置还可以参考 这里
还有
color_func
这个属性可以配置生成的词云的颜色。
报错
在参考网上的教程制作词云的时候,大多数人用scipy.misc.imread读取图片,会产生如下的报错
原因是在比较新的版本中(我这里scipy版本为1.4.1,好像是在1.2的版本中imread就已经弃用),其中的imread已弃用,找了很多替换方案都无法解决,最终在 这里 找到了解决方案,采用的是其中的方案2,用 from matplotlib.pyplot import imread
代替之,另外经验证方案1、方案3在我的环境中无法解决问题。