作者 | 量化小白H

责编 | 郭芮

近期根据小说《斗破苍穹》改编的同名电视剧正在热映,本文对《斗破苍穹》进行文本分析,分为两部分。首先爬取豆瓣影评进行简单分析,随后对于原创小说文本中的人物进行详细分析。

影评分析

爬取影评使用的也是之前《用 Python 爬取 500 条豆瓣影评,看看《蚁人2》是否有看点?》一文的代码,共爬到影评数据500条。

简要概述下爬取过程,首先说明一下工具:软件 Python3.6;Packages 包括 selenium、jieba、snownlp、wordcloud。豆瓣上的影评分为两种,一种是长篇大论的影评,还有一种是短评——本文爬虫的目标就是短评,包括用户名、星级评价、日期、有用数、评论正文。

主页显示45576条,但其实可见的只有500条,每页是20条短评。第一遍直接用Selenium去爬只爬到了200条,后来又加了登陆的代码,之后又加了一个手动输入验证码的部分,最终成功爬到了500条。代码如下:

 1def gethtml(url): 2    loginurl='https://www.douban.com/'    # 登录页面 3 4    browser = webdriver.PhantomJS()     5    browser.get(loginurl)    # 请求登录页面 6    browser.find_element_by_name('form_email').clear()  # 获取用户名输入框,并先清空 7    browser.find_element_by_name('form_email').send_keys(u'你的用户名') # 输入用户名 8    browser.find_element_by_name('form_password').clear()  # 获取密码框,并清空 9    browser.find_element_by_name('form_password').send_keys(u'你的密码') # 输入密码1011    # 验证码手动处理,输入后,需要将图片关闭才能继续执行下一步12    captcha_link = browser.find_element_by_id('captcha_image').get_attribute('src')13    urllib.request.urlretrieve(captcha_link,'captcha.jpg')14    Image.open('captcha.jpg').show()15    captcha_code = input('Pls input captcha code:')16    browser.find_element_by_id('captcha_field').send_keys(captcha_code)   1718    browser.find_element_by_css_selector('input[class="bn-submit"]').click()19    browser.get(url)20    browser.implicitly_wait(10)21    return(browser)

具体爬的时候,用一个DataFrame来存所有的信息,一行为一个用户的所有数据,数据位置仍然通过开发者工具获得,细节不再赘述。相关代码如下:

1def getComment(url): 2    i = 1 3    AllArticle = pd.DataFrame() 4    browser = gethtml(url) 5    while True: 6        s = browser.find_elements_by_class_name('comment-item') 7        articles = pd.DataFrame(s,columns = ['web']) 8        articles['uesr'] = articles.web.apply(lambda x:x.find_element_by_tag_name('a').get_attribute('title')) 9        articles['comment'] = articles.web.apply(lambda x:x.find_element_by_class_name('short').text)10        articles['star'] = articles.web.apply(lambda x:x.find_element_by_xpath("//*[@id='comments']/div[1]/div[2]/h3/span[2]/span[2]").get_attribute('title'))11        articles['date'] = articles.web.apply(lambda x:x.find_element_by_class_name('comment-time').get_attribute('title'))12        articles['vote'] = articles.web.apply(lambda x:np.int(x.find_element_by_class_name('votes').text))13        del articles['web']14        AllArticle = pd.concat([AllArticle,articles],axis = 0)15        print ('第' + str(i) + '页完成!')1617        try:18            if i==1:19                browser.find_element_by_xpath("//*[@id='paginator']/a").click()  20            else:21                browser.find_element_by_xpath("//*[@id='paginator']/a[3]").click()22            browser.implicitly_wait(10)23            time.sleep(3) # 暂停3秒24            i = i + 125        except:26            AllArticle = AllArticle.reset_index(drop = True)27            return AllArticle28    AllArticle = AllArticle.reset_index(drop = True)29    return AllArticle

最终爬下来的数据大概是这样子:

简单统计来看,一星差评最多,但四五星评价与一二星差评价基本持平。

不过从投票数来看,投票数最多的前25条,无一例外都是一星差评。

大家给差评的原因也很统一,电视剧对小说改编过多,原著党难以接受,再加上5毛钱特效和演员的尴尬演技,感觉是妥妥烂片无疑了。不妨再看看给好评的人都是些神马想法。

除过一些明明给了很差评价还点了力荐的观众之外,投票数最多的好评都来自于主演的粉丝,对他们来说,剧情研究都不重要,看颜就行。

小说文本分析

  • 人物出场频数

分析完影评,作为一名原著党,我觉得更有必要分析一下小说原文。小说共有1646章,首先来看看小说中出场次数最多的人物。

