Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

实验基于简单共现关系,编写 Python 代码从纯文本中提取出人物关系网络,并用Gephi 将生成的网络可视化。

Notifications You must be signed in to change notification settings

wabc1994/BuSUN-Python

Repository files navigation

项目来源(实验楼)

Busan-python Python基于共现提取《釜山行》任务关系

一、课程简介

《釜山行》是一部丧尸灾难片,其人物少、关系简单,非常适合我们学习文本处理。这个项目将介绍共现在关系中的提取,使用python编写代码实现对《釜山行》文本的人物关系提取,最终利用Gephi软件对提取的人物关系绘制人物关系图。

1.内容简介

2.课程知识点

本课程项目完成过程中将学习:

共现网络的基本原理

Python代码对《釜山行》中人物关系提取的具体实现

jieba库的基本使用

Gephi软件的基本使用

$ mkdir work && cd work
$ mkdir gephi && cd gephi
$ wget http://labfile.oss.aliyuncs.com/courses/677/gephi-0.9.1-linux.tar.gz #下载
$ tar -zxvf gephi-0.9.1-linux.tar.gz

-1.liu

-2.xiongcheng

-3.cheng

3.课程来源

二、实验原理

三、开发准备

1.文本就结构

2.确定需要的变量 在work文件下创建代码文件busan.py,开始进行python代码的编写。在代码中,我使用字典类型names保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数。我使用字典类型relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度。lineNames是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineName[i]是一个列表,列表中存储第i段中出现过的人物。

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

3.文本中实体识别 在具体实现过程中,读入《釜山行》剧本的每一行,对其做分词(判断该词的词性是不是"人名"[词性编码: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

4.根据识别结果构建网络 对于 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

5.过滤冗余边并输出结果

6.可视化网络 实验结果:利用可视化工具gephi

About

实验基于简单共现关系,编写 Python 代码从纯文本中提取出人物关系网络,并用Gephi 将生成的网络可视化。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /