本想果断的说,卡卡西是火影里面最帅的人物。但是出于对大家的尊重,我把这句话改成:“卡卡西是动漫界最帅的人物”,不接受任何反驳。
在介绍之前,先给大家来个用香克斯图片做的效果图。
这是我用香克斯的图片作为轮廓,将《霍乱时期的爱情》作为文字素材做的一个词云。看起来还是有几分帅气的。主要使用到的模块有三个,wordcloud、jieba、imageio,其中wordcloud作为主要的模块,今天给大家详细讲解一个具体用法。
在wordcloud模块中,我们将会使用到两个对象。一个是WordCloud对象,也就是“词云”对象。第二个是ImageColorGenerator对象,也就是“图像颜色产生器”对象。具体的使用后续慢慢讲解。
在具体讲解之前,我们先说一下词云的生成步骤。
安装上面的步骤,我们写出如下代码:
import wordcloud
# 1、准备文本
sentence = 'Do not go gentle into that good night!'
# 2、创建词云对象
wc = wordcloud.WordCloud()
# 3、通过文本数据生成词云
wc.generate(sentence)
# 4、保存图片
wc.to_file("test_wc.png")
生成的词云如下:
当然,水印可不是我生成的。这个词云比较简单,而且正正方方,背景也是单调的黑色。这可不符合我高贵的身份,于是乎我们对词云进行一些改进。
下面列出了一下比较常用的参数:
参数 | 参数类型 | 参数介绍 |
---|---|---|
width | int(default=400) | 词云的宽 |
height | int(default=200) | 词云的高 |
background_color | color value(default=“black”) | 词云的背景颜色 |
font_path | string | 字体路径 |
mask | nd-array(default=None) | 图云背景图片 |
stopwords | set | 要屏蔽的词语 |
max_font_size | int(default=None) | 字体的最大大小 |
min_font_size | int(default=None) | 字体的最小大小 |
max_words | number(default=200) | 要显示词的最大个数 |
contour_width | int | 轮廓粗细 |
contour_color | color value | 轮廓颜色 |
scale | float(default=1) | 按照原先比例扩大的倍数 |
还有一些不常用的参数没有提到。
下面看几个WordCloud常用的方法,这里就讲三个:
方法名称 | 传入参数 | 方法描述 |
---|---|---|
generate | text | 根据文本生成词云 |
recolor | [random_state, color_func, colormap] | 对现有输出重新着色 |
to_file | filename | 输出到文件 |
在了解具体参数之后,我们就可以完成一个更为复杂的图云了。具体步骤比之前多了一步:
在写代码之前,先准备好一张图片。这里当然选取卡卡西了:
先把准备好的图片素材复制到项目目录下面,和执行的py文件同级(图片背景必须是透明或者全白,不能有其它杂色)。接下来我们开始写代码了:
import wordcloud, imageio
# 1、准备文本数据
sentence = "旗木卡卡西,日本漫画《火影忍者》及其衍生作品中的男性角色。火之国木叶隐村的精英上忍,原木叶暗部成员,四代目火影波风水门的弟子,第七班队长,漩涡鸣人、宇智波佐助、春野樱的老师。年仅12岁就成为上忍的天才忍者,后左眼移植宇智波带土的写轮眼,因使用写轮眼复制了上千种忍术而被称为“拷贝忍者”、“写轮眼卡卡西”,其名号响彻各国。"
# 2、生成图片的nd-array,传入图片路径
im = imageio.imread('kkx.png')
# 3、创建词云对象
wc = wordcloud.WordCloud(
#设置宽为600
width=600,
#设置高为800
height=800,
#设置背景颜色
background_color='white',
#设置字体,如果文本数据是中文一定要设置,不然就是方块
font_path='msyh.ttc',
#设置图片的形状
mask=im,
#设置轮廓粗细
contour_width=1,
#设置轮廓颜色
contour_color='black'
)
# 4、通过文本数据生成词云
wc.generate(sentence)
# 5、保存词云文件
wc.to_file('wc.png')
生成词云效果如下:
不得不说,效果确实不尽人意,没有轮廓完全看不出这是什么东西。仔细观察会发现,这里的词全是一大段一大段的,还有很多句子。所有导致词云密度受到很大影响。我们可以继续对这个词云进行美化,这就需要用到分词模块jieba。
jieba模块的功能就是对句子进行词语提取,我们调用jieba.cut()方法,然后生成一个可迭代的generator对象,具体是什么我也不知道。在实验过程中,我发现这个对象应该是个迭代器。因为使用的不是非常多,这里就讲解一个非常简单的例子:
import jieba
# 准备要分词的句子
sentence = '爱因斯坦是最伟大的科学家之一'
# 使用精确模式分词
word = jieba.cut(sentence)
# 将返回的generator用空格拼接成字符串
str = " ".join(word)
# 输出分词后的结果
print(str)
输出结果为:
爱因斯坦 是 最 伟大 的 科学家 之一
我们刚刚使用的是默认的精确模式,除此之外还有许多其它模式,这里不做讲解,如果想对jieba模块深入了解可以访问其项目地址 https://github.com/fxsjy/jieba 。
我们只需要通过我们的jieba,将相应的文本转成一个个词。然后我们有了所以需要的数据,接下来就按照上面的步骤,生成一个由词语组成的词云:
import wordcloud, imageio, jieba
# 1、准备文本数据
sentence = "旗木卡卡西,日本漫画《火影忍者》及其衍生作品中的男性角色。火之国木叶隐村的精英上忍,原木叶暗部成员,四代目火影波风水门的弟子,第七班队长,漩涡鸣人、宇智波佐助、春野樱的老师。年仅12岁就成为上忍的天才忍者,后左眼移植宇智波带土的写轮眼,因使用写轮眼复制了上千种忍术而被称为“拷贝忍者”、“写轮眼卡卡西”,其名号响彻各国。"
# 用jieba将句子分词
word = jieba.cut(sentence)
words = " ".join(word)
# 2、生成图片的nd-array,传入图片路径
im = imageio.imread('kkx.png')
# 3、创建词云对象
wc = wordcloud.WordCloud(width=600,height=800,background_color='white',font_path='msyh.ttc', mask=im,contour_width=1,contour_color='black')
# 4、通过文本数据生成词云
wc.generate(words)
# 5、保存词云文件
wc.to_file('wc.png')
这次就比之前更加紧密了。效果图如下:
但是这个还是感觉少了几分神色,其原因在于我们生成的词云文字颜色是随机的,而最开始给大家看的案例其颜色使按照图片原本的颜色给相应区域的文字设置相应的颜色。
大招步骤还是一样的,正如我标题所说的。我是要绘制一个卡卡西的忍术词云,因此我准备了一个文件旗木卡卡西.txt。具体其内容就是卡卡西的忍术合集。这次我们的大致步骤和之前差不多,只是把准备文本数据从之前的string改成了txt文件。
import wordcloud, jieba, imageio
# 1、准备文本
f = open('kkx.txt', encoding='utf-8')
kkx = f.read()
kkx = jieba.cut(kkx)
kkx = " ".join(kkx)
# 2、生成图片的nd-array,传入图片路径
im = imageio.imread('kkx.png')
# 3、获取一个图形颜色生成器
image_color = wordcloud.ImageColorGenerator(im)
# 4、创建词云对象
wc = wordcloud.WordCloud(
width=600,
height=800,
background_color='white',
font_path='msyh.ttc',
mask=im,
stopwords={'之术'},
contour_width=1,
contour_color='black',
)# 5、根据文本生成词云
wc.generate(kkx)
# 根据图片颜色重绘
rwc = wc.recolor(color_func=image_color)
rwc.to_file('qmkkx.png')
其代码主要有两个部分,一个是使用wordcloud.ImageColorGenerator() 获取图片颜色生成器,另外就是WordCloud中的recolor() 方法重绘词云。效果图如下:
其中第一张是上面代码生成的词云,但是因为密度有点低,我另外用其它文本生成了一个词云作为观看使用。就此我们就完成了卡卡西词云的绘制。