男主出场次数太多,远远高于其他人物,我们不考虑主角,看看其他人物的出场次数。

部分代码如下:

 1# -*- coding: utf-8 -*- 2""" 3Created on Mon Sep 17 19:51:48 2018 4 5@author: hzp0625 6""" 7 8import pandas as pd 9import os10os.chdir('F:\python_study\pachong\斗破苍穹')11import re12import numpy as np13import jieba14import matplotlib.pyplot as plt15from matplotlib.font_manager import FontProperties16font = FontProperties(fname=r'c:windowsontssimsun.ttc')#,size=20指定本机的汉字字体位置17import matplotlib.pyplot as plt18import networkx as nx  192021texts = open('all(校对版全本).txt',"r")2223texts = texts.read()2425AllChapters = re.split('第[0-9]*章',texts)[1:]2627AllChapters = pd.DataFrame(AllChapters,columns = ['text'])28AllChapters['n'] = np.arange(1,1647)2930# 载入搜狗细胞词库31jieba.load_userdict('斗破苍穹.txt')32jieba.load_userdict('斗破苍穹异火.txt')33stopwords = open('中文停用词表(比较全面,有1208个停用词).txt','r').read()34stopwords = stopwords.split('
')35363738# 主要人物出现的总频数,人物名单从百度百科获取39nameall = open('所有人物.txt','r').read().split('
')40nameall = pd.DataFrame(nameall,columns = ['name'])41textsall = ''.join(AllChapters.text.tolist())42nameall['num'] = nameall.name.apply(lambda x:textsall.count(x))4344nameall.loc[nameall.name=='熏儿','num'] = nameall.loc[nameall.name=='熏儿','num'].values[0] + nameall.loc[nameall.name=='熏儿','num'].values[0]45nameall.loc[nameall.name=='熏儿','num'] = -88646474849nameall.loc[nameall.name=='彩鳞','num'] = nameall.loc[nameall.name=='彩鳞','num'].values[0] + nameall.loc[nameall.name=='美杜莎','num'].values[0]50nameall.loc[nameall.name=='美杜莎','num'] = -8865152nameall = nameall.sort_values('num',ascending = False)535455plt.figure(figsize=(8,10))56fig = plt.axes()57n = 5058plt.barh(range(len(nameall.num[:n][::-1])),nameall.num[:n][::-1],color = 'darkred')59fig.set_yticks(np.arange(len(nameall.name[:n][::-1])))60fig.set_yticklabels(nameall.name[:n][::-1],fontproperties=font)61plt.xlabel('人物出场次数',fontproperties = font)62plt.show()
  • 女主分析

从出场频数来看,排名前四的是主角的老师和三个女主,那么究竟哪一个是女一?单从出场次数来看的话可能会太过简单,我们对小说分章节统计每章中所有女主的出场次数,来看看女主出场的时间分布,横轴为章节号,纵轴为出现次数:

从分布图来看,前中期各个女主出场的重叠不多,每个人陪男主走过不同的剧情副本,结尾合家欢。

 1# 女主每章出现次数统计:熏儿,云韵,小医仙,彩鳞,美杜莎 2 3names = ['熏儿','云韵','小医仙','彩鳞','美杜莎'] 4result['熏儿'] = result.fenci.apply(lambda x:x.count('熏儿') + x.count('薰儿')) 5result['云韵'] = result.fenci.apply(lambda x:x.count('云韵')) 6result['小医仙'] = result.fenci.apply(lambda x:x.count('小医仙')) 7result['彩鳞'] = result.fenci.apply(lambda x:x.count('彩鳞') + x.count('美杜莎')) 8 910plt.figure(figsize=(15,5))11plt.plot(np.arange(1,result.shape[0]+1),result['熏儿'],color="r",label = u'熏儿')12plt.plot(np.arange(1,result.shape[0]+1),result['云韵'],color="lime",label = u'云韵')13plt.plot(np.arange(1,result.shape[0]+1),result['小医仙'],color="gray",label = u'小医仙')14plt.plot(np.arange(1,result.shape[0]+1),result['彩鳞'],color="orange",label = u'彩鳞')15plt.legend(prop =font)16plt.xlabel(u'章节',fontproperties = font)17plt.ylabel(u'出现次数',fontproperties = font)18plt.show()
  • 人物社交关系网络

接下来,我们对小说中的人物关系做一些探究,如果两个人物同时出现在文章的一个段落里,我们就认为这两个人物之间有一定的联系(也可以以句或章节为单位),以此为规则,计算所有人物的共现矩阵。所以人物列表通过百度百科获取,保存为txt文件便于读取。

将小说文本按段落划分之后,会发现共有八万多个段落,人物有一百个左右,直接循环效率太低,但观察得到的段落,有很多单字成段的语气词,这些可以直接删掉。

