Python实现「碟中谍」5W条评论可视化!果然还是烧脑大戏!

Python实现「碟中谍」5W条评论可视化!果然还是烧脑大戏!,第1张

概述 进群:548377875 即可获取数十套PDF哦!项目介绍本篇文章会针对用户在猫眼上对于「碟中谍6」的评论进行一个可视化分析,我们总共采集了44872条用户评论,文章内容包括:

进群:548377875   即可获取数十套pdf哦!

项目介绍

本篇文章会针对用户在猫眼上对于「碟中谍6」的评论进行一个可视化分析,我们总共采集了44872条用户评论,文章内容包括:

用户评分分布; 产生评论时间分布⌚️⌚️; 评论用户地理位置分布热点图; 词频统计; 绘制词云图☁️☁️;

数据背景

数据采集可以参考我上一篇文章Python爬取猫眼「碟中谍」全部评论,我们获取了用户评论时间,用户昵称,用户评分,所在城市和评论内容五个字段总计44872条数据。

数据清洗

在上一篇文章中,我是将评论数据写入txt,然后不同字段使用「|」分开,但是在实际使用过程中,我们发现还是有些评论只保存下了评论内容,其他字段全部都没保存下来,所以在读取数据处理的时候需要注意下。

  我这边是使用DataFrame将数据读入内存,代码如下:
import pandas as pdwith open('comment.txt','r') as f: comment = f.read()comment_List = comment.split('')print '>>>累计评论数:%s'%len(comment_List)data = []temp = ['','','']for comment in comment_List: comment = comment.split('|') if len(comment) == 1: temp[4] = comment[0] comment = temp data.append(comment) elif len(comment) != 5: pass else: data.append(comment)data = pd.DataFrame(data,columns = ['时间','昵称','城市','评分','内容'])print data.head()

评分分布

目前「碟中谍6」在猫眼上评分为9.1,在评论中用户的评分是「0-5」个,半个为一级,其实也就刚好对应了「1-10」分,我们来看下在这4.8W评论中评分是怎样分布的:
temp = data[data['评分'] != ''].groupby('评分')['昵称'].count().reset_index()temp.columns = ['评分','数量']PIE = pyecharts.PIE('「碟中谍」评分分布','统计时间:2018-9-6')PIE.add("",temp['评分'],temp['数量'],radius=[30,75],rosetype='radius',is_legend_show=False,is_label_show=True)PIE

56%的观众给出了5的评价,超过四分之三的用户给出了4.5,换算成10分制就是9分以上占了75%以上,看来大部分观众对于阿汤哥这次表现还是相当认可的;

时间分布

我选取了上映后一周的时间,来看看评论都是集中在什么时间产生吧:
data['日期'] = data['时间'].str[0:10]data['小时'] = data['时间'].str[11:13]temp = data[(data['时间'] >= '2018-08-31 00:00:00')& (data['时间'] <= '2018-09-07 00:00:00')].groupby(['小时','日期'])['昵称'].count().reset_index()temp.columns = ['小时','日期','数量']date = ['2018-08-31','2018-09-01','2018-09-02','2018-09-03','2018-09-04','2018-09-05','2018-09-06']temp['小时'] = temp['小时'].astype('int')temp['日期'] = temp['日期'].replace({'2018-08-31':0,'2018-09-01':1,'2018-09-02':2,'2018-09-03':3,'2018-09-04':4,'2018-09-05':5,'2018-09-06':6})temp = temp.values.toList()hour = range(24)HeatMap = pyecharts.HeatMap('评论-时间分布','统计时间:2018-09-06')HeatMap.add("评论数量",hour,date,temp,is_visualmap=True,visual_range=[0,700],is_legend_show = False,visual_text_color="#000",visual_orIEnt='vertical',visual_pos="right")HeatMap

8/31为上映的第一天,9/1-9/2是周末,我们可以看到大部分人都一样,都习惯晚上去看电影,为什么都不喜欢上午去看电影呢? 在8/31那天我们可以很容易找到那波看首映的人,0点开始,2点发评论~ 随着时间推移,我们也能看到热度也是在悄悄下降;

地理分布

