文本分析之制作网络关系图——Python

[复制链接]
发表于 : 2017-7-31 17:11:12 最新回复:2017-07-31 17:11:39
4935 1
建赟
建赟  专家

今天给大家带来我一个脚本,用来分析社会网络关系。

http://s1.51cto.com/wyfs02/M02/92/99/wKiom1kBQj3DFVTSAADSwHyTNTI999.jpg

这个图我没有用到gephi或者其他的工具,是我用python纯脚本运行出来的。简单的实现了封装,大家有兴趣可以下载下脚本,运行下。

原理知识

我就简单说下原理吧,先刻画一个简单的图A

  1. import networkx as nx 
  2. import matplotlib.pyplot as plt 
  3. #有向图 
  4. DG = nx.DiGraph() 
  5. #添加一个节点 
  6. DG.add_node('A'
  7. #作图,设置节点名显示,节点大小,节点颜色 
  8. nx.draw(DG,with_labels=True,node_size=900,node_color = 'green'
  9. plt.show() 

http://s5.51cto.com/wyfs02/M00/92/98/wKioL1kBQkrCL2FzAABUls-f4z4668.jpg

双节点,有方向A–>B

  1. #有向图 
  2. DG = nx.DiGraph() 
  3. #添加一个节点 
  4. DG.add_node('A'
  5. DG.add_node('B'
  6. #添加边,有方向,A-->B 
  7. DG.add_edge('A','B'
  8. #作图,设置节点名显示,节点大小,节点颜色 
  9. nx.draw(DG,with_labels=True,node_size=900,node_color = 'green'
  10. plt.show() 

http://s5.51cto.com/wyfs02/M00/92/98/wKioL1kBQlbDJAv9AABlUV5XDyk822.jpg

添加更多节点

  1. import networkx as nx 
  2. import matplotlib.pyplot as plt 
  3.  
  4. colors = ['red''green''blue''yellow'
  5. #有向图 
  6. DG = nx.DiGraph() 
  7. #一次性添加多节点,输入的格式为列表 
  8. DG.add_nodes_from(['A''B''C''D']) 
  9. #添加边,数据格式为列表 
  10. DG.add_edges_from([('A''B'), ('A''C'), ('A''D'), ('D','A')]) 
  11. #作图,设置节点名显示,节点大小,节点颜色 
  12. nx.draw(DG,with_labels=True, node_size=900, node_color = colors) 
  13. plt.show() 

http://s4.51cto.com/wyfs02/M00/92/99/wKiom1kBQmLR7sxpAAB-0I_DqDc531.jpg

好了,同样的道理,咱们建立角色词典,插入节点列表,然后遍历插入有向边关系,就能做出这图:

http://s2.51cto.com/wyfs02/M01/92/99/wKiom1kBQm2xU6IZAADSwMnmYes479.jpg

《Python基于共现提取《釜山行》人物关系》

这篇文章写的很好(希望不要黑我,我也是觉得真心好)。我基本上借鉴了这篇文章思路写今天这个脚本,实现了自动生成关系网络图。

准备工作

  1. 一、安装matplotlib、networkx 
  2.  
  3. 二、解决matplotlib无法写中文问题 
  4.  
  5. 1、找到pythonX\lib\site-packages\matplotlib\mpl-data\fonts\ttf文件夹 
  6.  
  7. 2、matplotlib默认调用的为DejaVuSans.ttf字体文件,网上下载个 
  8.  
  9. 微软雅黑.ttf 
  10.  
  11. 3、将微软雅黑文件名改为DejaVuSans.ttf粘贴到ttf文件夹下即可。 

脚本文件简介

http://s3.51cto.com/wyfs02/M01/92/98/wKioL1kBQnnzWG6EAABmNxNPjtM788.jpg

你下载后脚本文件夹名为:人民的名义

其中的relationship.py就是大邓写的库(直接能调用的哦)

实现功能:

1、读入小数数据和角色词典后,对数据分词后生成角色关系数据(有向关系数据)

2、无需gephi绘图即可制作绚丽角色关系网络图。

注意:

1、运行脚本前,文件夹中只保留角色名单.txt 人民的名义.txt 和 relationship.py

2、要想图片好看点,一定要联网啊。里面我写了个爬虫,爬取一个配色网站的配色值。

如果你们想单机也可以画出好看的图,可以修改下代码,将代码爬虫部分改成读取本地颜色数据

使用示例

1、建好小说数据中的角色字典,格式如下

http://s2.51cto.com/wyfs02/M01/92/98/wKioL1kBQoXTxpmJAABS7yJDQuA116.jpg

2、在文件夹中放入小说txt文件(人民的名义.txt)

3、在脚本文件夹中新建一个test.py文件

  1. #导入relationship库中的Relationship类 
  2. from relationship import Relationship 
  3.  
  4. #自定义节点词典(小说中人物角色) 
  5. dictpath = r'/Users/suosuo/Desktop/人民的名义/角色名单.txt' 
  6. #小说路径,只能是编码方式为utf-8的txt文件 
  7. datapath = r'/Users/suosuo/Desktop/人民的名义/人民的名义.txt' 
  8. #程序运行生成的角色关系图保存地址 
  9. pic = r'/Users/suosuo/Desktop/人民的名义/人物关系图.png' 
  10. Re = Relationship(dictpath, datapath) 
  11. relation = Re.relationship() 
  12. graph = Re.network_digraph(relation, pic) 

4、运行

http://s5.51cto.com/wyfs02/M00/92/99/wKiom1kBQpKCj-wEAACn0v9mWkQ967.jpg

文件夹中生成了 人物关系图.png、node_edge.txt和node_freq.txt文件。

http://s2.51cto.com/wyfs02/M02/92/98/wKioL1kBQp6y6nZXAACAzwLYfW0414.jpg

node_edge.txt 有向图关系数据,可以后续导入gephi软件自定义制图

node_freq.txt 节点出现频率

注意:每次运行前请把人物关系图.png、node_edge.txt和node_freq.txt文件删除掉,再运行。


  • x
  • 常规:

点评 回复

跳转到指定楼层
建赟
建赟  专家 发表于 2017-7-31 17:11:39 已赞(0) 赞(0)

顶一个!
  • x
  • 常规:

点评 回复

发表回复
您需要登录后才可以回帖 登录 | 注册

警告 内容安全提示:尊敬的用户您好,为了保障您、社区及第三方的合法权益,请勿发布可能给各方带来法律风险的内容,包括但不限于政治敏感内容,涉黄赌毒内容,泄露、侵犯他人商业秘密的内容,侵犯他人商标、版本、专利等知识产权的内容,侵犯个人隐私的内容等。也请勿向他人共享您的账号及密码,通过您的账号执行的所有操作,将视同您本人的行为,由您本人承担操作后果。详情请参看“隐私声明
如果附件按钮无法使用,请将Adobe Flash Player 更新到最新版本!
登录参与交流分享

登录参与交流分享

登录