惨绿青年:“词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就能够领略文本的主旨。”——《百度百科》。下面是一张三大运营商年报的词云图。编程
我:原来是酱紫。教教我作呗¯ω¯?json
惨绿青年:作词云图能够大体分为三个步骤,第一步是收集数据,第二步是处理数据,第三步是制做词云图。此次教你作一个网易云歌曲评论的词云图吧。api
收集数据惨绿青年:数据可使用爬虫来收集,此次为了方便,我从网上找了个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库去切分评论获取词语。app
#导入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]
制做词云图ide
惨绿青年:接下来教你两种词云图的制做方法。一种是普通词云图,另外一种是根据图片生成的词云图。字体
惨绿青年:词云图首先须要生成一个词云对象,而后对这个对象进行操做去生成词云图。下面是生成普通词云图的方法。url
#从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()
生成词云的参数
spa
结果
3d
惨绿青年:根据图片生成词语图须要多一点操做,就是把图片对象做为词云的模板。
#导入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导入ImageColorGeneratorfrom 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(),传入键为字符串、值为数字的字典。