Python实现「碟中谍」5W条评论可视化

项目介绍

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

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

数据背景

数据清洗

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

我这边是使用DataFrame将数据读入内存,代码如下:

import pandas as pd

with open('comment.txt','r') as f:
    comment = f.read()
comment_list = comment.split('\n')
print '>>>累计评论数:%s\n'%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来处理地理数据好了。
    1. 访问百度地图开放平台申请一个key,选择浏览器端使用,具体可以参考网站介绍;
    2. 获取到key之后我们通过访问链接??http://api.map.baidu.com/geocoder?address=位置&output=json&key=申请到的key就能获取到经纬度信息了。
    1. 接下来就是写个循环将你的地理信息传过去,获取到信息之后保存下来就ok了,比自己一个个手动添加是不是有效率多了~??
代码
import requests
from tqdm import tqdm

data['城市'][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['城市'], temp['数量'], visual_range=[0, 1000], type='heatmap',
        visual_text_color="#fff", is_visualmap=True,is_legend_show=False,
       geo_cities_coords = dic)
Geo

image.png

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

词频统计

  • 接受上次评论中建议,这次分词的时候加入了一些停用词,我们看下在这4W多条评论中,用户说的最多的是什么呢?
from jieba import posseg as psg
import collections


string = ''.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 imageio
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt

back_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')
原图:
词云图
  • 选背景图真的好麻烦,各位看为将就看下,有点混乱~

skrskr~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏新智元

Andrej Karpathy:神经网络是“软件2.0”,而非机器学习的一种工具

【新智元导读】深度学习和计算机视觉专家、特斯拉人工智能部门主管Andrej Karpathy最近提出将神经网络视为Software 2.0,而非“机器学习中的一...

43680
来自专栏灯塔大数据

洞察|美国大选倒计时:R 语言和蒙特卡洛算法预测希拉里赢面高达89%

距总统大选不到一周,来预测一下竞选结果还是很有挺有趣的。虽然关于选举,有的是博客和网站的预测,但确切告诉你他们究竟用了什么模型,或者告诉你怎么做这个预测的却寥...

38790
来自专栏月色的自留地

从锅炉工到AI专家(11)(END)

24070
来自专栏技术翻译

关于TensorFlow你应该知道的9件事

TensorFlow是一个机器学习框架。如果你有大量的数据或你在人工智能中追求的最先进的东西,那么这个框架可能是你最好的选择:深度学习。

10500
来自专栏AI科技评论

动态 | ACL 2018 公布四篇最佳 demo 候选论文,三篇论文第一作者来自中国

雷锋网 AI 科技评论按:7 月 9 日,自然语言处理顶会 ACL 公布了最佳 demo 论文的四篇候选论文,名单如下:

14640
来自专栏PPV课数据科学社区

【数据挖掘】rattle:数据挖掘的界面化操作

R语言是一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。这里的统计计算可以是数据分析、建模或是数据挖掘等,通过无数大牛提供的软件包,...

35560
来自专栏AI科技评论

斩获 ISCA 2018 中国唯一一作论文,清华大学 Thinker 团队提出 AI 计算芯片的存储优化新方法

AI 科技评论按:6 月 2 日至 6 日,第 45 届国际计算机体系结构大会(International Symposium on Computer Arch...

15740
来自专栏机器人网

一个简单的多机器人编队算法实现--PID

用PID进行领航跟随法机器人编队控制 课题2:多机器人编队控制 研究对象:两轮差动的移动机器人或车式移动机器人 研究内容:平坦地形,编队的保持和避障,以及避障和...

51570
来自专栏华章科技

用 Python 20 秒画完小猪佩奇“社会人”!附效果视频+完整代码

导读:今年社交平台上最火的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。

26450
来自专栏专知

Smart Compose:神经网络辅助写邮件

20820

扫码关注云+社区

领取腾讯云代金券