使用wordcloud绘制词云

背景

前面通过爬虫获取了猫眼上”流浪地球“的评论:获取猫眼电影的评论

那么就做一个酷炫的词云吧,直观的看看大家都在想什么,先上效果图:

wordcloud

思路

数据清洗

首先由于评论是用户发表的,可能什么字符都会有,要先把一些特殊符号去掉,这里就用到了正则替换:

1
msg = re.sub("[\s+\.\!\/_,$%^*()+\"\'\?]+|[+——!,。?、~@#¥%……&*()【】;:]+|\[.+\]|\[.+\]", "", line)

分词与标签

清洗后的数据,可以使用jieba分词包来进行分词,并把所有的分词保存在一个list中,然后计算出每个分词出现的次数。

1
2
3
4
5
6
7
8
9
10
# 分词
tags = jieba.analyse.extract_tags(msg)
for t in tags:
word_list.append(t)
# 计算词频
for word in word_list:
if word not in word_dict:
word_dict[word] = 1
else:
word_dict[word] += 1

生成词云

使用wordcloud包,就可以很方便的生成词云图片了。

先新建一个WordCloud对象,进行配置,然后利用前面的分词词频就可以生成对应的图片了。

1
2
3
4
5
6
7
8
# 计算图片颜色
alice_coloring = np.array(img)
my_wordcloud = WordCloud(background_color="white",
max_words=500, mask=alice_coloring,
max_font_size=200, random_state=42,
font_path=(os.path.join(d, "font/msyh.ttf")))

my_wordcloud = my_wordcloud.generate_from_frequencies(wordList)

这里需要注意的是:

  • mask=alice_coloring:这里通过numpy将图片矩阵化,来获取图片的颜色作为WordCloudmask,是为了最后生成的图云不仅外形与我们输入的图片保持一致,而且整体颜色也保持一致。
  • 输入的原图,背景色需要设置为白色而不是透明色,否则会全屏幕都是字。。。
  • 对于中文的词云,需要制定中文的字体,这里用的是微软雅黑

保存图片

最后使用matplotlib.pyplot来保存图片,保存前要进行图片属性的一些设置。

1
2
3
4
5
6
7
8
9
10
width = img.width/80
height = img.height/80
plt.figure(figsize=(width, height))
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
# 通过设置subplots_adjust来控制画面外边框
plt.subplots_adjust(bottom=.01, top=.99, left=.01, right=.99)
plt.savefig("jupiter_wordcloud_1.png")
plt.show()

这里需要注意的是:

  • 建议根据原图片的长宽比例进行一定的缩小,以免生成的图片像素过大而产生报错。

    1
    ValueError: Image size of 98400x46500 pixels is too large. It must be less than 2^16 in each direction.

结论

以上就是使用抓取的评论生成词云的大致思路,完成的实现代码请见:https://github.com/keejo125/web_scraping_and_data_analysis/tree/master/maoyan

最后放一张原图,你能看的出来嘛,抠图技术有限O(∩_∩)O哈哈~

jupiter