因此,对于得到的段落,我们首先删掉段落长度小于20个字的,用剩余的段落计算共现矩阵,部分主要人物的共现矩阵如下:

用所有人物的共现矩阵构造社交关系网络图,计算出边和节点矩阵后,用Gephi软件直接作图(Python也可以用networkx作图):

删掉边权重小于10的值后,重新作图,结果相对清晰一些,连线越宽,表明人物见的联系越紧密:

1# 社交网络图  共现矩阵 2# 两个人物出现在同一段,说明有某种关系 3words = open('all(校对版全本).txt','r').readlines() 4words = pd.DataFrame(words,columns = ['text'],index = range(len(words))) 5words['wordnum'] = words.text.apply(lambda x:len(x.strip())) 6words = words.loc[words.wordnum>20,] 7wrods = words.reset_index(drop = True) 8relationmat = pd.DataFrame(index = nameall.name.tolist(),columns = nameall.name.tolist()).fillna(0) 91011wordss = words.text.tolist()12for k in range(len(wordss)):13    for i in nameall.name.tolist():14        for j in nameall.name.tolist():15            if i in wordss[k] and j in  wordss[k]:16                relationmat.loc[i,j] += 1 17    if k%1000 ==0:18        print(k)1920relationmat.to_excel('共现矩阵.xlsx')2122# 网络图232425# 边与权重矩阵26#relationmat1 = pd.DataFrame(index = range(relation.shape[]))27relationmat1 = {}28for i in relationmat.columns.tolist():29    for j in relationmat.columns.tolist():30        relationmat1[i, j] = relationmat.loc[i,j]313233edgemat = pd.DataFrame(index = range(len(relationmat1)))34node = pd.DataFrame(index = range(len(relationmat1)))3536edgemat['Source'] = 037edgemat['Target'] = 038edgemat['Weight'] = 03940node['Id'] = 041node['Label'] = 042node['Weight'] = 0434445names = list(relationmat1.keys())46weights = list(relationmat1.values())47for i in range(edgemat.shape[0]):48    name1 = names[i][0]49    name2 = names[i][1]50    if name1!=name2:51        edgemat.loc[i,'Source'] = name152        edgemat.loc[i,'Target'] = name253        edgemat.loc[i,'Weight'] = weights[i]54    else:55        node.loc[i,'Id'] = name156        node.loc[i,'Label'] = name257        node.loc[i,'Weight'] = weights[i]        58    i+=1596061edgemat = edgemat.loc[edgemat.Weight!=0,]62edgemat = edgemat.reset_index(drop = True)63node = node.loc[node.Weight!=0,]64node = node.reset_index(drop = True)65666768edgemat.to_csv('边.csv',index = False)69node.to_csv('节点.csv',index = False)
  • 分词词云

最后,还是以小说文本的词云作为文章结尾,为了使文本分词更准确,这里我们使用了网上流传的包含1208个词的中文停用词表,以及通过搜狗细胞词库得到的两个词库,主要包含一些人名、地名、组织名称、异火等。

推荐阅读

  • 肥宅有理?大数据帮你找到不去健身房的原(jie)因(kou)

  • 统计了50万人的身高数据才发现:大家都爱虚报身高

  • 【BAT面试现场】如何判断一个数是否在40亿个整数中?

  • 10分钟搞懂区块链扩容,4个解决方案拿走不谢

01

 微 信 群  

添加小编微信:tangguoyemeng,备注“进群”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

成为群成员,或拉人进群,

还有机会参与红包抽奖,获得免费赠书哦~~

02

 征 稿 

CSDN作为国内专业的云计算服务平台,目前提供云计算、大数据、虚拟化、数据中心、OpenStack、CloudStack、机器学习、智能算法等相关云计算观点、技术、平台、实践、云产业咨询等服务。CSDN 公众号也一直坚持「与千万技术人共成长」的理念,深度解读行业内热门技术与场景应用,致力于让所有开发者保持敏锐的技术嗅觉、对行业趋势与技术获得更广阔的认知。

文章题材

  • 首先你需要关注我们的公众号“CSDN云计算”,这样你会更准确了解我们需要的文章风格;

  • 侧重于云计算领域相关的文章,可以是技术、运维、趋势等方面的务实内容;

  • 原创,要求文章有鲜明观点和看法。

投稿须知

  • 稿费:根据原创性、实用性和时效性等方面进行审核,通过的文章会发布在本微信平台。一经采用,我们将支付作者酬劳。酬劳可能不多,这代表的是一个心意,更多是因为爱好,是有识之士抒发胸怀的一种方式;

  • 字数要求:稿件字数以2K-8K为宜,少于2K或多于8K都会一定程度降低阅读愉悦感;

  • 投稿邮箱:lijy@csdn.net。或者添加微信表明来意,微信号:tangguoyemeng。请备注投稿+姓名+公司职位

