wordcloud、imageio、jieba与matplotlib
安装命令如:pip install wordcloud
# 导入词云制作第三方库wordcloud
import wordcloud
# 创建词云对象,赋值给w,现在w就表示了一个词云对象
w = wordcloud.WordCloud()
# 调用词云对象的generate方法,将文本传入
w.generate('and that government of the people, by the people, for the people, shall not perish from the earth.')
# 将生成的词云保存为output1.png图片文件,保存出到当前文件夹中
w.to_file('output1.png')
运行完成之后,在代码所在的文件夹,就会出现output1.png图片文件。可以看出,wordcloud自动将and that by the not from等废话词组过滤掉,并且把出现次数最多的people大号显示。wordcloud库会非常智能地按空格进行分词及词频统计,出现次数多的词就大。
import wordcloud
# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,
height=700,
background_color='white',
font_path='msyh.ttc')
w.generate('从明天起,做一个幸福的人。喂马、劈柴,周游世界。从明天起,关心粮食和蔬菜。我有一所房子,面朝大海,春暖花开')
w.to_file('output2.png')
width:词云图片宽度,默认400像素;
height:词云图片高度,默认200像素;
background_color:词云图片的背景颜色,默认为黑色;
font_step:字号增大的步进间隔,默认1号;
font_path:指定字体路径 默认None,对于中文可用font_path='msyh.ttc';
mini_font_size:最小字号,默认4号;
max_font_size:最大字号,根据高度自动调节;
max_words:最大词数,默认200;
stopwords:不显示的词语,stop_words={'曹操','孔明'};
scale:默认值1,值越大,图像密度越大越清晰;
prefer_horizontal:默认值0.90,浮点数类型。表示在水平如果不合适,就旋转为垂直方向,水平放置的词数占0.9;
relative_scaling:默认值0.5,浮点型。设定按词频倒序排列,上一个词相对下一位词的大小倍数。有如下取值:“0”表示大小标准只参考频率排名,“1”如果词频是2倍,大小也是2倍;
mask 指定词云形状图片,默认为矩形。
# 也就是说,我们可以这样来构建词云对象w,其中的参数均为常用参数的默认值,供我们自定义:
w = wordcloud.WordCloud(
width=400,
height=200,
background_color='black',
font_path=None,
font_step=1,
min_font_size=4,
max_font_size=None,
max_words=200,
stopwords={},
scale=1,
prefer_horizontal=0.9,
relative_scaling=0.5,
mask=None)
import wordcloud
# 从外部.txt文件中读取大段文本,存入变量txt中
f = open('马克思主义.txt')
txt = f.read()
# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,
height=700,
background_color='white',
font_path='msyh.ttc')
# 将txt变量传入w的generate()方法,给词云输入文字
w.generate(txt)
# 将词云图片导出到当前文件夹
w.to_file('output3.png')
jieba
import jieba
textlist = jieba.lcut('动力学和电磁学')
string = " ".join(textlist)
print(textlist)
print(string)
['动力学', '和', '电磁学'] 动力学 和 电磁学
以上代码将一句完整的中文字符串转换成了以空格分隔的词组成的字符串,而后者是绘制词云时generate()方法要求传入的参数。
精确模式(最常用,只会这个就行)
:每个字只用一遍,不存在冗余词汇。jieba.lcut('动力学和电磁学')
全模式
:把每个字可能形成的词汇都提取出来,存在冗余。jieba.lcut('动力学和电磁学',cut_all=True)
搜索引擎模式
:将全模式分词的结果从短到长排列好。jieba.lcut_for_search('动力学和电磁学')
以下命令演示了三种分词模式及结果,精确模式是最常用的。
import jieba
textlist1 = jieba.lcut('动力学和电磁学')
textlist2 = jieba.lcut('动力学和电磁学',cut_all=True)
textlist3 = jieba.lcut_for_search('动力学和电磁学')
print(textlist1)
print(textlist2)
print(textlist3)
['动力学', '和', '电磁学'] ['动力', '动力学', '力学', '和', '电磁', '电磁学', '磁学'] ['动力', '力学', '动力学', '和', '电磁', '磁学', '电磁学']
# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud
# 构建并配置词云对象w
w = wordcloud.WordCloud(width=1000,
height=700,
background_color='white',
font_path='msyh.ttc')
# 调用jieba的lcut()方法对原始文本进行中文分词,得到string
txt = '同济大学(Tongji University),简称“同济”,是中华人民共和国教育部直属,由教育部、国家海洋局和上海市共建的全国重点大学,历史悠久、声誉卓著,是国家“双一流”、“211工程”、“985工程”重点建设高校,也是收生标准最严格的中国大学之一'
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)
# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)
# 将词云图片导出到当前文件夹
w.to_file('output4.png')
通过以下代码读入外部词云形状图片(需要先pip install imageio
安装imageio)
import imageio
mk = imageio.imread("picture.png")
w = wordcloud.WordCloud(mask=mk)
中国地图原图:
加scale参数为15的效果:
不加scale参数的效果,稍显模糊:
# 导入词云制作库wordcloud
import wordcloud
# 将外部文件包含的文本保存在string变量中
string = open('hamlet.txt').read()
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("alice.png")
# 构建词云对象w,注意增加参数contour_width和contour_color设置轮廓宽度和颜色
w = wordcloud.WordCloud(background_color="white",
mask=mk,
contour_width=1,
contour_color='steelblue')
# # 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)
# 将词云图片导出到当前文件夹
w.to_file('output6.png')
原图:
效果图:
# 导入绘图库matplotlib和词云制作库wordcloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
# 将外部文件包含的文本保存在text变量中
text = open('alice.txt').read()
# 导入imageio库中的imread函数,并用这个函数读取本地图片alice_color.png,作为词云形状图片
import imageio
mk = imageio.imread("alice_color.png")
# 构建词云对象w
wc = WordCloud(background_color="white",
mask=mk,)
# 将text字符串变量传入w的generate()方法,给词云输入文字
wc.generate(text)
# 调用wordcloud库中的ImageColorGenerator()函数,提取模板图片各部分的颜色
image_colors = ImageColorGenerator(mk)
# 显示原生词云图、按模板图片颜色的词云图和模板图片,按左、中、右显示
fig, axes = plt.subplots(1, 3)
# 最左边的图片显示原生词云图
axes[0].imshow(wc)
# 中间的图片显示按模板图片颜色生成的词云图,采用双线性插值的方法显示颜色
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# 右边的图片显示模板图片
axes[2].imshow(mk, cmap=plt.cm.gray)
for ax in axes:
ax.set_axis_off()
plt.show()
# 给词云对象按模板图片的颜色重新上色
wc_color = wc.recolor(color_func=image_colors)
# 将词云图片导出到当前文件夹
wc_color.to_file('output7.png')
按模板颜色生成的词云图: