Python之WordCloud词云库
WordCloud(词云)是Python中一个非常优秀的第三方词云展示库,WordCloud以词语为基本单位,根据你给出的字符串,对词频进行统计,然后以不同的大小显示出来。说的直接点就是它可以更加直观和艺术的实现词频的可视化。
首先,逻辑上来说,生成一个漂亮的词云文件主要以如下3个过程来完成:
配置对象参数
加载词云文本
输出词云文件 (如果不加说明默认的图片大小为400 * 200)
我们看下代码实例:
from pathlib import Path
from wordcloud import WordCloud
# 读取文本内容
current_directory = Path.cwd()
text = Path.open(current_directory/"Cinderella.txt").read()
# 创建词云实例对象
wordcloud = WordCloud()
# 加载文本内容到词云对象中。
wordcloud.generate(text)
# 将图像以定义的图像文件名输出。
wordcloud.to_file('Cinderella_WordCloud_pic.png')
这是一个最简单的词云生成的实例,几乎没多少代码。在我们的例子中,我们创建了词云实例对象wordcloud
,然后用这个对象的generate()
方法把提前设置好的文本内容加载进来并且生成出词云来。当词云生成完成后,最后我们用to_file()
方法把图像文件输出了出来,当然还有类似很多输出方法,比如to_html
、to_image
等等,具体可以查阅API文档。
显示图像效果如下:
词云的功能当然不仅仅是如此,如上只是一个最基本的展示,让我们做一些丰富的代码改动看看更强大的效果吧。
如下就是改动后的代码,一起来让我们拆分理解看下。因为,为了便于展示,在此示例中我用了matplotlib会图库来直观展示,所以代码的最后显示也是基于配合matplotlib绘图做的配置。
这里面主要改动的几点:
第13行代码处,我们增加了轮廓模型,就是要提现准备好一个轮廓样式图(如上图的右侧灰姑娘
样式图),先读取图片,最后用numpy来转成numpy类型的数组。
第16行代码处,配置了一些基本的词云实例对象参数,更多参数可以查阅官方API。
第22行代码处,使用词云的ImageColorGenerator类方法来提取基于原图的图像颜色信息。
第27行代码处,使用词云的wordcloud.recolor()方法传入之前提取的图像信息,为了使生成的词云颜色配色按照原图的配色比例搭配 (官方文档提到,用此方法生成的词云颜色速度会相当快。如果不设置,默认词云会匹配其它颜色方案。)
from pathlib import Path
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from wordcloud import WordCloud, ImageColorGenerator, STOPWORDS
# 读取文本内容
current_directory = Path.cwd()
text = Path.open(current_directory/"Cinderella.txt").read()
### 参数配置 ###
# 增加词云轮廓模板
cinderella_mask = np.array(Image.open(current_directory/"cinderella_template.png"))
# 创建词云实例对象,并配置参数(stopwords禁用词参数,mask设置轮廓模板)
wordcloud = WordCloud(background_color = 'white', mask = cinderella_mask,
max_words = 500, width = 600, height = 300, stopwords = STOPWORDS)
# 加载文本内容到词云对象中。
wordcloud.generate(text)
# 用ImageColorGenerator类方法基于图像模板生成颜色
image_colors = ImageColorGenerator(cinderella_mask)
plt.figure(figsize = (16, 8))
# 添加左侧 词云图 子图图像区域。
plt.subplot(121)
# 以常规2D光栅的方式显示图像,其中interpolation参数代表以哪种模糊程度显示。
plt.imshow(wordcloud.recolor(color_func = image_colors), interpolation = 'bilinear')
# 关闭matplotlib图像的轴线和标签。
plt.axis('off')
# 添加右侧 原始对比图 子图图像区域。
plt.subplot(122)
plt.imshow(cinderella_mask, cmap=plt.cm.gray, interpolation="bilinear")
plt.axis('off')
# 将图像以定义的图像文件名输出。
plt.savefig('Cinderella_WordCloud_pic.png')
plt.show()
当然,WordCloud还可以更进一步修改,还可以增加以中文字体内容的词云效果,但是如果要使用中文字体,WordCloud还不足以能胜任,必须要搭配另一个库叫jieba,jieba是一个很优秀的中文分词库,搭配Jieba处理后的中文分词后,再用WordCloud词云可以很好的做出基于中文内容的词云效果。
更详细的用法和更新动态详见:http://amueller.github.io/word_cloud/index.html