相信很多人都知道,《红楼梦》是中国古典小说的巅峰之作,沉迷其中的人太多了,红雪也是经久不衰。当然,今天我们不是来探小说的,而是想用Python来探究红楼梦中人物之间千丝万缕的关系~资料准备红楼txt电子书金陵十二钗+贾宝玉人物名单宝玉nr戴玉nr宝柴nr祥云nr奉节nr李琬nr元春nr郯春nr西春nr妙玉nr乔杰nr秦氏nr此子表为分词,后面的nr为人名含义.先看小说withopen("红楼梦.txt",encoding="gb18030")asf:honglou=f.read()接下来整理出现次数数据honglou=honglou.replace("\n","")honglou_new=honglou.split("")renwu_list=['宝玉','黛玉','宝钗','香云','凤姐','李婉','元春','迎春','探春','惜春','妙玉','巧姐','亲师']renwu=pd.DataFrame(data=renwu_list,columns=['name'])renwu['occurrences']=renwu.apply(lambdax:len([kforkinhonglou_newifx[u'name']ink]),axis=1)renwu.to_csv('renwu.csv',index=False,sep=',')renwu.sort_values('occurrences',ascending=False,inplace=True)attr=renwu['name'][0:12]v1=renwu['occurrences'][0:12]这样我们就得到了attr和v1的两个数据,内容如下,直方图可以通过pyecharts绘制opts(title="红楼梦中上镜的十三个人")))bar.render_notebook()人物关系数据处理我们先对读入内存的小说内容进行jieba分词处理importjiebajieba.load_userdict("renwu_forcut")renwu_data=pd.read_csv("renwu_forcut",header=-1)mylist=[k[0].split("")[0]forkinrenwu_data.values.tolist()]通过load_userdict加载我们上面的自定义词典到jieba下,word库中会进行分词处理tmpNames=[]names={}relationships={}forhinhonglou:h.replace("贾飞","元春")h.replace("李公才","李婉")poss=pseg.cut(h)tmpNames.append([])forwinposs:ifw.flag!='nr'orlen(w.word)!=2orw.wordnotinmylist:continuetmpNames[-1].append(w.word)ifnames.get(w.word)isNone:names[w.word]=0relationships[w.word]={}names[w.word]+=1因为文中的“贾贵妃”、“元淳”、“李公才”、“李婉”等字名混淆严重,这里先做一个替换过程,然后使用jieba库提供的pseg工具做分词处理,每次分词都会返回词性。经过判断后,只有符合要求且在我们提供的词典列表中的分词才会被保留。每出现一个人,就会增加一个,方便后面画关系图的时候确定人物节点的大小。对于我们自定义词典中存在的,将其保存在TMPNAMES中的临时变量中,用于处理每段中的字符关系fornameintmpnames:forname1inname:forname2inname1==name2:conteinueifrelatedShips[name1]。get(name2)isNone:relationships[name1][name2]=1else:relationships[name1][name2]+=1对于出现在同一段落中的字符,我们认为它们是关系同时,每次发生了,关系加1。最后可以将相关信息保存到文件open("relationship.csv","w",encoding='utf-8')asf:f.write("Source,Target,Weight\n")forname,edgesinrelationships.items():forv,winedges.items():f.write(name+","+v+","+str(w)+"\n")withopen("NameNode.csv","w",encoding='utf-8')asf:f.write("ID,Label,Weight\n")forname,timesinnames.items():f.write(name+","+name+","+str(时间)+"\n")文件1:人物关系表,包括先出现的人物,后出现的人物,以及一起出现的次数文件2:人物比例表,包括人物出现的总次数,出场次数越多,所占比例越大,数据分析的比例就越大接下来,我们可以对人物之间的关系做一些简单的分析这里我们仍然使用pyecharts绘制图表defdeal_graph():relationship_data=pd.read_csv('relationship.csv')namenode_data=pd.read_csv('NameNode.csv')relationship_data_list=relationship_data.values.tolist()namenode_data_list=namenode_data.values.tolist()nodes=[]fornodeinnamenode_data_list:ifnode[0]=="宝玉":node[2]/3=nodes.append({"name":node[0],"symbolSize":node[2]/30})links=[]forlinkinrelationship_data_list:links.append({"source":link[0],"target":link[1],"value":link[2]})g=(Graph().add("",nodes,links,repulsion=8000).set_global_opts(title_opts=opts.TitleOpts(title="红楼人物关系")))returng首先,通过pandas将这两个文件读入内存。对于“宝玉”来说,因为它的比例太大,如果统一缩放,会造成其他人物节点太小,显示不美观,先放大一下,最后得到人物关系图如下,今天分享的内容就这些了,下期见~以上是本次分享的所有内容,如果你觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到大量学习资料,涵盖Python电子书、教程、数据库编程、Django、爬虫、云计算等或上编程学习网了解更多编程技术知识。
