我:小哥哥,听你上次说的jieba分词可以做词云图,词云图到底是什么鸭?
惨绿青年:“词云图过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。”——《百度百科》。下面是一张三大运营商年报的词云图。
我:原来是酱紫。教教我做呗ˉωˉ?
惨绿青年:做词云图可以大致分为三个步骤,第一步是收集数据,第二步是处理数据,第三步是制作词云图。这次教你做一个网易云歌曲评论的词云图吧。
收集数据惨绿青年:数据可以使用爬虫来收集,这次为了方便,我从网上找了个api去获取数据。我:api是啥鸭?惨绿青年:api就是应用程序编程接口,通过向该接口发送请求可以获取数据。类似向服务器发送请求去获取网页。我:好像有点懂了。惨绿青年:就像爬取网页一样使用requests库获取数据。
#导入requests库,该库是第三方库,需要自行下载 import?requests #定义url,limit表示每次取的数量,offset表示从第几个开始取 url?=?'https://music.163测试数据/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(),传入键为字符串、值为数字的字典。
查看更多关于无需要太多,只需要一张Python词云图的详细内容...