查看原文
其他

复杂网络分析数据准备篇

2017-04-26 大邓 大邓带你玩python

请输入标题     bcdef


文本分析之网络关系


上一篇文章直接给大家发了个封装好的复杂网络分析脚本,bug比较多。也不方便自己DIY,今天咱么就条分缕析,一点点拆解。然后大家根据需要,自己DIY吧。

关系图之原始数据

我给大家编了下面两组原始数据,试图画出abcd四元素之间的关系

nodes_data = ['a', 'b', 'c', 'd']

raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']

我们做关系网络前的最初始数据最好就是上面这样子,这种数据格式还是比较简单的。


nodes_data表示节点数据,用来在图中画节点

raw_data中含有共现的相互关系,但是需要进一步的清理规整。

关系图之数据格式

{source: {target: weight}}

source  起点

target    终点

weight  权重(起点到终点次数)


nodes_data = ['a', 'b', 'c', 'd']

raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']

nodes_data和raw_data整理成有权有向数据格式如下:

{'a': {'c': 4},

 'c': {'a': 4, 'd': 2},

 'd': {'c': 2}}

上面的格式即可用来画有权有向图,也可用到无权无向图,还可画有权无向图、无权有向图。


所以数据保存,尽量保存为有权有权有向格式。尽可能保存多的信息,请用有权有向数据格式。

后面所有的关系图数据格式均以有权有向格式为基准。

如何实现有权有向数据格式

nodes_data = ['a', 'b', 'c', 'd']

raw_data = ['acW', 'aca', 'caE', 'ec', 'cd', 'dc']

         ||

         || ?

         \/ 

{'a': {'c': 4},

 'c': {'a': 4, 'd': 2},

 'd': {'c': 2}}


这里很难,我估计我今天也说不太清除。这个只能希望大家悟性比我高,在就是运行下,编点简单的数据实验试验下,发现规律,也就懂了。

nodes_data = ['a','b','c','d']
raw_data = ['acW','aca','caE','ec','cd','dc']

def data(nodes_data, raw_data):
   node_freq = {}  # 节点词频,格式{node:                                      #frequency}
   #有向关系数据结构
   di_relationships = {}  # 关系字典,格式                   #{source_node:{target_node:weight}}
   line_nodes = []        # 保存raw_data中每个元素                                     #列表中出现的节点
   for line in raw_data:
       line_nodes.append([])  #建立[..,[]]容器,方便#后面收集raw_data中每个元素列表中出现的元素#(满足该元素在nodesdata列表中)
       for node in line:
           if node in nodes_data:          

               #如果raw_data中元素列表中的元素在                    #nodesdata中
               line_nodes[-1].append(node) #将满足条#件的元素添加到line_nodes中
               if node_freq.get(node) is None:
                   node_freq[node] = 0
                   di_relationships[node] = {}
               node_freq[node]+=1
   #大邓已经把最难的前半部分注释了,后面你自己#琢磨琢磨吧
   for line in line_nodes:
       for node1 in line:
           for node2 in line:
               if node1 == node2:
                   continue
               if di_relationships[node1].get(node2) is None:
                   di_relationships[node1][node2] = 1
               else:
                   di_relationships[node1][node2]+=1
   #返回元组数据,一般只要元组中的第二个元素,    #即di_relationship
   return (node_freq,di_relationships)

print(data(nodes_data, raw_data)[1])

networkx需要的数据格式

有了上面富有信息量的有向有权格式数据还不行,我们要再将数据微调下,才能使用networkx库。

networkx需要啥数据格式?


data = {'a':{'b':1},
       'c':{'a':2},
       'e':{'b':3},
       'b':{'a':4}}
nodes = {'a','b','c','d','e'}

networkx节点 

#首先导入库,解决中文显示问题

import networkx as nx

import matplotlib.pyplot as plt

from pylab import mpl


#解决显示中文问题

# 指定默认字体

mpl.rcParams['font.sans-serif'] = ['SimHei']   

# 解决保存图像是负号'-'显示为方块的问题mpl.rcParams['axes.unicode_minus'] = False  

可见networkx创建节点需要的数据很简单,就是字符串或者列表(集合也可以的)。而且本身nodes数据就是列表,直接就能用到networkx构建节点中来。


但是networkx构建边时候,要用什么样式的呢?



networkx无向边

可见networkx无向边的构建只需要元组或列表数据,但是如何从有权有向格式数据转化为元组或者列表(集合也可以的)数据呢?


data = {'a':{'b':1},
       'c':{'a':2},
       'e':{'b':3},
       'b':{'a':4}}

一、无权无向边

a->b   和b->a是一条边

data的边的集合是{('e', 'b'), ('c', 'a'), ('a', 'b')}

生成无权无向边数据的代码:

二、 有权无向边

a->b和b->a使得  ab共出现5次。

有权无向边应为

{('c', 'a', 2), ('a', 'b', 5), ('e', 'b', 3)}

networkx有向边

可见networkx无向边的构建只需要元组或列表数据,但是如何从有权有向格式数据转化为元组或者列表(集合也可以的)数据呢?


data = {'a':{'b':1},
       'c':{'a':2},
       'e':{'b':3},
       'b':{'a':4}}

一、无权有向边

a->b   和b->a是一条边

data的边的集合是

{('a', 'b'), ('b', 'a'), ('c', 'a'), ('e', 'b')}

生成无权有向向边数据的代码:

二、有权有向边

[('a', 'b', 1), ('c', 'a', 2), ('e', 'b', 3), ('b', 'a', 4)]

这样更好理解些

weight = data.get(node_k).get(node_v)



其实涉及到有权的边画图,比如让边显示粗细以表示权重大小。这个我还没有实现,主要是刚刚学networkx。不过今天这篇文章的探讨还是很有用的。可以将数据整理成其他绘图软件指定格式。绘制有权图。

写了这么多也不知道大家搞糊涂了没有,反正我写的有点晕!

请输入标题     abcdefg

本期脚本资源

https://pan.baidu.com/s/1hsmlqQw


为iphone用户留下的支持通道



更多内容


文本分析

  python居然有情感??真的吗?? 

 文本分析之网络关系

  自然语言处理库之snowNLP

  数说中南大学研究生感情状况及择偶观  

  用gensim库做文本相似性分析

  基于共现发现人物关系的python实现

  用python计算两文档相似度

神奇的python

 怜香惜玉,我用python帮助办公室文秘

 逆天的量化交易分析库-tushare     

 酷炫的matplotlib

 开扒皮自己微信的秘密

 8行代码实现微信聊天机器人

 使用Python登录QQ邮箱发送QQ邮件

爬虫

  初识Python的GUI编程

  爬虫实战视频专辑

【视频】手把手教你抓美女~

 当爬虫遭遇验证码,怎么办

 知易行难

 用词云图解读“于欢案”

【视频】于欢案之网民的意见(1)?

【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

【视频教程】用python批量抓取简书用户信息

  爬豆瓣电影名的小案例(附视频操作)

  爬豆瓣电影名的小案例2(附视频操作)

  用Python抓取百度地图里的店名,地址和联系方式





100 31347 100 31347 0 0 8720 0 0:00:03 0:00:03 --:--:-- 8719 * Connection #0 to host 37.48.118.90 left intact body>

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存