目录

  • 1《都挺好》简介
  • 2人物共同出现频数
    • 2.1制作主要人物字典
    • 2.2计算人物相互出现的频数
  • 3绘制人物关系图
  • 4重要人物
  • 5社区发现
  • 6人物相关系数
  • 7随时间变化的人物关系
  • 8最后

1《都挺好》简介

该小说讲述了职场金领苏明玉从小不受家人待见,生长在家庭的边缘,在孤独扭曲的环境中长大成人的故事。结局是这样的,苏明哲回到了美国,苏明成和朱丽离婚后不知所踪,苏明玉和石天冬在一起了,三个子女看清了苏大强的为人,没有人再管着他,最终苏大强得了老年痴呆症,苏明玉于心不忍,因此把他接回家照顾。

上图是去除停用词、去除人名、只保留形容词和名词的小说词云图;由图中也可以看出基本都是和家庭相关的词语。

# 小说词云
def getWordCloud():rlist=[]for s in content:for w in pseg.cut(str(s)):if(w.word not in stopdict and w.flag=='a' or w.flag=='n'):rlist.append(w.word)rlist = " ".join(rlist)w = WordCloud(font_path="C:/Users/Windows/fonts/simkai.ttf",width=600,height=400,background_color="black",max_words=50)w.generate(rlist)path=r'C:\Users\Administrator\Desktop\pic.png'w.to_file(path)

2人物共同出现频数

2.1制作主要人物字典

需要把《都挺好》小说txt版下载下来,刚开始我是通过jieba分词把所有nr(人名)的词语保存下来,作为人物集合,但是①某个人物多个称呼 ②nr类型会出现许多不合适的词

words=pseg.cut(single)for w in words:if(w.flag=='nr')

参考电视猫中的人物关系图,单独制作了主要人物词典

#主要人物 姓名词典
pdict={'明玉':['明玉','苏明玉','苏总'],'朱丽':['朱丽','丽丽'],'明哲':['明哲','苏明哲','大哥'],'明成':['明成','苏明成','大哥'],'苏大强':['苏大强','老爹','爸'],'吴非':['吴非'],'苏家':['苏家'],'宝宝':['宝宝'],'老蒙':['老蒙','蒙总'],'小蒙':['小蒙'],'天冬':['天冬','石天冬','石大哥'],'柳青':['柳青'],'蔡根花':['蔡根花'],'钟点工':['钟点工'],'温玮光':['温玮光','温总'],'苏母':['苏母']}#判断na是哪个人物
def getPerson(na):for key,value in pdict.items():if(na in value):return str(key)return '无'

2.2计算人物相互出现的频数

(1)首先初始化一个16×16的人物频数0矩阵。
(2)在小说的每一段中,当这一段中出现了词典中的人物时,就把出现的人物两两对应的频数+1。
(3)遍历频数矩阵的右上半边(或左下半边)获得人物两两之间的频数。

# 计算人物相互出现的频数 保存成顶点-权重
def getPeopleNetwork():plist=list(pdict.keys())N=len(plist)pcount=np.zeros([N,N])#初始化 人物频数 二维矩阵pcount=pd.DataFrame(data=pcount,columns=plist,index=plist)#遍历每一段,出现的人物 频数+1for sentence in content:s_plist=[]#出现的人物集合words=jieba.cut(sentence)for w in words:if(getPerson(w)!='无' and getPerson(w) not in s_plist):s_plist.append(getPerson(w))#根据出现的人物集合 进行频数+1for p1 in s_plist:for p2 in s_plist:pcount.loc[p1][p2]+=1#保存频数二维矩阵pcount.to_excel('./data/人物频数矩阵.xlsx')print('w ok')#根据频数二维矩阵 计算 人物1-人物2-权重p_network=[]for i in np.arange(N):for j in np.arange(i+1,N):p_network.append([plist[i],plist[j],pcount.iloc[i,j]])#保存 边-权重p_network=pd.DataFrame(data=p_network,columns=['人物1','人物2','count'])p_network.to_excel('./data/权重.xlsx')print('w ok')

3绘制人物关系图

