任务说明
- 学习主题:作者关联(数据建模任务),对论文作者关系进行建模,统计最常出现的作者关系;
- 学习内容:构建作者关系图,挖掘作者关系
- 学习成果:论文作者知识图谱、图关系挖掘
数据处理步骤
将作者列表进行处理,并完成统计。具体步骤如下:
- 将论文第一作者与其他作者(论文非第一作者)构建图;
- 使用图算法统计图中作者与其他作者的联系;
社交网络分析
图是复杂网络研究中的一个重要概念。Graph是用点和线来刻画离散事物集合中的每对事物间以某种方式相联系的数学模型。Graph在现实世界中随处可见,如交通运输图、旅游图、流程图等。利用图可以描述现实生活中的许多事物,如用点可以表示交叉口,点之间的连线表示路径,这样就可以轻而易举的描绘出一个交通运输网络。
图类型
- 无向图,忽略了两节点间边的方向。
- 有向图,考虑了边的有向性。
- 多重无向图,即两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联。
图统计指标
- 度:是指和该节点相关联的边的条数,又称关联度。对于有向图,节点的入度 是指进入该节点的边的条数;节点的出度是指从该节点出发的边的条数;
- 迪杰斯特拉路径:.从一个源点到其它各点的最短路径,可使用迪杰斯特拉算法来求最短路径;
- 连通图:在一个无向图 G 中,若从顶点i到顶点j有路径相连,则称i和j是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图。
对于其他图算法,可以在networkx和igraph两个库中找到。
知识点
无向图的构建及绘制
- 使用
networkx.Graph()
创建无向图; Graph.add_edge()
来添加节点,同时添加边;Graph.draw()
绘制无向图
import networkx as nx
# 创建无向图
G = nx.Graph()
#authors =[]
# 只用五百篇论文进行构建
# https://www.cjavapy.com/article/560/
for row in data.iloc[:500].itertuples():
authors = row[2]
authors = [' '.join(x[:-1]) for x in authors]
for author in authors[1:]:
G.add_edge(authors[0],author) # 添加节点2,3并链接23节点
# 绘制无向图
nx.draw(G, with_labels=True)
两点之间的最短路径
如上所述,可以通过迪杰斯特拉算法可以找到两点之间的最短路径,而在python中有集成的函数可以直接使用,为networkx.dijkstra_path(图, 节点A ,节点B)
。如:
try:
print(nx.dijkstra_path(G, 'Yoon Sung-Chul', 'Rosswog Stephan'))
except:
print('No path')
以上代码做了try……except……
的异常处理,避免节点之间不存在连通时发生异常中断。
绘制图中节点的度数及频率
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
dmax = max(degree_sequence)
plt.loglog(degree_sequence, "b-", marker="o")
plt.title("Degree rank plot")
plt.ylabel("degree")
plt.xlabel("rank")
绘制子图
绘制子图有两种方式:
- Subplot 将图分为不同的区域,分别进行绘制;
- Axes 在一个图的上进行绘制另一幅图片
具体可参考:python matplotlib中axes与axis的区别是什么1
图的基本测量
nx.number_connect_components(G)
:连通分量数目nx.connected_components(G)
:获取连通分量的节点列表,包含每个连通图的节点列表nx.connected_component_subgraphs(G)
:获取连通分量,返回的是列表,但是元素是图,这些分量按照节点数目从大到小排列,所以第一个就是最大的连通分量)。
图的美化和布局
spring_layout
:布局指定节点排列形式
绘制图的基本方法和美化,可参考networkx笔记:绘制基本网络图2
Gcc = G.subgraph(sorted(nx.connected_components(G), key=len, reverse=True)[0])
pos = nx.spring_layout(Gcc)
plt.axis("off")
nx.draw_networkx_nodes(Gcc, pos, node_size=20)
nx.draw_networkx_edges(Gcc, pos, alpha=0.4)
plt.show()