如果咱们的合作稳定又愉快,还可以签订合同长期合作哦!



2018 AI开发者大会

拒绝空谈,技术争鸣

2018 AI开发者大会(AI NEXTCon)由中国IT社区CSDN与硅谷AI社区AICamp联合出品的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们只讲技术,拒绝空谈,诚挚邀请AI业内人士一起共铸人工智能新篇章!

2018 AI开发者大会首轮重磅嘉宾及深度议题现已火热出炉,扫码抢“鲜”看。国庆特惠,购票立享 折优惠!

用 Python 分析《斗破苍穹》,分析其究竟是烂片无疑还是沧海遗珠?相关推荐

  1. 用python做舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  2. python可视化来分析全国疫情

    很长一段时间在python下出图都是使用matplotlib,其好处就是应用比较广泛,文档很容易找,不过出的图微显丑陋.pyecharts 是百度的echarts基于python的实现,可以很方便的直 ...

  3. NLP实战:利用Python理解、分析和生成文本 | 赠书

    导读:本文内容参考自<自然语言处理实战:利用Python理解.分析和生成文本>一书,由Hobson Lane等人所著. 本书是介绍自然语言处理(NLP)和深度学习的实战书.NLP已成为深度 ...

  4. Python源码学习:Python类机制分析-用户自定义类

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一文,分析了Python在启动初始化时,对内置类的一个基本的初始化流程,本文就简析 ...

  5. Python源码学习:Python类机制分析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文主要分析Python中类时如何实现的,在Python中,一切都是对象:任何对象都 ...

  6. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc

    利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...

  7. python空间分析_读书笔记——《python地理空间分析指南》

    本文为<Python地理空间分析指南(第2版)>的读书摘录,顺便挖个坑,进一步对python的几个包做学习整理. 本笔记的用途:了解python地理空间处理的技术框架和实现途径. 第三章 ...

  8. python可视化文本分析(2)—snownlp jieba分析QQ群成员发言情况

    公众号文章链接 第二个情感分析,主要通过python实现qq群消息分析,分析群成员发言总次数,群成员情绪对比,单个群成员的发言词云状况以及单个同学的发言情感走势. 用到一下库: re正则,matplo ...

  9. python 相关性分析_数据分析---用Python进行相关性分析(兼谈假设检验)

    一.相关关系和相关系数 世上除了因果关系,还有相关关系. 有一个叫"相关系数"的指标来量化两个事物之间的相关程度. 其中相关系数用"r"表示,取值范围介于-1和 ...

最新文章

  1. MyCAT-1.4-RC性能测试(初步施工)
  2. CUBLAS_STATUS_ALLOC_FAILED
  3. 日常生活小技巧 -- markdown编辑器
  4. 远程服务器存储之JDK方式
  5. Microsoft Asp.Net Ajax框架入门(12) 了解异步通信层
  6. 4、Flutter 采坑记录篇二_依赖库不兼容
  7. C#:适配器设计模式如何让您的生活更轻松
  8. 46. 考虑使用函数对象而不是函数作为STL算法的参数
  9. 频率域滤波去除周期性噪声
  10. 多媒体计算机辅助英语教学,多媒体计算机辅助小学英语教学探讨
  11. 图像算法工程师面试题
  12. 修复版动态视频壁纸微信小程序源码下载,支持多种类型流量主收益
  13. cpp 读取txt文件
  14. Spark Submit任务提交流程
  15. 通过HFS低成本搭建NAS,并内网穿透实现公网访问 1/2
  16. 编程语言中的“前浪”和“后浪”
  17. 路由器 设置 端口映射
  18. 计算机表格如何求和,excel怎么求和,教您excel如何进行求和
  19. 微信商城小程序 带java后台源码
  20. 北京智和信通 | 无人值守的IDC机房动环综合监控运维

热门文章

  1. 期刊论文格式要求笔记
  2. Phpstorm 设置放大字体的快捷键?
  3. python删除指定后缀名的文件
  4. 嵌入式学习笔记--jlink 工具RTT使用笔记
  5. android 心电图文件读取,用手机测量你的心跳!安卓心电图App试用
  6. 从此不求人:自主研发一套PHP前端开发框架-沈逸-专题视频课程
  7. 2.创建项目和目录结构
  8. 关于Vue-Cli proxy 不生效的问题
  9. 在线JSON转MySQL建表语句工具
  10. 2020中国大数据企业50强