节点越大,代表该人物越重要。根据频数范围(400,200,100,30),将边划分成五个程度,红蓝黄紫橙,关系依次减弱。


一共有5条出现次数超过400的关系,其中3条关系是明哲、明成、明玉这三兄妹之间的关系,另外两条是明成、明玉和各自配偶的关系;而苏大强和三位子女的关系也较强,均超过200次,稍弱于三兄妹之间的关系。这表明《都挺好》小说主要围绕三兄妹和父亲进行剧情发展,这也符合我们的实际认知。

#画出第c1-c2章的社交网络图
def drawNetwork(c1,c2):data=pd.DataFrame(pd.read_excel('./data/权重-.xlsx',sheet_name=0)) #data=data[data['人物1']!=data['人物2']]data=data[(data['chapter']>=c1)&(data['chapter']<=c2)]data=data.groupby([data['人物1'],data['人物2']])['count'].sum().reset_index()data=data[data['count']!=0]G=nx.Graph()for index,item in data.iterrows():G.add_weighted_edges_from([(item['人物1'],item['人物2'],item['count'])])pos = nx.spring_layout(G)nx.draw_networkx_labels(G,pos,font_size=11,font_family='simhei')#画标签nx.draw_networkx_nodes(G,pos,nodelist=list(nx.algorithms.pagerank(G).keys()),node_size=[x*3000 for x in list(nx.algorithms.pagerank(G).values())],node_color='lightgreen') if(c1==1 and c2==40):#不同联系强度的边集合 degree1=[(x,y) for (x,y,z)in G.edges(data=True) if z['weight']<30]degree2= [(x, y) for (x, y, z) in G.edges(data=True) if 30<=z['weight'] < 100]degree3= [(x, y) for (x, y, z) in G.edges(data=True) if 100<=z['weight'] < 200]degree4= [(x, y) for (x, y, z) in G.edges(data=True) if 200<=z['weight'] < 400]degree5=[(x,y) for (x,y,z)in G.edges(data=True) if z['weight']>=400]#不同强度的边 宽度、颜色 不同nx.draw_networkx_edges(G, pos, edgelist=degree1, width=0.5, edge_color='orange')nx.draw_networkx_edges(G, pos, edgelist=degree2, width=1.5, edge_color='m')nx.draw_networkx_edges(G, pos, edgelist=degree3, width=3, edge_color='yellow')nx.draw_networkx_edges(G, pos, edgelist=degree4, width=4, edge_color='cornflowerblue')nx.draw_networkx_edges(G,pos,edgelist=degree5,width=6,edge_color='red')else:for e in G.edges(data=True):nx.draw_networkx_edges(G,pos,edgelist=[e],width=e[2]['weight']/10,edge_color='red')plt.axis('off')plt.title('第{}章到第{}章人物关系网络图'.format(c1,c2))plt.show()

4重要人物

调用PageRank算法,可以获得每个节点人物的pr值,我们以此值来衡量人物的重要程度。作为该小说的主角,明玉当仁不让位居第一;值得一提的是,三兄妹位于TOP3,三兄妹及其配偶、父亲苏大强七位人物位于TOP7。

 page_ranks = pd.Series(nx.algorithms.pagerank(G)).sort_values()page_ranks.plot(kind="barh")plt.title('pagerank')plt.show()

5社区发现

结果将《都挺好》的剧情人物自动划分成两个社区:社区1是以明玉为代表的其配偶、生意伙伴;社区2是除了明玉以外的苏家人物集合。很明显,明玉由于从小在家里不受喜欢,长大后和整个苏家是联系较弱的(虽然内心还是有爱的)。可见算法生成的结果也是符合情理的。

    #step2 画社区 都在一张图上part = community.best_partition(G)values = [part.get(node) for node in G.nodes()] #社区nx.draw_networkx_nodes(G,pos,alpha=0.6, node_color=values,node_size=400)nx.draw_networkx_edges(G,pos,edgelist=G.edges,width=0.5,edge_color='orange')nx.draw_networkx_labels(G,pos,font_size=12,font_family='simhei')plt.axis('off')plt.title('社区发现')plt.show()

