Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


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_htmlto_image等等,具体可以查阅API文档。

显示图像效果如下:

wordcloud1

词云的功能当然不仅仅是如此,如上只是一个最基本的展示,让我们做一些丰富的代码改动看看更强大的效果吧。

Cinderella_WordCloud_pic

如下就是改动后的代码,一起来让我们拆分理解看下。因为,为了便于展示,在此示例中我用了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

最近的文章

Python之jieba中文分词库

jieba分词是Python中目前最受欢迎的中文分词库,他有许多特点,为了便于介绍直接引用官方介绍如下。 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可…

Python, 技术博文详细阅读
更早的文章

pandas中map和applymap及apply的区别

在pandas中,针对于行或者列又或者是每个元素的操作很容易让人混淆,下面我们来看看分别对应的几个函数区别。 apply() apply()是pandas里DataFrame的函数,可以针对DataF…

Python, 技术博文详细阅读
comments powered by Disqus