乌班图 python实战项目:《釜山行》人物关系可视化

实验过程:
实验前环境准备:

mkdir work && cd work         #创建work文件夹,作为工作目录
mkdir gephi && cd gephi
wget http://labfile.oss.aliyuncs.com/courses/677/gephi-0.9.1-linux.tar.gz     #下载gephi 
tar -zxvf gephi-0.9.1-linux.tar.gz     #解压
wget http://labfile.oss.aliyuncs.com/courses/677/busan.txt  #在work目录下下载《釜山行》的中文剧本

安装jieba
1).git clone https://github.com/fxsjy/jieba.git 这个安装时间还蛮长的
2).cd jieba
3). git checkout jieba3k
4).python setup.py install 如果提示错误权限不够–>sudo python setup.py install

下面是py文件源码,可直接下载,然后python bushan.py,跳转到可视化步骤

如果python bushan.py之后出现下面这种错误
错误处理:在python2.7下,将字符串写入到文件时会出现”UnicodeEncodeError: ‘ascii’ codec can’t encode ****这种错误(后面是啥我给忘了),原因是由于python基于ASCII处理字符的,当出现不属于ASCII的字符时,会出现错误信息。因此,指定文件字符集为utf-8
解决方法:
在文件头部加入以下代码:
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)

wget http://labfile.oss.aliyuncs.com/courses/677/busan.py  #在work目录下下载源码

实验步骤:
1.观察文本结构、准备词典
在work文件夹下创建dict.txt文件,把人名写进去
or
直接下载

wget http://labfile.oss.aliyuncs.com/courses/677/dict.txt

2.具体代码

# -*- coding: utf-8 -*-
import os, sys
import jieba, codecs, math
import jieba.posseg as pseg


names = {}			# 姓名字典,保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数
relationships = {}	# 关系字典,保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度
lineNames = []		# 每段内人物关系,是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineName[i]是一个列表,列表中存储第i段中出现过的人物

# count names   读入《釜山行》剧本的每一行,对其做分词(判断该词的词性是不是“人名”[词性编码: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

# explore relationships   对于 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

# output   将已经建好的 names 和 relationships 输出到文本,以方便 gephi 可视化处理。输出边的过程中可以过滤可能是冗余的边,这里假设共同出现次数少于 3 次的是冗余边,则在输出时跳过这样的边。输出的节点集合保存为 busan_node.txt ,边集合保存为 busan_edge.node 。
with codecs.open("busan_node.txt", "w", "gbk") as f:
	f.write("Id Label Weight\r\n")
	for name, times in names.items():
		f.write(name + " " + name + " " + str(times) + "\r\n")

with codecs.open("busan_edge.txt", "w", "gbk") as f:
	f.write("Source Target Weight\r\n")
	for name, edges in relationships.items():
		for v, w in edges.items():
			if w > 3:
				f.write(name + " " + v + " " + str(w) + "\r\n")

3.运行PY文件:python busan.py
在文件夹work下将会生成busan_node.txt和busan_edge.node
节点集合busan_node.txt,边集合busan_edge.txt
如下图:
在这里插入图片描述在这里插入图片描述
4.使用gephi将人物关系可视化
具体操作参考:
https://blog.youkuaiyun.com/oxuzhenyi/article/details/55511138

over,结束,睡觉啦?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值