6人物相关系数

相关系数(x,y)的值代表x和y的联系度,计算方式是x和y都出现的段落/x的段落。图中横着为y,纵着为x。比如人物x和人物y之间共同出现了100次,但是x出现了200次,y出现了1000次;显然y对于x来说更重要,因为y占据了x的50%,而x占据了y的10%。

(1)明玉整体来说对于其他人物来说都比较重要,她对于苏家、小蒙、天冬、柳青、温总的相关系数均超过0.6,除了钟点工和蔡根花,明玉对于其他人的相关系数也较强。
(2)明哲、明成、苏大强对于其他人物来说也较为重要。
(3)和苏大强联系最紧密的三位人物是:明哲-0.48、明成-0.46、明玉-0.33,这表明大儿子和二儿子对于苏大强的重要程度相近,都领先于三女儿对其的重要程度,小说中苏大强跟着二儿子住,一门心思想跟着大儿子去美国享福,所以两人的相关系数最高;这也侧面印证了明玉在苏家不那么受重视。
(4)和明玉联系最紧密的两位人物是明成-0.24和天冬-0.21,和明成联系紧密是因为两人矛盾冲突很大,小说中甚至有明成去殴打明玉的情节;和天冬联系紧密则是因为两人的情侣关系。
(5)有趣的是,对于蔡根花来说,苏大强是其最重要人物,相关系数高达0.65;作为苏大强的保姆,两人的黄昏恋可以说是让人啼笑皆非,在电视剧热播之后“蔡根花宝贝”、“图你年纪大、图你不洗澡”也成为流行一时的梗。

#人物相关系数
def getPeopleRelation():pcount=pd.DataFrame(pd.read_excel('./data/人物频数矩阵.xlsx',sheet_name=0,index_col=0))#第0列作索引N=pcount.shape[0]secondmax=0for i in np.arange(N):count=pcount.iloc[i][i]for j in np.arange(N):pcount.iloc[i,j]/=count#if(pcount.iloc[i,j]>secondmax and pcount.iloc[i,j]!=1):#    secondmax=pcount.iloc[i,j]print(pcount)ax = plt.axes() im = ax.imshow(pcount,cmap=plt.cm.summer,interpolation='none',vmin=0,vmax=0.6,aspect='equal')#vmax如果是1,图会很稀疏plt.colorbar(im, shrink=0.5)plt.xticks(np.arange(N),list(pcount.index))plt.yticks(np.arange(N),list(pcount.index))plt.title('人物相关系数矩阵')plt.show()pcount.to_excel('./data/人物相关系数矩阵.xlsx')print('w ok')

7随时间变化的人物关系

下载得到的《都挺好》小说中有40章,每一章的标题都以对应的数字显示,因此可以计算人物频数时,再加一列数字来表明是第几章。我以每5章为一时间段,制作八个时间段的人物关系网络图。

比如以上面两张图为例,分别是1-5章和6-10章的人物关系网络图。可以看出:前5章就主要是三兄妹家庭之间的联系;而6-10章明玉与天冬、柳青、老蒙的联系突然增强,可能这几章在讲明玉与苏家之间的关系的同时,也兼顾讲述了明玉工作上的情况,所以这些生意伙伴的联系突然增多。

为了显示某两个人物随时间变化的关系,我重新计算八个时间段内的某两个人物的出现次数和相关系数,挑选以下几个进行说明。

(1)明玉对于苏大强的相关系数
从第2时间段的0.2左右开始,明玉对于苏大强的相关系数一直随时间增加到第7时间段的0.45左右,最后一个时间段稍微减少至0.4左右;这表明明玉对于苏大强的重要性在前期较弱,但是随着时间发展,明玉越来越重要,直到最后重要性比第2时间段的重要性多了1倍;由于结局是明玉照顾得了老年痴呆的苏大强,所以明显在后面几个时间段,明玉对于苏大强的关联都较强。

(2)朱丽对于明成的相关系数
从第5时间段的峰值0.6左右开始逐渐减弱,直至最后的0.1左右;这与小说中两人关系破裂最终离婚的剧情也是相符合的。

