大家好,今天跟大家介绍一下如何统计文本中人物出现的次数?

  1. 共现关系
  2. 统计人物出现次数和人物关系输出到文件

一、共现关系:
  在文献计量学中,关键词的共词方法常用来确定该文献集所代表学科中各主题之间的关系。而在讨论一片文章的时候,我们需要来分析剧中各个角色的人物关系。那么我们将人物作为关键词提取出来,然后今天先提取人物的出场次数。
  一般我们认为,在一篇文章中的同一段出现的两个人物之间,一定具有某种关联,因此我们的程序的大致流程也可以确定下来。我们可以先做分词,将每一段中的人物角色抽取出来,然后以段落为单位,统计两个角色同时出现的出现次数,并把结果存在一个二维矩阵之中。这个矩阵也可以作为关系图的矩阵,矩阵中的元素(统计的出现次数)就是边的权值。
  举个例子,比如,现有三个段落的分词结果如下: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_names()print('start process node')with codecs.open(self._dict_path, 'r', 'utf-8') as f:name_list = f.read().split(' 10 nr\r\n')  # 获取干净的name_listfor p in paragraphs:jieba.load_userdict(self._dict_path)# 分词,为每一段初始化新字典poss = jieba.cut(p)self._person_per_paragraph.append([])for w in poss:# 判断是否在姓名字典以及同义词区分if w not in name_list:continueif synonymous.get(w):w = synonymous[w]# 往每段中添加人物self._person_per_paragraph[-1].append(w)# 初始化人物关系,计数if self._person_counter.get(w) is None:self._relationships[w] = {}self._person_counter[w] += 1return self._person_counter

人物关系统计(分析关联人物关系)

def calc_relationship(self):'''统计人物关系权值:return:'''print("start to process edge")# 遍历每一段落,笛卡尔积形式,统计人物关系for p in self._person_per_paragraph:for name1 in p:for name2 in p:if name1 == name2:continueif self._relationships[name1].get(name2) is None:self._relationships[name1][name2] = 1else:self._relationships[name1][name2] += 1return self._relationships

  上面我们将每段中出现的人物信息存放在了p缓存变量中,这里我们对该变量中信息进行分析,将每行中所出现的人物进行两两关联。若两个人物之间尚不存在关联边,则将新建关联边权值置为1,;若已存在,则在原有权值基础上加1。

格式化输出:
  因为最终的人物关系是在gephi中绘制,其是一个开源的复杂网络数据可视化软件,可用于探索数据分析、链路分析、社交网络分析、生物网络分析等。我们需要把数据处理成gephi可接受的csv格式,然后再进行绘制。其关于整个软件的安装在此处下载,点击此处。

def save_node_and_edge(self):'''根据dephi格式保存为csv:return:'''with codecs.open(SAVE_NODE_PATH, "a+", "utf-8") as f:f.write("Id,Label,Weight\r\n")for name, times in self._person_counter.items():f.write(name + "," + name + "," + str(times) + "\r\n")with codecs.open(SAVE_EDGE_PATH, "a+", "utf-8") as f:f.write("Source,Target,Weight\r\n")for name, edges in self._relationships.items():for v, w in edges.items():if w > 3:f.write(name + "," + v + "," + str(w) + "\r\n")print('save file successful!')

输出的结果如下:


  将统计的人物出现次数和人物关系统计出来保存至文件之后,导入gephi过程如下:

  1. 新建工程
  2. 点击数据资料->输入数字表格->,分别添加节点和边的CSV文件数据。

  最后的话,因为我整个统计了文本中所有人物的出现次数,因此数据量会很大,所以可以先进行筛选,将低于某数值次数下的就不统计了,否则会很累赘,我也之后会再更改。

今天文章就分享到这啦,希望有所获。
参考博客:https://www.cnblogs.com/Sinte-Beuve/p/7679392.html

