我:小哥哥,听你上次说的jieba分词可以做词云图,词云图到底是什么鸭?
惨绿青年:“词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。”——《百度百科》。下面是一张三大运营商年报的词云图。
我:原来是酱紫。教教我做呗¯ω¯?
惨绿青年:做词云图可以大致分为三个步骤,第一步是收集数据,第二步是处理数据,第三步是制作词云图。这次教你做一个网易云歌曲评论的词云图吧。
收集数据惨绿青年:数据可以使用爬虫来收集,这次为了方便,我从网上找了个api去获取数据。我:api是啥鸭?惨绿青年:api就是应用程序编程接口,通过向该接口发送请求可以获取数据。类似向服务器发送请求去获取网页。我:好像有点懂了。惨绿青年:就像爬取网页一样使用requests库获取数据。
#导入requests库,该库是第三方库,需要自行下载
import requests
#定义url,limit表示每次取的数量,offset表示从第几个开始取
url = 'https://music.163.com/api/v1/resource/comments/R_SO_4_26620756?limit=100&offset={}'
#定义headers防反爬措施
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#定义列表来存放评论数据
comments = []
#通过循环获取数据
for i in range(0, 114000, 100):
res = requests.get(url.format(i), headers=headers).json()
for comment in res.get('comments'):
comments.append(comment.get('content'))
处理数据惨绿青年:数据收集好后就要进行处理。因为评论里面有些是表情,显示成文字的时候是“[爱心]”这样的,所以要用re库去清除掉。然后再用jieba库去切分评论获取词语。
#导入re库
import re
#导入jieba库,该库是第三方库,需要自行下载
import jieba
#清除表情文字
comments = [re.sub('(\[.*?\])', '', comment) for comment in comments]
#使用jieba库切分评论获取长度大于1的词语
cut = [word for comment in comments for word in jieba.cut(comment) if len(word) > 1]
制作词云图
惨绿青年:接下来教你两种词云图的制作方法。一种是普通词云图,另一种是根据图片生成的词云图。
惨绿青年:词云图首先需要生成一个词云对象,然后对这个对象进行操作去生成词云图。下面是生成普通词云图的方法。
#从wordcloud库导入WordCloud,该库是第三方库,需要自行下载
from wordcloud import WordCloud
#定义词云的字体,制作中文词云图时必须选择中文的字体
font = r'C:\Windows\Fonts\simsun.ttc'
#创建一个词云对象
wc = WordCloud(font_path=font)
#调用generate()生成词云,该方法接收的是字符串参数,用空格把词语拼接起来后传进去
wc.generate(' '.join(cut))
#调用to_image()把词云对象转化成图片
wc_img = wc.to_image()
#调用show()把图片展示出来
wc_img.show()
生成词云的参数
结果
惨绿青年:根据图片生成词语图需要多一点操作,就是把图片对象作为词云的模板。
#导入imageio库的imread模块
from imageio import imread
#打开图片文件作为模板
mask = imread(r'C:\Users\MyPC\Desktop\heart.jfif', pilmode='RGB')
#用模板生成词云对象
wc = WordCloud(font_path=font, height=912, width=912, mask=mask, background_color='white')
#调用generate()生成词云,该方法接收的是字符串参数,用空格把词语拼接起来后传进去
wc.generate(' '.join(cut))
#调用to_image()把词云对象转化成图片
wc_img = wc.to_image()
#调用show()把图片展示出来
wc_img.show()
根据图片生成的词云图
惨绿青年:若想要根据图片的颜色去生成,需要在生成词云的时候传入参数或者使用recolor()重新设置。
#从wordcloud导入ImageColorGenerator
from wordcloud import ImageColorGenerator
#打开图片文件作为模板
mask = imread(r'C:\Users\MyPC\Desktop\heart.jfif', pilmode='RGB')
#用模板生成词云对象
wc = WordCloud(font_path=font, height=912, width=912, mask=mask, background_color='white')
#调用generate()生成词云,该方法接收的是字符串参数,用空格把词语拼接起来后传进去
wc.generate(' '.join(cut))
#用图片生成ImageColorGenerator对象
image_colors = ImageColorGenerator(mask)
#重新设置词云的颜色
wc.recolor(color_func=image_colors)
#调用to_image()把词云对象转化成图片
wc_img = wc.to_image()
#调用show()把图片展示出来
wc_img.show()
惨绿青年:此外,还可以通过词语的频率去生成词云图。出现频率高的词语字体会相对大一点。这里利用pandas库去统计每个词出现的次数并把结果转化为字典。
#导入pandas库,该库是第三方库,需要自行下载
import pandas as pd
#将切分好的词语转化为Series对象
ser = pd.Series(cut)
#使用value_counts()获取统计数据再用to_dict()转化为字典
res_dic = ser.value_counts().to_dict()
#打开图片文件作为模板
mask = imread(r'C:\Users\MyPC\Desktop\leslie.jfif', pilmode='RGB')
#用模板生成词云对象
wc = WordCloud(height=912, width=912, font_path=font, max_font_size=200, mask=mask)
#使用generate_from_frequencies()根据词语的频率生成词云图
wc.generate_from_frequencies(res_dic)
#调用to_image()把词云对象转化成图片
wc_img = wc.to_image()
#调用show()把图片展示出来
wc_img.show()
惨绿青年:若想保存为文件,可使用wc_img.save('图片名')。你可以尝试调整不同的参数,过滤不想要的词语,做出自己喜欢的词云图。
我:嗯嗯。学到了~
总结:
1.制作词云图步骤:收集数据→处理数据→制作词云图。2.普通词云图:创建词云对象后使用generate(),传入字符串。3.根据图片生成词云图:使用imageio模块的imread打开图片文件,将文件对象传入WordCloud()内。
4.根据词频生成词云图:创建词云对象后使用generate_from_frequencies(),传入键为字符串、值为数字的字典。