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

640?wx_fmt=jpeg

作者 | 量化小白H

责编 | 郭芮

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


640?wx_fmt=png

影评分析


爬取影评使用的也是之前《用 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'你的密码'# 输入密码
10
11    # 验证码手动处理,输入后,需要将图片关闭才能继续执行下一步
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)   
17
18    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) + '页完成!')
16
17        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 + 1
25        except:
26            AllArticle = AllArticle.reset_index(drop = True)
27            return AllArticle
28    AllArticle = AllArticle.reset_index(drop = True)
29    return AllArticle

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

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=jpeg

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


640?wx_fmt=png

小说文本分析


  • 人物出场频数

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

640?wx_fmt=png

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

640?wx_fmt=png

部分代码如下:

 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 os
10os.chdir('F:\python_study\pachong\斗破苍穹')
11import re
12import numpy as np
13import jieba
14import matplotlib.pyplot as plt
15from matplotlib.font_manager import FontProperties
16font = FontProperties(fname=r'c:windowsontssimsun.ttc')#,size=20指定本机的汉字字体位置
17import matplotlib.pyplot as plt
18import networkx as nx  
19
20
21texts = open('all(校对版全本).txt',"r")
22
23texts = texts.read()
24
25AllChapters = re.split('第[0-9]*章',texts)[1:]
26
27AllChapters = pd.DataFrame(AllChapters,columns = ['text'])
28AllChapters['n'] = np.arange(1,1647)
29
30# 载入搜狗细胞词库
31jieba.load_userdict('斗破苍穹.txt')
32jieba.load_userdict('斗破苍穹异火.txt')
33stopwords = open('中文停用词表(比较全面,有1208个停用词).txt','r').read()
34stopwords = stopwords.split(' ')
35
36
37
38# 主要人物出现的总频数,人物名单从百度百科获取
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))
43
44nameall.loc[nameall.name=='熏儿','num'] = nameall.loc[nameall.name=='熏儿','num'].values[0] + nameall.loc[nameall.name=='熏儿','num'].values[0]
45nameall.loc[nameall.name=='熏儿','num'] = -886
46
47
48
49nameall.loc[nameall.name=='彩鳞','num'] = nameall.loc[nameall.name=='彩鳞','num'].values[0] + nameall.loc[nameall.name=='美杜莎','num'].values[0]
50nameall.loc[nameall.name=='美杜莎','num'] = -886
51
52nameall = nameall.sort_values('num',ascending = False)
53
54
55plt.figure(figsize=(8,10))
56fig = plt.axes()
57n = 50
58plt.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()
  • 女主分析

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

640?wx_fmt=png

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

 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
 9
10plt.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文件便于读取。

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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)
 9
10
11wordss = 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)
19
20relationmat.to_excel('共现矩阵.xlsx')
21
22# 网络图
23
24
25# 边与权重矩阵
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]
31
32
33edgemat = pd.DataFrame(index = range(len(relationmat1)))
34node = pd.DataFrame(index = range(len(relationmat1)))
35
36edgemat['Source'] = 0
37edgemat['Target'] = 0
38edgemat['Weight'] = 0
39
40node['Id'] = 0
41node['Label'] = 0
42node['Weight'] = 0
43
44
45names = 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'] = name1
52        edgemat.loc[i,'Target'] = name2
53        edgemat.loc[i,'Weight'] = weights[i]
54    else:
55        node.loc[i,'Id'] = name1
56        node.loc[i,'Label'] = name2
57        node.loc[i,'Weight'] = weights[i]        
58    i+=1
59
60
61edgemat = edgemat.loc[edgemat.Weight!=0,]
62edgemat = edgemat.reset_index(drop = True)
63node = node.loc[node.Weight!=0,]
64node = node.reset_index(drop = True)
65
66
67
68edgemat.to_csv('边.csv',index = False)
69node.to_csv('节点.csv',index = False)
  • 分词词云

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

640?wx_fmt=png

