组队学习笔记Task5:论文作者关联

“Stay hungry Stay young”

@Datewhale

任务5:作者信息关联

任务说明

  • 学习主题:作者关联(数据建模任务),对论文作者关系进行建模,统计最常出现的作者关系;
  • 学习内容:构建作者关系图,挖掘作者关系
  • 学习成果:论文作者知识图谱、图关系挖掘

1.读取数据

依旧采用以前写的读取专用函数:

import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
def readFile(path,columns=['id','submitter','authors','title','comments','journal-ref','doi','reeport-no','categories','license','abstract','versions','update_date','author_parsed'],count=None):
    """
    定义本函数用于读取文件,在后续工作中也使用这个函数,比较简便
    参数分别为:
    文件路径、
    读取的列名称(固定值为全部读取)
    读取的行数
    """
    data=[]
    with open(path,'r')as f:
        #enumerate函数将可读取的数据对象转化成有序的各个元组,储存在一个列表中
        for i,line in enumerate(f):
            if i==count:
                break
            d=json.loads(line)
            d={
    
    col:d[col]for col in columns}
            data.append(d)
    data=pd.DataFrame(data)#转化为dataframe模式
    return data
path="D:\\arxiv-metadata-oai-snapshot.json"
data=DateFrame(path,['authors_parsed'],100000)

2.社交网络分析

首先,本次任务是用图来构建作者之间的关系,所以首先介绍一下图(本人刚学完数据结构):
主要分为有向图和无向图,有向图的各个节点的连接箭头是有方向的,这里我们实现的是用无向图来统计:
这里,我们要使用networkx这个包来绘制图,这边贴一个教程:
https://blog.csdn.net/qq_32284189/article/details/80134768
当然,看官方文档也是一个不错的选择,首先先创建一个无节点的无向图:

import networkx as nx
#创建无向图
G=nx.Graph()
#为这个无向图添加节点,以元祖的形式遍历这个series,并返回前五百行,也就是对前五百个作者进行分析
for row in data.iloc[:500].itertuples():
    #去除index
    authors=row[1]
      #将不同作者分割
    authors=[''.join(x[:-1])for x in authors]
    print(authors)
    #第一个作者与其他作者连接1:
    for author in authors[1:]:
        G.add_edge(authors[0],author)

然后用:

nx.draw(G,with_labels=True)

画出这个图,不过。。由于节点过多,我这边没有显示出来,所以采用绘制最大联通子图的方法绘制图,则这里再解释一下极大联通子图的概念:

极大联通子图:意味着对于一个图而言,它的子图,再加入一个节点,就会不连通,这就是极大联通子图

这里的最大连通子图指的是多个极大联通子图中联通节点最多的一个:

# 绘制节点度值折线图,求出了度最大的节点
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
dmax = max(degree_sequence)
##用loglog双对数坐标来显示
plt.loglog(degree_sequence, "b-", marker="o")
plt.title("Degree rank plot")
plt.ylabel("degree")
plt.xlabel("rank")

# 画出子图
""" 四个参数分别为相距坐标轴的距离以及子图坐标轴的长度"""
plt.axes([0.45, 0.45, 0.45, 0.45])
#这个操作用于生成G的最大连通子图,这里connected_components返回联通节点的列表,但将他们从大到小排列后,第一个就是最大的联通分量
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()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45717055/article/details/113147086