人一生都可能无法逆天改命,但你却是要去奋斗一把
本文章主要通过最简单的共线性关系,利用gephi工具绘制择天记的人物关系图。
准备工作
-
在网上下载《择天记》小说以及创建小说人物的txt。
- jieba库
- 需要下载gephi软件
注意:安装路径不能有中文字;需要安装java环境,不然无法使用gephi。
定义数据结构
import jieba
names = {}
relationships = {}
linenames = []
all_names = []
names用于存入小说人物和出场次数;relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度;linenames存入每行小说出现的人物;all_names是小说所有人物。
添加人名到jieba词库中
jieba库分词可能并不能把小说的人物都切开,我们需要把这些人名添加到词库中,以便成功分词。
f1 = open('names.txt',encoding='utf-8')
for line in f1.readlines():
all_names.append(line.strip().strip('\ufeff'))
for name in all_names:
jieba.add_word(name)
统计出场人数
f2 = open('择天记.txt',encoding='utf-8')
for line in f2.readlines():
seg_list = jieba.cut(line)
linenames.append([])
for i in seg_list:
if i in all_names:
linenames[-1].append(i)
if names.get(i) is None:
names[i] = 0
relationships[i] = {}
names[i] +=1
通过图可以看出,陈长生作为主角,出场最多,而他的好基友是排第二的,而他的女票徐有容却是排到第五,这与一些玄幻小说不一样,注定了这是一部基情的小说。
人物关系及写入文件
for line in linenames:
for name1 in line:
for name2 in line:
if name1 == name2:
continue
if relationships[name1].get(name2) is None:
relationships[name1][name2]=1
else:
relationships[name1][name2] += 1
import codecs
with codecs.open('tian_node.txt','w','utf-8') as f:
f.write("Id Label Weight\r\n")
for name, times in names.items():
f.write(name + ' ' + name + ' ' + str(times) + '\r\n')
with codecs.open('tian_edge.txt', 'w', "utf-8") as f:
f.write("Source Target Weight\r\n")
for name, edges in relationships.items():
for v, w in edges.items():
if w > 3:
f.write(name + ' ' + v + " " + str(w) + "\r\n")
绘制人物关系图
最后利用gephi绘制人物关系图。
网友评论
陈长生 王之策 117
陈长生 徐有容 1052
陈长生 黑袍 85
陈长生 落落 579
陈长生 庄换羽 134
陈长生 天海牙儿 31
陈长生 茅秋雨 82
陈长生 轩辕破 275
陈长生 秋山君 179
陈长生 苟寒食 566