#获取人物关系随时间变化
def getTimePeople(p1,p2):data=pd.DataFrame(pd.read_excel('./data/权重-.xlsx',sheet_name=0)) y=[] #相关系数y1=[]#p1出现次数y2=[]#p1 p2共同出现次数for c in np.arange(1,40,5): mdata=data[(data['chapter']>=c)&(data['chapter']<=c+4)]mdata=mdata.groupby([mdata['人物1'],mdata['人物2']])['count'].sum().reset_index()mdata=mdata[(mdata['人物1']==p1)|(mdata['人物2']==p1)]for index,item in mdata[(mdata['人物1']==p1)&(mdata['人物2']==p1)].iterrows():count=item[2]y1.append(count)mdata=mdata[(mdata['人物1']==p2)|(mdata['人物2']==p2)]for index,item in mdata.iterrows():y2.append(item[2])y.append(item[2]/count if count>0 else 0)plt.figure()plt.subplot(2, 1, 1)plt.title('{p2}对于{p1}的相关系数'.format(p2=p2,p1=p1))plt.plot(np.arange(1,9),y,color='red')plt.subplot(2, 1, 2)plt.bar(np.arange(1,9),y1)plt.bar(np.arange(1,9),y2)plt.legend(labels=['{p1}的出现次数'.format(p1=p1),'{p1}和{p2}共同出现的次数'.format(p1=p1,p2=p2)],loc='best')plt.show()

8最后

明玉从被苏家嫌弃的三女儿成长为职场女强人,映证着小说结尾的一句话,“自己过得好,才是一切”。在生活这张复杂网络下,每个人又何尝不是一个节点,不断努力丰富自己,也许才能更自主的选择周围的边和联系程度,也许有一天会发现自己所处的“小世界”一切都挺好。

问题:按照每段中出现了不同的人物,就两两进行频数+1的处理思路,但是这样同时有个问题,就是当一段中出现同一个人物不只一次时的情况如何处理,比如某一段出现了A3次,B2次,C1次:
①本作业中使用的是不重复统计,即AA BB CC AB AC BC BA BC CB的次数都+1;
②但是我个人感觉按次数计算也合理,即AA+3 BB+2 CC+1 AB+6 AC+3 BC+2 BA+6 CA+3 CB+2;刚开始我是这么计算的,进行社区发现之后的结果分成了三个社区:明玉及其生意伙伴;明成、朱丽、钟点工小家庭;明哲、苏大强以及苏家其他的人;当时认为这个社区发现结果很合理,三兄妹直接分成对应的三个社区,但是由于这样处理频数是虚高的,所以还是放弃了这种方法,直接用①方法进行处理。
所以针对人物共同出现频数,我也没有去细究如何处理。

参考文章:
https://blog.csdn.net/blmoistawinde/article/details/85344906
https://blog.csdn.net/csdnnews/article/details/84312510
https://blog.csdn.net/erin_hh/article/details/52938211

