小说人物关系可视化


随缘更新

之前看到了一些关于小说人物之间联系的可视化,看起来挺好玩的。(真的很简单)由于网上给的教程不完善,所以就自己实现了一下。

##原理

人物出场次数:用jieba分词后对人名出现次数进行统计

人物互动关系:将小说按段落划分后进行jieba分词与人名匹配。然后将出现的人名两两配对后计数。

配置输出:将人物出场次数(Id,Label,Weight,如:name1,name1,times)任务互动关系(Source,Target,Weight,如:name1,name2,times)存储为gephi接受的csv格式

可视化(gephi):导入数据后调整可视化参数即可。

文末会附一份教程word,本身这个教程也是因为朋友需要才写的,所以完全0基础也可以使用。

##流程

###文件准备

准备一份「小说.txt」 和 一份「人名.txt」。

「人名.txt」长这样:

###环境

  1. python3 (依赖 jieba)

    pip install jieba

  2. java
  3. getphi

###怎么处理呢?

这段只作为说明,实际可用代码见文末

先让 jieba 加载字典。
使用 readlines 逐行读取。
使用 jieba.cut 分词。
给这行维护一个list。
将出现的人名维护进list。
将人名list 放入 dict 作为 key,出现一次 +1 (人物出现的次数就统计出来了)。
将一段中两两出现的人计数(任务互动的关系也出来了)。
将二者存储为gephi 接收的csv格式就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import jieba
names = {} # 姓名字典
lineNames = [] # 姓名检索
relationships = {} # 关系字典
jieba.load_userdict(jieba_dict)
with codesc.open(filepath,'r','utf-8') as f:
for lines in f.readlines():
poss = jieba.cut(lines)
lineNames.append([])
for w in poss:
if w not in name_set: # 如果关键字不在 name_set 中存在就跳过
continue
self._lineNames[-1].append(w)
if self._names.get(w) is None:
self._names[w] = 0
relationships[w] = {}
self._names[w] += 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] = relationships[name1][name2]+ 1

最后我们只要把数据导入到gephi中去生成自己喜欢的图形就好啦。

文末会附上详细的使用文档。

看看gephi生成的关系图吧。



代码和说明:zealotCE/Character-interaction-visualization

感谢前人探路:基于共现发现人物关系的python实现

gephi教程(虽然没看):Gephi 中文教程 - Udemy