大家好,今天跟大家介绍一下如何统计文本中人物出现的次数?
- 共现关系
- 统计人物出现次数和人物关系输出到文件
一、共现关系:
在文献计量学中,关键词的共词方法常用来确定该文献集所代表学科中各主题之间的关系。而在讨论一片文章的时候,我们需要来分析剧中各个角色的人物关系。那么我们将人物作为关键词提取出来,然后今天先提取人物的出场次数。
一般我们认为,在一篇文章中的同一段出现的两个人物之间,一定具有某种关联,因此我们的程序的大致流程也可以确定下来。我们可以先做分词,将每一段中的人物角色抽取出来,然后以段落为单位,统计两个角色同时出现的出现次数,并把结果存在一个二维矩阵之中。这个矩阵也可以作为关系图的矩阵,矩阵中的元素(统计的出现次数)就是边的权值。
举个例子,比如,现有三个段落的分词结果如下:a/b/c,b/a/f,a/d/c,那么就是ab共现2次,ac共现2次,以此类推。
同时,为了方便,我们把人物和人物关系也通过文件记录,我们要分析的人物关系则来自于《平凡的世界》(小说)。
由共线关系形成共线网络,共现网络其实就是由一组节点(Node)和一组边(Edge)组成的,所以我们再绘制关系图之前需要先去获取这组节点和边。每个节点都会有权重,并每两个节点之间会通过一条边进行连接,这条连接线也会拥有权重。低权重的边缘通常都是冗余的,就好比电影中有主配角之分,配角本身可以看做是一个权重很低节点Node,而配角和其他角色之间的关联关系由于配角的不重要性所以也会变得十分低但却存在的关联关系,所以我们需要通过适当的方法去减少这种冗余的情况。这里我们使用的是一种比较容易理解的方法:过滤,我们可以通过设定阈值去过滤那些重量低的边缘。另外一种就是细分网络,这种方法大家可以自己去翻阅资料了解。
实体间的共现是一种基于统计的信息提取。我们往往在阅读一篇文章或者观看一个影片、电视时,当同一时间段内同时出现多个人物我们就会认为他们之间存在着某种关联,和我们所了解的共现关系理念相似,所以我们这里的思路就是基于共现关系去分析人物之间的关系。
写在前面的话:
&emsp:&emsp:上篇文章虽然跟大家介绍了一下一片将文本中的人物关系可视化的文章,但是那篇文章是基于Wordcloud来实现的,其设计思路可参考此处,点击此处。
但是我觉得和我的设计思路不是很合适,因此改了一下思路,今天跟大家介绍一下另一种,但是可视化部分见之后的文章,主要是统计人物出场次数,和人物关系。其大致思路如下:
1、准备一份文本人物字典,(由于之前文章跟大家介绍了一下命名实体的识别,因此我已经提取出人物。如果有需要,可参考我之前写的博客,之前博客。)如下图:
2、由于中文语言的特殊性,作者喜欢将前文指代的名字在后文中或许会以人物关系的形式出现,如:前文出现的孙少安,后文可能在某种情景下就写成少安,少安哥诸如此类。此外文本中出现的指代也很多,这不在本次代码实现的考虑范围之内。因此我们要准备一份人物别称字典,比如孙少安,少安,少安哥都是一个人。
二、代码部分
人物出场次数统计代码:
def count_person(self):
'''
统计人物出场次数,添加每段的人物
:return:
'''
paragraphs = self.get_clean_paragraphs()
synonymous = self.synonymous_n