Python实现《都挺好》社交网络分析相关推荐

  1. 漫谈:Java和Python现在都挺火,我应该怎么选?Java和Python优缺点比较。

    http://www.bossqiang.com/article/4 声明:这是一篇容易引起撕逼的文章,为了祖国和谐,人民安康,请各位看官尽量理性讨论.同时,这篇文章是面向一些初入行的朋友进行一些相对 ...

  2. 基于GraphX实现社交网络分析

    一.社交网络分析的主要应用 在分析复杂的社会.技术以及信息系统时,我们常把这些系统描述成网络的形式.在这样的关系网络中,节点代表一个成员,而边就代表成员之间的关系.在现实生活中,一个人可能从属于不同的 ...

  3. python用社交网络分析_Python社交媒体情感分析入门

    python用社交网络分析 自然语言处理(NLP)是一种机器学习,可解决口语/书面语言与这些语言的计算机辅助分析之间的相关性. 从写作帮助和建议到实时语音翻译和口译,我们在日常生活中经历了NLP的众多 ...

  4. python 求连线相似度_Python分析《都挺好》中的人物关系,苏大强与蔡根花是真爱?...

    如今大火的电视剧<都挺好>源于阿耐的同名小说,今天我们来对这部小说使用python分析一下人物关系.本文主要使用google推出的word2vec进行分析.使用的库主要有jieba.gen ...

  5. python爬取都挺好影视评论,看看大家的共鸣度有多强?

    2019独角兽企业重金招聘Python工程师标准>>> 前言 最近<都挺好>大火,被誉为"最成功国产家庭伦理剧",可能大家也有共鸣的地方,剧中有些事情 ...

  6. Python爬取394452条《都挺好》弹幕数据,发现弹幕比剧还精彩?

    作者 | 周志鹏,2年数据分析,深切感受到数据分析的有趣和学习过程中缺少案例的无奈,遂新开公众号「数据不吹牛」,定期更新数据分析相关技巧和有趣案例(含实战数据集). 来源 | 数据不吹牛(ID:gh_ ...

  7. Python 爬取 394452 条《都挺好》弹幕数据,发现弹幕比剧还精彩?

    狂野男孩大强下线的第三天,想他,想他,想他-- 图源<都挺好>官微 作者 | 周志鹏 责编 | 仲培艺 最近<都挺好>真的挺火. 火到什么程度?微博热搜霸榜,办公室评弹声四起, ...

  8. 用20行Python代码为《都挺好》剧照进行人脸检测

    这里介绍最简单的人脸检测代码,本代码需要用到Opencv和python. Opencv的安装很方便,命令行输入如下命令:pip install opencv-python 即可下载安装opencv, ...

  9. 【实战】用20行Python代码为《都挺好》剧照进行人脸检测

    这里介绍最简单的人脸检测代码,本代码需要用到Opencv和python. Opencv的安装很方便,命令行输入如下命令:pip install opencv-python 即可下载安装opencv, ...

  10. 社交网络分析与反欺诈

    一.总体概述 目前针对图网络结构,比较热门的一个部分就是知识图谱,知识图谱是基于二元关系知识库,构成网络结构,基本组成单位是"实体-关系-实体"的三元组,实体之间通过关系相互联结. ...

最新文章

  1. Leetcode 15.三数之和 双指针 or 暴力哈希
  2. 子shell中使用相关的环境变量
  3. python安装pip_Python的pip安装总是失败怎么办?
  4. 全球及中国自卸车行业深度分析与“十四五”发展战略规划研究报告2022-2028年版
  5. cordova 蓝牙_Ionic通过Cordova插件使用设备能力
  6. java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
  7. div不能控制tr和td的隐藏
  8. html字符实体标签语法,HTML字符实体与文本格式化标签
  9. mysql int类型的长度值
  10. flowable实战(七)flowable核心数据库表清单
  11. e语言mysql中文_大佬们E语言连接MYSQL输出中文乱码怎么破
  12. php如何控制用户对图片的访问 PHP禁止图片盗链
  13. 【英语学习】【English L06】U04 Adventure L4 I got lost in New York
  14. python按行读取excel文件_python3读取excel文件只提取某些行某些列的值方法
  15. 北大计算机QS排名,2019最新QS世界大学排名:清华北大获历史最高名次
  16. 扒一扒「清华系」的 AI 安防大佬们
  17. win10关机后cpu风扇还在转_win10系统关机后风扇还转的解决方法
  18. kettle使用命令行来运行ktr和kjb文件
  19. 使用uniapp做微信小程序,在小程序编辑器运行时编译报错:appid不合法,导致启用不了。
  20. 思科服务器怎么看型号,通过型号快速识别思科路由器,交换机,服务器等设备

热门文章

  1. matlab图像噪声处理,基于matlab图像处理的去噪处理.doc
  2. 换页符'\f'的问题
  3. 【TJOI 2019】唱、跳、rap和篮球
  4. 正确编译差分包签名(MTK系统)
  5. python 邮件抄送是什么意思_python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)...
  6. Java实现百度贴吧自动签到器
  7. python处理PNG的alpha通道
  8. 360全景虚拟现实图片拍摄的注意细节
  9. python+opencv修改像素值、创建图像
  10. js开发飞机大战需求文档