python基于共现网络文本提取人物关系

在代码中,我使用字典类型names保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数。我使用字典类型relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度。lineNames是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineName[i]是一个列表,列表中存储第i段中出现过的人物。

import os, sys
import jieba, codecs, math
import jieba.posseg as pseg
names = {} # 姓名字典
relationships = {} # 关系字典
lineNames = [] # 每段内人物关系

在具体实现过程中,读入《釜山行》剧本的每一行,对其做分词(判断该词的词性是不是“人名”[词性编码:nr],如果该词的词性不为nr,则认为该词不是人名),提取该行(段)中出现的人物集,存入lineName中。之后对出现的人物,更新他们在names中的出现次数。

jieba.load_userdict("dict.txt") # 加载字典
with codecs.open("busan.txt", "r", "utf8") as f:
 for line in f.readlines():
 poss = pseg.cut(line) # 分词并返回该词词性
 lineNames.append([]) # 为新读入的一段添加人物名称列表
 for w in poss:
 if w.flag != "nr" or len(w.word) < 2:
 continue # 当分词长度小于2或该词词性不为nr时认为该词不为人名
 lineNames[-1].append(w.word) # 为当前段的环境增加一个人物
 if names.get(w.word) is None:
 names[w.word] = 0
 relationships[w.word] = {}
 names[w.word] += 1 # 该人物出现次数加 1

你可以在 with 代码块之后添加以下代码输出生成的 names 来观察人物出现的次数:

for name, times in names.items():
 print(name, times)

对于 lineNames 中每一行,我们为该行中出现的所有人物两两相连。如果两个人物之间尚未有边建立,则将新建的边权值设为 1,否则将已存在的边的权值加 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 # 两人共同出现次数加 1

将已经建好的 names 和 relationships 输出到文本,以方便 gephi 可视化处理。输出边的过程中可以过滤可能是冗余的边,这里假设共同出现次数少于 3 次的是冗余边,则在输出时跳过这样的边。输出的节点集合保存为 busan_node.txt ,边集合保存为 busan_edge.txt 。

with codecs.open("busan_node.txt", "w", "gbk") as f:
 f.write("Id Label Weightr
")
 for name, times in names.items():
 f.write(name + " " + name + " " + str(times) + "r
")
with codecs.open("busan_edge.txt", "w", "gbk") as f:
 f.write("Source Target Weightr
")
 for name, edges in relationships.items():
 for v, w in edges.items():
 if w > 3:
 f.write(name + " " + v + " " + str(w) + "r
")

前面对《釜山行》剧本中的人物关系数据进行了处理,下面我们将使用gephi这个软件来将人物关系可视化,以便展示的更直观,毕竟生硬的数字和文本,或许只有你才懂,其他人可看不明白。使用 gephi 导入生成的网络,并生成简单的可视化布局。关于gephi的使用我们将在以后介绍。

python基于共现网络文本提取人物关系

展开阅读全文

页面更新:2024-03-06

标签:釜山   关系   人物   分词   词性   生硬   人名   这个软件   终点   字典   剧本   文本   次数   名称   类型   体育   列表   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top