推荐阅读


  • 肥宅有理?大数据帮你找到不去健身房的原(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开发者大会首轮重磅嘉宾及深度议题现已火热出炉,扫码抢“鲜”看。国庆特惠,购票立享 折优惠!

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python input 函数 -Python零基础入门教程

目录 一.前言二.Python input 函数简介三.Python input 函数实战四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 Python 内置函数其实挺多的,其中 input 和 eval 算得上比较特殊,input 属于交互式内置函数…

综评:5个方面看刚刚发布的Kubernetes 1.12

Kubernetes项目在过去几年中发展迅速,并且作为容器编排和管理解决方案的领导者而备受尊重。有了这个地位,Kubernetes开发者有责任提供经过充分测试,易于维护,高性能和可扩展的API和工具。在即将到来的每个发布周期中,大…

华为麒麟1020鸿蒙系统,华为P50pro最新确认:麒麟1020+立体全面屏+鸿蒙系统,这才是华为...

原标题:华为P50pro最新确认:麒麟1020立体全面屏鸿蒙系统,这才是华为华为P系列一直是领导华为手机上半年的发展,而今年的华为P40系列更是实现了大爆发,市场上手机销量不断的攀升,并且权威的科技评测也给出了…

干货 | 算法和编程面试题精选TOP50!(附代码+解题思路+答案)

作者 | javinpaul编译 | 王天宇、Jane整理 | Jane【导读】之前我们给同学们推荐了很多关于 Python 的面试资源,大家都表示很有用。这次营长表示要翻 Java 的牌子啦~ 应大家的强烈反馈,我们找了一套 Java 语言的算法和编程的面试题。这份面试资源主要包含…

Python map 函数 -Python零基础入门教程

目录 一.前言二.Python map 函数语法简介三.Python map 函数实战 1.使用 map 函数2.map 函数配合 lambda 匿名函数一起使用 四.Python map 函数效率对比五.Python map 函数总结六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 截…

鸿蒙os2.0开发者beta版,鸿蒙 OS 2.0 开发者beta版针对Mate 40系列设备开放

华为开始针对包括P40,Mate 30和MatePad Pro设备在内的设备招募HarmonyOS 2.0 Mobile开发人员beta版。招募之后,华为还开始向选定的测试人员推出HarmonyOS 2.0移动开发人员更新。根据最新信息,华为现已决定扩展适用于华为Mate X2可折叠手机&am…

python2版本libnum

如果运行RsaCtfTool工具 需要用到libnum,而网上基本上都是python3的libnum讲解,下面我就来说说python2的libnum https://github.com/ryanInf/python2-libnum 这个链接讲述的是python2的libnum模块 安装 git clone https://github.com/ryanInf/python2-l…

1.7亿条数据,比胡同和撸串更真实的北京

作者王越来源DT财经原创作品,如有转载,请联系公众号授权。“宇宙中心”是哪里?哪里又是北京的城市活力中心?北京究竟是一座怎样的城市?是汇聚了政治中心、国际交往中心、科技创新中心等多项顶级职能的大国之都,是拥有…

Python 文件读写操作-Python零基础入门教程

目录 一.Python 文件的打开 open二.Python 文件的关闭 close三.Python 文件的读取 read 1.read 函数2.readline 函数3.readlines 函数 四.Python 文件的写入 write 1.write 函数语法2.write 函数使用案例 五.Python 文件偏移 seek 1.seek 函数2.tell 函数3.seek / tell 函数示…

面趣 | 为什么要分稳定排序和非稳定排序?

作者channingbreeze如需转载,请联系原作者。小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。今天他去了一家互联网小巨头公司面试了。没想到面试并不像想象中的顺利。…

个人求职简历计算机应用技术学院信息门户,计算机应用技术专业求职简历范文...

计算机应用技术专业求职简历范文应届毕业生求职网为毕业生推荐的是计算机方面的简历范文,欢迎阅读浏览:姓名:yjbys 性别:出生年月: 民族:户口所在地: 现居住地:婚姻状况:…

云漫圈 | AR VR傻傻分不清楚。。。

原文出自【烹茶十一】对此,你是不是也有好多吐槽的,来聊聊呀~~推荐阅读这届程序员,要做好苦日子的准备了?我跟OpenStack 1-8年,从ABC到HI、到KO完01微 信 群 添加小编微信:tangguoyemeng,备注“…

Python 异常处理-Python零基础入门教程

目录 一.Python 异常处理简介二.Python 异常捕获方式 1.捕获所有异常2.捕获指定异常3.捕获多个异常4.万能的异常捕获5.异常中的 else6.异常中的 finally7.raise 主动触发异常 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python 开…

解析微服务架构组件,看这一篇文章就够

1. 如何发布和引用服务服务描述:服务调用首先解决的问题就是服务如何对外描述。 常用的服务描述方式包括 RESTful API、XML 配置以及 IDL 文件三种。RESTful API主要被用作 HTTP 或者 HTTPS 协议的接口定义,即使在非微服务架构体系下,也被广泛…

学计算机高中选那三科,女生高中选哪三科最吃香

女生高中选哪三科最吃香2020-12-30 14:42:19文/丁雪竹女生高中选哪三科最吃香,怎么选择好,小编整理了相关信息,来看一下!女生高中选哪三科最吃香兴趣能够决定学习的深度,女生只要根据自己的兴趣,在最佳组合…

CTF-杂项题-伪加密

手动分离压缩包注意: zip压缩包文件头格式为504B0304,之间包含504B0102,文件以504B0506****结尾,注意这类格式。 zip伪加密 zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包。但实际是没有…

Anaconda是什么?Anconda下载安装教程 - Python零基础入门教程

目录 一.前言二.Anaconda 是什么?三.Anaconda 下载地址四.Anaconda 安装五.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 Anaconda 工具集合 – 第三方库集合Pycharm 开发工具,俗称 IDE – 写代码工具 二…

Cloud一分钟 | 电商月将至,腾讯云DCDB助力电商企业应对支付洪峰

Hello,everyone:10月08早,星期五,祝大家工作愉快!一分钟新闻时间:推荐阅读1.7亿条数据,比胡同和撸串更真实的北京面趣 | 为什么要分稳定排序和非稳定排序?使用动态规划解决童年难题V…

html5 自定义标签图例,奥维互动地图浏览器电脑版中自定义标签图标的增加方法...

这篇文章讲的是奥维互动地图浏览器电脑版中自定义标签图标的增加方法,感兴趣的小伙伴可以来学习一下哦。奥维互动地图浏览器电脑版中自定义标签图标的增加方法1、点击菜单:系统---数据管理---自定义图标管理(也可以就在标签图片选择--自定义页面&#xf…

CTF-MISC杂项题1

由于内容过多,分两篇展示 杂项题基本解题攻略: 内容: 1.文件操作与隐写 2.图片隐写术 3.压缩文件处理 4.流量取证技术 文件操作与隐写 file命令可识别文件类型 file filejpg file filegpng file filegzip 文件类型识别 在Window&#xff…