开发 | 我做了12万条的影评分析,告诉你《战狼Ⅱ》都在说些啥

本文原作者麦艳涛。本文原载于知乎专栏。

截止到8月15日,《战狼Ⅱ》上映的第19天,票房已超45亿人民币。

真正成为唯一一部挺进世界影史票房前100名的亚洲电影。

抛开爆炸的票房不说,电影还激起了观众各种情绪,甚至有人放狠话说:敢喷《战狼Ⅱ》的,要么是智障,要么是公敌,就是这么简单粗暴。

尽管各路评论出街,媒体闹得沸沸扬扬,观众还是傻傻分不清楚哪边意见比较靠谱。

本文通过Python爬虫的方式获取数据,对豆瓣电影评论进行分析,制作了豆瓣影评的云图。

现在,让我们来看看,《战狼Ⅱ》评论里到底藏着哪些有趣的潜台词。

数据的获取

对于数据的获取,本文采用的是Python爬虫的方式获取的数据。用到的主要是requests包与正则包re。该程序并未对验证码进行处理。

之前也爬取过豆瓣的网页,当时由于爬取的内容少,所以并没有遇到验证码的事情。在写本文爬虫的时候,原以为也不会有验证码,但是当爬取到大概15000个评论的时候跳出来验证码。然后我就想不就是十二万吗?最多我也就是输入大概十几次验证码,所以就没有处理验证码的事情。

但是接下来的事情就有点坑到我了。爬取15000左右评论并输入验证码的时候,我以为会接下来爬取到30000左右,可是才爬了3000左右就不行了,还是要输验证码。然后就一直这样,跌跌撞撞,有时候爬取好长时间才需要验证码,有时候则不是。不过最后还是把评论爬取下来了。

爬取的内容主要是:用户名,是否看过,评论的星星点数,评论时间,认为有用的人数,评论内容。参看下图(用户名已隐藏):

这个是影评的起始页:豆瓣影评

以下是Python爬虫的代码:

import requests
import re
import pandas as pd
url_first='https://movie.douban.com/subject/26363254/comments?start=0'
head={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)Ubuntu Chromium/59.0.3071.109 Chrome/59.0.3071.109 Safari/537.36'}
html=requests.get(url_first,headers=head,cookies=cookies)

cookies={'cookie':'你自己的cookie'}  #也就是找到你的账号对应的cookie

reg=re.compile(r'<a href="(.*?)&amp;.*?class="next">') #下一页

ren=re.compile(r'<span class="votes">(.*?)</span>.*?comment">(.*?)</a>.*?</span>.*?<span.*?class="">(.*?)</a>.*?<span>(.*?)</span>.*?title="(.*?)"></span>.*?title="(.*?)">.*?class=""> (.*?)\n',re.S)  #评论等内容
while html.status_code==200:
    url_next='https://movie.douban.com/subject/26363254/comments'+re.findall(reg,html.text)[0]                             
    zhanlang=re.findall(ren,html.text)
    data=pd.DataFrame(zhanlang)
    data.to_csv('/home/wajuejiprince/文档/zhanlang/zhanlangpinglun.csv', header=False,index=False,mode='a+') #写入csv文件,'a+'是追加模式
    data=[]
    zhanlang=[]
    html=requests.get(url_next,cookies=cookies,headers=head)

以上代码注意设置你自己的User-Agent,Cookie,CSV保存路径等。

爬取的内容保存成CSV格式的文件。保存的文件内容如下:

数据清洗

本文用R语言来处理数据。虽然在爬取的时候已经非常注意爬取内容的结构了,但是还是不可避免的有一些值不是我们想要的,比如有的评论内容会出现在评论者这一项中。所以还是有必要进行一下数据的清洗。

首先加载要用到的所有包:

library(data.table)
library(plotly)
library(stringr)
library(jiebaR)
library(wordcloud2)
library(magrittr)

导入数据并清洗:

dt<-fread(file.choose()) #导入数据
dt[,c("V8","V9","V10","V11","V12","V13"):=NULL] #删除空列

#一条命令清洗数据

my_dt<-dt[str_detect(赞成评论数,"\\d+")][评论有用=='有用'][是否看过=="看过"][五星数%in%c("很差","较差","还行","推荐","力荐")] 

数据浅析

先来看一看通过星星数评论的情况:

plot_ly(my_dt[,.(.N),by=.(五星数)],type = 'bar',x=~五星数,y=~N)

五角星的个数对应5个等级,5颗星代表力荐,4颗星代表推荐,3颗星代表还行,2颗星代表较差,1颗星代表很差。通过五角星的评论显而易见。我们有理由相信绝大部分观看者对这部影片持满意态度。

对评论结果的云图展示:

  • 首先我们应该先进行评论的分词
wk <- worker()
sw<-function(x){wk<=x}
segwords<-lapply(my_dt[,评论内容],sw)
my_segwords<-unlist(segwords) #不要列表

