Python实现《都挺好》社交网络分析 您所在的位置:网站首页 《算法》小说 Python实现《都挺好》社交网络分析

Python实现《都挺好》社交网络分析

2023-09-16 16:54| 来源: 网络整理| 查看: 265

目录 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) #遍历每一段,出现的人物 频数+1 for 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)) #根据出现的人物集合 进行频数+1 for 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']


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有