使用过Pyecharts画GEO地理坐标图的同学应该都知道,pyecharts的位置信息都是基于他们本地的一个地理Json数据,但我们在实际使用过程中,其实很难满足我们的需求,很多地名都没有位置信息,如果一个个自己添加,也是个麻烦事,这边给各位介绍一个解决办法: 一般的地图服务商都会有可供调用的端口,既然Echarts是百度的产品,我们这次也就使用百度地图的API来处理地理数据好了。访问百度地图开放平台申请一个key,选择浏览器端使用,具体可以参考网站介绍; 获取到key之后我们通过访问链接http://API.map.baIDu.com/geocoder?address=位置&output=Json&key=申请到的key就能获取到经纬度信息了。

  接下来就是写个循环将你的地理信息传过去,获取到信息之后保存下来就ok了,比自己一个个手动添加是不是有效率多了~

代码

import requestsfrom tqdm import tqdmdata['城市'][data['城市'] == '伊犁'] = '伊犁哈萨克自治州'temp = data[data['城市'] != ''].groupby('城市')['昵称'].count().reset_index()temp.columns = ['城市','数量']headers = {'User-Agent': "Mozilla/5.0 (iPhone; cpu iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML,like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}key = '申请的KEY 'dic = {}city_List = List(set(temp['城市']))for city in tqdm(city_List): url = 'http://API.map.baIDu.com/geocoder/v2/?address=%s&output=Json&ak=%s'%(city,key) response = requests.get(url) position = response.Json() positin_List = [] if position['status'] == 0: positin_List.append(position['result']['location']['lng']) positin_List.append(position['result']['location']['lat']) dic[city] = positin_List else: pass
在上面获取到城市到经纬度之后,通过geo_citIEs_coords传入我们的字典,就能顺利作出我们到GEO地理坐标图了。
Geo = pyecharts.Geo("评论城市分布","来源:kaggle",Title_color="#fff",Title_pos="center",wIDth=800,height=600,background_color='#404a59')Geo.add("",temp['城市'],1000],type='heatmap',visual_text_color="#fff",geo_citIEs_coords = dic)Geo

image.png

没啥惊喜,没啥意外,只要是消费类指标,热点图永远是这个样子,永远的北京/珠三角/长三角。

词频统计

接受上次评论中建议,这次分词的时候加入了一些停用词,我们看下在这4W多条评论中,用户说的最多的是什么呢?
from jIEba import posseg as psgimport collectionsstring = ''.join(data['内容'][data['内容'] <> ''])word_List = []stop_words = ['就是','这是','但是','虽然','一部','觉得','还是','没有']words = psg.cut(string)for x in words: if x.flag == 'x': pass elif len(x.word) == 1: pass elif x.word.encode('utf-8') in stop_words: pass else: word_List.append(x.word)c = collections.Counter(word_List)attr = []value = []for x in c.most_common(10): attr.append(x[0]) value.append(x[1])bar = pyecharts.bar("评论中出现频率最高的10个词","统计时间:2018-09-06")bar.add("出现次数",attr,value,mark_point=['max'],is_legend_show = False)bar

我们统计了前10的单词,可以看到,基本都是积极的,排名第一的词是「好看」,出现了1.2W次,没有那么多花里胡哨的表达,就是简单的「好看❗️❗️」 第四的单词「刺激」,其实我看完整部电影之后也是这个感觉,全程都像打了肾上腺素一样,阿汤哥真的太拼了~ 其实在我刚刚写的时候我想起来了一个问题,因为避免「了/的/啊」这种词,我在统计的时候去掉了单个的词语,这波 *** 作应该也误杀了「帅」

词云

最后词云部分:
import imageiofrom wordcloud import WordCloud,StopWORDS,ImagecolorGeneratorimport matplotlib.pyplot as pltback_color = imageio.imread('TomCruise.jpg') words = ' '.join(word_List)wc = WordCloud(background_color='white',max_words=5000,mask=back_color,max_Font_size=200,Font_path="/Users/tangwenpan/documents/Fonts/SimHei.ttf",random_state=None )wc.generate(words)image_colors = ImagecolorGenerator(back_color)plt.figure(figsize = (15,8))plt.imshow(wc.recolor(color_func=image_colors))plt.axis('off')plt.show()wc.to_file('comment.png')

原图:

词云图

选背景图真的好麻烦,各位看为将就看下,有点混乱~ 总结

以上是内存溢出为你收集整理的Python实现「碟中谍」5W条评论可视化!果然还是烧脑大戏!全部内容,希望文章能够帮你解决Python实现「碟中谍」5W条评论可视化!果然还是烧脑大戏!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存