python代码画⼈物_⽤Python+Gephi画《⼈民的名义》⼈物关
系图
理⼀下画关系图的步骤:
愚人节怎么整人最好玩
⾸先,要到《⼈民的名义》的台词(或剧本),可以使⽤UTF8编码的txt⽂件。
其次,要提取剧中的⾓⾊,这⾥我们使⽤jieba分词模块来提取⽂本中的⾓⾊名,得到图的“节点”
然后,为再剧本中每⼀段中出现的若⼲个⾓⾊,两两之间建⽴⼀条“边”,根据两两⾓⾊⼀同出现频度,来决定边的“权值”
最后,根据上⾯的信息,使⽤Gephi来图
可以先定义三个变量
# names : 保存⼈物,键为⼈物名称,值为该⼈物在全⽂中出现的次数
黑人范玮琪
# relationship : 保存⼈物关系的有向边,键为有向边的起点,值为⼀个字典 edge ,edge 的键为有向边的终点,值是有向边的权值,
# 代表两个⼈物之间联系的紧密程度
# lineNames : 缓存变量,保存对每⼀段分词得到当前段中出现的⼈物名称
names = {}
relationships = {}
lineNames = []
1.提取⾓⾊(节点)
jieba分词中对⼈名的识别不够准确,⽐如,可能会把“明⽩”、“⽂明”这样的词识别为⼈名,针对这个问题,可以建⽴⽤户⾃定义字典,以提⾼《⼈民的名义》中⼈名的识别准确率。
可以在⽹上查⾓⾊表,写⼊⼀个txt⽂件。如下是⼀个⾃定义字典的⽰例,每⾏第⼀个代表字典中的词,第⼆个代表频数,第三个代表词性
侯亮平 100 nr
沙瑞⾦ 100 nr
李达康 100 nr
⾼育良 100 nr
祁同伟 100 nr
陆亦可 100 nr
⾼⼩琴 100 nr
吴慧芬 100 nr
刘新建 100 nr
陈岩⽯ 100 nr
季昌明 100 nr
赵瑞龙 100 nr
郑西坡 100 nr
钟⼩艾 100 nr
赵东来 100 nr
蔡成功 100 nr
欧阳菁 100 nr
丁义珍 100 nr
程度 100 nr
陈海 100 nr
郑胜利 100 nr
王⽂⾰ 100 nr
⽥国富 100 nr
赵德汉 100 nr
易学习 100 nr
梁璐 100 nr
孙连成 100 nr
肖钢⽟ 100 nr
林华华 100 nr
jieba.load_userdict("")
在分词后判断⼀个词是否为⼈名,可以⽤下⾯两个条件筛选,满⾜条件的可以⼈为不是⼈名1) 该词词性不为 “nr” 2) 该词长度⼩于2
with codecs.open("⼈民的名义.txt", 'r', 'utf8') as f:
for line adlines(): # 注意是 readlines 要加s 不加s 只读取⼀⾏
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) # 为当前段的环境增加⼀个⼈物
(w.word) is None: # 如果某⼈物(w.word)不在⼈物字典中
names[w.word] = 0
relationships[w.word] = {}
names[w.word] += 1
可以查看⼀下结果:
# 输出⼈物出现次数统计结果
for name, times in names.items():
print(name, times)
2.创建⾓⾊关系(边)
# 对于 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
3.输出图的信息
# 由于分词的不准确会出现很多不是⼈名的“⼈名”,从⽽导致出现很多冗余边,为此可设置阈值为10,即当边出现10次以上则认为不是冗余
with codecs.open("", "w", "utf8") as f:
f.write("ID Label Weight\r\n")
for name, times in names.items():
if times > 10:
f.write(name + " " + name + " " + str(times) + "\r\n")
with codecs.open("", "w", "utf8") as f:
f.write("Source Target Weight\r\n")
for name, edges in relationships.items():
for v, w in edges.items():
if w > 10:
f.write(name + " " + v + " " + str(w) + "\r\n")
节点:
边:
⾄此⼯作已完成⼀⼤半。
4.使⽤Gephi画图
笔者是在Windows环境下使⽤Gephi,为了能将图的信息导⼊Gephi,需要对上⾯的与⽂件进⾏预处理。Linux环境可以跳过此步骤。
我们借助Office的Excel将txt⽂件转换为csv⽂件(⼀种逗号分隔的⽂件)
打开Excel -> 数据 -> ⾃⽂本 -> 选择要转换的txt⽂件
梁朝伟 董洁选择下⼀步
注意选择分隔符号为空格怎样培养教育孩子