用Python分析《斗破苍穹》
近期根据小说《斗破苍穹》改编的同名电视剧正在热映,本文对《斗破苍穹》进行文本分析,分为两部分,首先爬取豆瓣影评进行简单分析,随后对于原创小说文本中的人物进行详细分析。
1.影评分析
爬取影评直接使用之前蚁人的代码,不再说明,共爬到影评数据500条。
简单统计来看,一星差评最多,但四五星评价与一二星差评价基本持平。
不过从投票数来看,投票数最多的前25条,无一例外都是一星差评
大家给差评的原因也很统一,电视剧对小说改编过多,原著党难以接受,再加上5毛钱特效和演员的尴尬演技,感觉是妥妥烂片无疑了。不妨再看看给好评的人都是些神马想法
除过一些明明给了很差评价还点了力荐的观众之外,投票数最多的好评都来自于主演的粉丝,对他们来说,剧情研究都不重要,看颜就行。
2.小说文本分析
1. 人物出场频数
分析完影评,作为一名原著党,我觉得更有必要分析一下小说原文,直接百度下载到一个小说txt文件,小说共有1646章,首先来看看小说中出场次数最多的人物
男主出场次数太多,远远高于其他人物,我们不考虑主角,看看其他人物的出场次数
部分代码如下
1# -*- coding: utf-8 -*-2"""3Created on Mon Sep 17 19:51:48 201845@author: hzp06256"""78import pandas as pd9import 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()
2. 女主分析
从出场频数来看,排名前4的是主角的老师和三个女主,那么究竟哪一个是女一?单从出场次数来看的话可能会太过简单,我们对小说分章节统计每章中所有女主的出场次数,来看看女主出场的时间分布,横轴为章节号,纵轴为出现次数
从分布图来看,前中期各个女主出场的重叠不多,每个人陪男主走过不同的剧情副本,结尾合家欢。
1# 女主每章出现次数统计:熏儿,云韵,小医仙,彩鳞,美杜莎23names = ['熏儿','云韵','小医仙','彩鳞','美杜莎']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('美杜莎'))89
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()
3. 人物社交关系网络
接下来,我们对小说中的人物关系做一些探究,如果两个人物同时出现在文章的一个段落里,我们就认为这两个人物之间有一定的联系(也可以以句或章节为单位),以此为规则,计算所有人物的共现矩阵。所以人物列表通过百度百科获取,保存为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)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)
4. 分词词云
最后,还是以小说文本的词云作为文章结尾,为了使文本分词更准确,这里我们使用了网上流传的包含1208个词的中文停用词表,以及通过搜狗细胞词库得到的两个词库,主要包含一些人名,地名,组织名称,异火等。
网址:https://pinyin.sogou.com/dict/
-End-
想了解更多前沿技术,想获取最新免费编程资源视频源码笔记,小伙伴请往下看!
qun号是:八六四,六三四,八四五。qun内有很多开发工具,很多干货和技术资料分享!
如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:大禹编程,您的支持是对我最大的鼓励!共同学习,共同进步
用Python分析《斗破苍穹》相关推荐
- python 判断数据是什么类型的游戏_利用python分析权力的游戏五王之战数据
本身是个美剧迷,其中权力的游戏是我最爱的美剧之一,所以我通过kaggle下载了数据集并进行分析.数据名称解释如下: name: 战争的名称,字符变量. year: 战争发生的年份,数值变量. batt ...
- 利用python分析权力的游戏五王之战数据
本身是个美剧迷,其中权力的游戏是我最爱的美剧之一,所以我通过kaggle下载了数据集并进行分析.数据名称解释如下: name: 战争的名称,字符变量. year: 战争发生的年份,数值变量. batt ...
- Python分析离散心率信号(下)
Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...
- Python分析离散心率信号(中)
Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...
- Python分析离散心率信号(上)
Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...
- 盛夏海边,用Python分析青岛哪些景点性价比高
作者 | 志斌 来源 | 志斌的python笔记 头图 | 付费下载于 IC Photo 在经过几年的热潮之后,人工智能AI算法已经在各行各业广泛使用了.例如在工业制造中,利用人工智能监测仪器仪表.人 ...
- Python分析101位《创造营2020》小姐姐,谁才是你心中的颜值担当?
来源 | CDA 数据分析师 责编 | Carol Show me data,用数据说话. 今天我们聊一聊<创造营2020>各个小姐姐,点击下方视频,先睹为快: 最近可以追的综艺真是太多 ...
- 用Python分析《红楼梦》:见证了贾府的兴衰,你是否还能“笑道”世事无常
没读过<红楼梦>也能知道前后四十回是不是一个作者写的?很久以前,数据侠黎晨,用机器学习的算法分析了<红楼梦>,认为后四十回和前八十回内容上有明显差距.不过,数据侠楼宇却不这么认 ...
- 用Python分析了十年电影票房,原来我错过了这么多好电影!
"玩电影票房数据,我教你啊" 3月8日妇女节,我很期待的超级英雄电影<惊奇队长>上映了,票房表现很快过亿,但大众口碑却让人失望. 一个有趣且常见的现象是,隔壁获奖无数, ...
- 用Python分析了1980~2015年考研英语真题词汇,原来考研英语应该这样考!
微信改版,加星标不迷路! 用Python分析了1980~2015年考研英语真题词汇,原来考研应该这样考! 作者:阿广 概述 前言 数据介绍 实现过程 考研英语词汇统计分析 搞笑一刻 阿广说 每日问题 ...
最新文章
- PyTorch Tricks 集锦
- Win10怎么设置虚拟内存?
- 万物智联时代的终端智能「管家」 重磅升级:混合云IoT一体机
- 怎么解决机械革命笔记本蓝屏问题
- Laravel核心解读 -- 扩展用户认证系统
- 快速排序-超级详细代码注释!
- JAVA面试要点010---重入锁_ReentrantLock 详解
- C++中两个类中互相包含对方对象的指针问题
- linux下简单time machine实现,可选择快速备份恢复脚本
- tensorflow : gfile 函数
- 如何设置PDFjs 页面标题
- 易语言mysql编程助手_编程助手app下载-编程助手安卓版 v7.0.1 - 安下载
- ApacheCon Asia: Keynote 以及流处理专场大咖详细介绍
- 什么是自签名证书?自签名SSL证书的优缺点?
- Visual SourceSafe如何支持并行开发
- throw Exception
- 微信登陆之生成微信二维码
- 【量化笔记】配对交易
- 2022年最新NFT 开发平台解决方案
- 2018年Android源码下载记录
热门文章
- 对数正态分布均值和方差控制着正态分布什么
- 关于Introduction、Discussion的杂记
- 用matlab代码写一下jackknife方法的校正步骤?、
- addEventListener()
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(5):系统滴答定时器
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(3):嵌套向量中断控制器
- IDEA新建项目配置tomcat
- dnw下载文件时can not open /dev/secbulk0的解决方法
- 聊天机器人简介与体验网址
- 酷炫浪漫表白页面(附代码)HTML5代码类资源