本文将介绍如何用python生成个性化词云,对其进行样式设置,并使用自定义形状。
文字云是文本可视化的一种有效方式。从一堆文本中,你可以一眼看到哪些词是占主导地位的词,这既有趣又能产生吸引眼球的视觉效果。本文将介绍如何使用名为wordCloud的python模块生成单词云。首先从一个简单的字云开始,然后显示一些定制和酷的形状。
本文将使用来自Kaggle的数据集。下载资料集网址:https://www.kaggle.com/christopheiv/winemagdata130k
Kaggle
这里介绍一下kaggle网站,Kaggle是由联合创始人、首席执行官安东尼·高德布卢姆(Anthony Goldbloom)2010年在墨尔本创立的,主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台。该平台已经吸引了80万名数据科学家的关注,这些用户资源或许正是吸引谷歌的主要因素。
通俗的说,Kaggle上面有着各种高质量的数据集,并且基于这些数据集会有一些大的公司进行赞助,来举办一些算法的竞赛,在竞赛时还可通过社区进行讨论(包括比赛中的分享、答疑,和比赛后的top solution分享)。这样就使得全球的顶尖高手会对参加比赛产生兴趣,因为收获到的不仅有奖金还有名气。同时kaggle对萌新也很友好,在社区中可以学到很多的知识和解决方案(top solution)。本文中,我们所使用的数据集就从这里下载。
接下来将介绍如何使用python生成个性化词云。
最关键的使用WordCloud模块,要使用WordCloud模块,需要先进行安装。这可以通过使用pipinstall命令来完成:
pip install wordcloud
除此之外,还要用到的库和环境有:
1.Numpy Library
2.Pandas Library
3.Matplotlib Library
4.Pillow Imaginglibrary
5.Jupyter Notebook environment
最简单的版本非常容易构建。首先导入必要的包和数据集。
import numpy as np
import pandas as pd
from os import path
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGeneratorimport matplotlib.pyplot as plt
%matplotlib inlinedf = pd.read_csv("winemag-data-130k-v2.csv", index_col=0)
如下图,该数据集描述了不同国家的葡萄酒以及其他一些信息。
但是对于本教程,我们将只关注Description列,因为它包含了大量的文本。
text = " ".join(review for review in df.description)
print ("There are {} words in the combination of all review.".format(len(text)))
输出:
There are 31661073 words in the combination of all review.
共有31661073个单词
下面是生成最简单单词云的代码片段。
wordcl = WordCloud().generate(text)
plt.imshow(wordcl, interpolation='bilinear')
plt.axis('off')
plt.show()
最基本的词云完成了!单词越大越粗,它出现在文本中的频率就越高。
接下来将使用更多的样式参数
background_color: :更改默认的黑色背景
max_type_size:在上面的示例中,可以看到有些单词非常大。可以控制一下单词的最大尺寸。
Max_words:根据出现的频率,它将显示单词云中指定的单词数。
使用上面的所有参数,变成彩色,再次创建词云:
接下来将使用自定义形状,而不是矩形形状,可以导入一张图片作为词云的形状。
mask = np.array(Image.open("img/w_wine.png"))
wc = WordCloud(background_color='black', mask=mask, mode='RGB',
width=1000, max_words=200, height=1000,
random_state=1)
wc.generate(text)
plt.figure(figsize=(10, 10))
plt.imshow(wc, interpolation='bilinear')
plt.tight_layout(pad=0)
plt.axis('off')
plt.show()
效果图为:
为了获得更好的效果,可以尝试将单词都变成白色,背景为黑色。
wc = WordCloud(background_color='black', mask=mask, mode='RGB',
color_func=lambda *args, **kwargs: "white",
width=1000, max_words=200, height=1000,
random_state=1)
wc.generate(text)
plt.figure(figsize=(10, 10))
plt.imshow(wc, interpolation='bilinear')
plt.tight_layout(pad=0)
plt.axis('off')
plt.show()
为了获得更精确的形状,让边界更明显,可以将边界描绘出来。
wc = WordCloud(background_color='white', mask=mask, mode='RGB',
width=1000, max_words=1000, height=1000,
random_state=1, contour_width=1, contour_color='steelblue')
wc.generate(text)
plt.figure(figsize=(10, 10))
plt.imshow(wc, interpolation='bilinear')
plt.tight_layout(pad=0)
plt.axis('off')
plt.show()
这是最终的效果图与原图的对比,可以看到,图片为一个女人拿起酒杯在喝酒,里面填充了许多与酒相关的单词(文字库来自kaggle的数据集)。让一人一眼便看出了这幅图片的主题。
除了使用python代码生成个性化词云,网络上还有许多现成的软件可以用于快速生成个性化词云。如,Tagxedo
但是仍然需要收集与主题相关的语料,和个性化图片(如果会使用ps抠图的话将非常方便)。