统计中文文本中人物出现次数相关推荐

  1. 【java】统计英文文本中某些字母出现的次数

    如何统计英文文本中某些字母出现的次数 public class Java_3 {public static void main(String[] args) {String text = " ...

  2. Python代码 | 文本操作 统计英文文本中,每个字母出现的次数

    Python代码 | 文本操作 统计英文文本中,每个字母出现的次数 # -*- coding: utf-8 -*- # 使用oepn获取文件路径 # path=open("arrogant. ...

  3. python统计英文文章中单词出现的次数并排序_python,_关于统计某一个 单词 在 文本中 出现的次数,python - phpStudy...

    关于统计某一个 单词 在 文本中 出现的次数 人生苦短,我用Python.用了不会,来到segment. 我是一个python 初学者,想要实现一个"模块",可以让用户输入某个单词 ...

  4. 主表如何统计在附表中的出现次数?

    主表如何统计在附表中的出现次数? 建立主表: create table a1 (id int ,name char(20)); 建立附表: create table a2 (tid int ,name ...

  5. python excel处理重复行并统计个数_python统计一个文本中重复行数的方法

    python统计一个文本中重复行数的方法 这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下 ...

  6. python统计重复的数_python统计一个文本中重复行数的方法

    本文实例讲述了python统计一个文本中重复行数的方法.分享给大家供大家参考.具体实现方法如下: 比如有下面一个文件 2 3 1 2 我们期望得到 2,2 3,1 1,1 解决问题的思路: 出现的文本 ...

  7. Arduino 统计中文字符串中的中文标点符号数量

    Arduino 统计中文字符串中的中文标点符号数量 先科普数据类型和所占内存空间大小 一个英文字符等于1个字节,一个中文(含繁体)字符等于3个字节:中文标点占3个字节,英文标点占1个字节. 1Byte ...

  8. 中文文本中的关键字提取算法总结

    0.关键词提取 定义:从文本中把与这篇文章意义最相关的一些词语抽取出来. 应用:在文献检索.自动文摘.文本聚类/分类等方面有着重要的应用,它不仅是进行这些工作不可或缺的基础和前提,也是互联网上信息建库 ...

  9. c++ 统计英文文本中每个单词的词频并且按照词频对每行排序

    前几天写了Apriori算法之后效率很差,在网上查了很多资料,另外的最大模式挖掘算法一般有FP-Growth 和 Ecalt 算法,这两种效率比较高而FP-Growth算法构建FP-Tree的过程非常 ...

最新文章

  1. Java中实现六种图像处理的效果(灰度化、马赛克效果、去背景实现、珠纹化实现、黑白版画效果、油画效果)
  2. BZOJ 3456: 城市规划(dp+多项式求逆)
  3. “Mvc.ExceptionHandling.AbpExceptionFilter – Processing of the LINQ expression ‘xxx’ by ‘NavigationEx
  4. 20190826:(leetcode习题)反转链表
  5. 系统识别matlab,系统辨识MATLAB
  6. 零成本建立医学数据库之实践
  7. 如何把密度函数化为标准正态二维分布_数理统计第四讲(次序统计量续,伽马分布)...
  8. 判断两条直线的位置关系
  9. linux这么重命名文件,如何在Linux中重命名文件
  10. 开博第一文:成为软件奇才的五要素
  11. 【马司机带带我】君子日三省吾身
  12. 椭圆机会不会练出肌肉腿
  13. LHS查询和RHS查询
  14. 蚂蚁金服彭翼捷:金融科技不止用来改良 更要用来改变
  15. 白领做全身体操可有效防治鼠标手
  16. 关于标准ASCII编码表中:数字、小写英文字母和大写英文字母的前后次序
  17. HWSD全球土壤数据下载处理
  18. 国庆来临之际有感(淡然释怀过去,把握当前,展望未来)
  19. windows10电脑开热点只能用5G频段,不能开2.4G热点,提示所选网络波段不可用
  20. 天蓝网页游戏多开脚本制作系列教程

热门文章

  1. 【内核笔记】博文2021回顾-2022规划
  2. 微信公众号带场景参数的二维码生成与使用?
  3. 网络营销---春节营销案例
  4. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:基于模糊综合评价和灰色关联度的淡水养殖池塘水华分析、预测及净化模型(附一等奖获奖论文和matlab代码)
  5. 网络安全之交换技术篇
  6. java学习o_基础学习之---Java I/O学习(一)
  7. 树莓派上串口TTL转RS485模块
  8. MCMC_calibration
  9. 基于卷积神经网络的猫狗识别
  10. nodejs+Vue+Elementui的校园二手旧书交易交换平台sequelize