#去除停止词

st<-readLines(file.choose()) #读取停止词
stopwords<-c(NULL)

for(i in 1:length(st))
{
  stopwords[i]<-st[i]
}

seg_Words<-filter_segment(my_segwords,stopwords)  #去除中文停止词
  • 总体评论云图展示
words<-table(seg_Words)%>%data.table()

setnames(words,"N","pinshu")

words[pinshu>1000] #去除较低频数的词汇(小于1000的)

wordcloud2(words[pinshu>1000], size = 2, fontFamily = "微软雅黑",color = "random-light", backgroundColor = "grey")

由于数据太多,导致我的破电脑卡顿,所以在制作云图的时候去掉了频数低于1000的词汇。

云图结果如下:

整体来看,大家对这不影片的评论还是不错呀!剧情,动作,爱国等话题是大家谈论的焦点。但是如果把不同评价的人的评论分别展示会是什么样子呢?

  • 不同评论等级的云图展示

也就是对五个等级(力荐,推荐,还行,较差,很差)的评论内容制作云图。代码如下(只要改变代码中力荐为其他即可):

1.力荐的评论人的评论云图

2.推荐的评论人的评论云图

3.还行的评论人的评论云图

4.较差的评论人的评论云图

5.很差的评论人的评论云图

结论

从不同的评论的分词结果来看,他们都有一个共同的话题:爱国

在力荐的评论中可能爱国话题的基数比很差的评论中的多,在力荐的评论中人们更愿意讨论的是爱国话题之外的事情。在很差的评论中人们讨论的大多是爱国话题。而且他们占的比例很有意思,从力荐的人到评论很差的人,爱国话题的比例逐渐增加。

我们不能主观的认为谁对谁错,只能说他们站在的角度不一样,所以看到的结果也不太一样。当我们和别人意见不同时,往往是所处的角度不同。评论很差的人考虑的更多的是爱国的话题吧(这里只是爱国话题的讨论,并不是谁爱不爱国)!!

作者 / 麦艳涛(挖掘机小王子)

简介 / 数据分析爱好者

微信 / Gorgon---Medusa

邮箱 / 1960958490@qq.com

来源 / 知乎专栏

原文发布于微信公众号 - AI科技评论(aitechtalk)

原文发表时间:2017-08-17

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

体育竞技游戏的团队AI

很多人问游戏AI该怎么做?随着游戏类型的多元化,非 MMO或者卡牌的游戏越来越多,对AI的需求也越来越强了。而市面上关于 AI的书,网上找得到的文章,也都流于一...

1324
来自专栏智能算法

图像处理库综述

当需要做一些图像处理方面的学习和研究的时候,首要任务就是选择一套合适的图像处理类库,本文主要简单介绍下各家图像库的一些优缺点。OpenCV,Intel ...

4237
来自专栏吾真本

致想给遗留系统写自动化单元测试的开发团队——事件风暴之父的工作坊实录之二:软件开发设计

一家大型企业的关键业务代码已经年久失修成为了难以维护的遗留代码,有着硅谷高科技企业软件开发管理经验的高管决定在企业内部搞编写单元测试和重构的极限编程实践。这需要...

693
来自专栏点点滴滴

Western Blot一抗的选择

2322
来自专栏FreeBuf

研究人员发现新式鱼叉式钓鱼检测方法,获FaceBook价值10万美元的互联网防御奖

近日,加利福尼亚大学伯克利分校以及劳伦斯伯克利国家实验室的一组研究人员获得 Facebook 本年度价值 10 万美元的“互联网防御奖金”,他们的主要贡献是研究...

3056
来自专栏QQ会员技术团队的专栏

小兴逛Google I/O 2017(day3实况)

作者介绍:陈志兴,Google I/O 2017大会的小时光茶社特派员 ,腾讯SNG增值产品部内容中心Android组leader,主要负责手Q个性化业务、手Q...

19310
来自专栏大数据挖掘DT机器学习

数据挖掘知识点总结(Microsoft 关联规则分析算法)

前言 本篇继续我们的微软挖掘算法系列总结,前几篇我们分别介绍了:Microsoft决策树分析算法、Microsoft聚类分析算法、Microsoft Naive...

3026
来自专栏腾讯数据中心

变频冷机在超低负载下如何安全又节能运行?

使用变频冷机是为了节能,节能的前提是“冷机处于非满载工况下运行”。但如果当冷机负载太低(低于30%以下),冷机不仅无法有效节能,甚至不能正常工作——此时冷机会反...

1492
来自专栏JackeyGao的博客

2016年Python十大文章

在过去一年, 我们对10000篇Python相关的文章进行了排名, 并选择出排名前十的文章. (0.1%的几率), 可以帮助您在2017年推进你的技术生涯.

561
来自专栏大数据文摘

Kaggle | 使用Python和R绘制数据地图的十七个经典案例(附资源)

4555

扫码关注云+社区