文章目录
Python - 基于共现提取绘制《流浪地球》人物关系(Gephi)
前不久看了一部令我为之震撼的电影《流浪地球》,这部电影让我看到了国产科幻影视的曙光,在满怀激动的心情下借着这部电影对其中人物关系实现提取和绘制关系图。
1.项目相关概念
项目开始前,我们需要了解几个概念才能对我们需要实现的目标有一个大致实现流程上的思路。
1.1 共现网络
很多同学对共现网络这个概念并不是十分了解,我们在网上搜索共现图。借用两张展示,大致如下这样:
现在大家应该对共现图有一个大致的了解了。其实这就是文献计量学中关键词的共词方法,通常会使用这种方法来确定某文献集中各个学科主题概念之间的关系。这里我们通过《流浪地球》的剧本,来对各个人物之间的关系进行分析,这就是共现关系。
共现网络
其实就是由一组节点(Node)
和一组边(Edge)
组成的,所以我们再绘制关系图之前需要先去获取这组节点和边。每个节点都会有权重,并每两个节点之间会通过一条边进行连接,这条连接线也会拥有权重。低权重的边缘通常都是冗余的,就好比电影中有主配角之分,配角本身可以看做是一个权重很低节点Node
,而配角和其他角色之间的关联关系由于配角的不重要性所以也会变得十分低但却存在的关联关系,所以我们需要通过适当的方法去减少这种冗余的情况。这里我们使用的是一种比较容易理解的方法:过滤,我们可以通过设定阈值去过滤那些重量低的边缘。另外一种就是细分网络,这种方法大家可以自己去翻阅资料了解。
实体间的共现
是一种基于统计的信息提取。我们往往在阅读一篇文章或者观看一个影片、电视时,当同一时间段内同时出现多个人物我们就会认为他们之间存在着某种关联,和我们所了解的共现关系理念相似,所以我们这里的思路就是基于共现关系去分析人物之间的关系。
1.2 jieba分词库
这里我们会对《流浪地球》电影的剧本进行分析,由于我们需要提取段落中的人物,这里选择的是
jieba
库。至于为什么选择这个分词库,好用就完了。不过还是比较准确的,大家可以深入去了解他的优缺点和使用方法。
1.3 Gephi
Gephi
这是一款使用Java开发的复杂网络分析软件,这里我们用于最后共现关系图的绘制,稍后会稍微详细一点进行讲解。
2.项目分析
上面我们也分析了在阅读一篇文章或者观看一个影片、电视时,当同一时间段内同时出现多个人物我们就会认为他们之间存在着某种关联,这也是我们实现共现关系的一个核心思想。我们先将文章以段落分隔,每个段落通过分词将其中出现的人物进行一个记录和统计,并会通过简单的算法将每两个人物之间构建一个关联关系,其实也就是通过共现关系构造任意两点的边。再生成指定格式化的文本数据通过
Gephi
对其进行人物关系绘制。
3.项目编写
这里我们首先下载准备好的《流浪地球》中文剧本以及我们通过百科整理好的所需的【流浪地球主要人物列表】。如果大家想练手需要剧本可以去中国编剧网上找自己需要的资料。
这里我们首先去初始化了几个变量。首先使用字典names
用于保存人物,key为人物名称,value为该人物出现的次数;字典relationships
用于保存人物之间的关联系,即人物关系有向边,key为有向边的起点,value则也是一个字典edge
。在edge
这个字典中key则是有向边的终点,value代表的是当前有向边的权值,可以理解为两个人物之间的紧密程度。lineNames
则是一个缓存变量,用于保存每一段分词中出现的人物信息,lineNames[i]
即表示第i
段出现的所有人物。
3.1 初始化以及引入项目所需库
import codecs
import jieba
import os
from jieba import posseg
class Earth(object):
# 初始化
def __init__(self):
# 姓名字典
self.names = {
}
# 关系字典
self.relationships = {
}
# 每段内人物关系
self.lineNames = []
3.2 提取人物集以及统计人物出现次数
这里我们会去读取《流浪地球》剧本中的每一行,然后通过
jieba
对其进行分词。我们之前在person.txt
中会预先配置好所需的人物名称
、权重
以及自定义词性
,通过分词可以确定当前分词的词性是否是我们所需的人物,并