论文趋势分析-作者关系图谱

github:链接
论文趋势分析专栏:链接

论文趋势分析-作者关系图谱

  • 1数据预处理
    • 1.1数据读取
    • 1.2数据连接
  • 2统计机器学习领域的作者图谱
    • 2.1抽取机器学习领域的数据
    • 2.2绘制图谱
    • 2.3找到Machine Learning领域合作数量最多的作者
      • 2.3.1第一步生成连接图
      • 2.3.2按连接的边数进行排序
    • 2.4找到与Beygelzimer Alina'合作的作者
    • 2.5提取与Beygelzimer Alina'合作的连接图
    • 2.6绘制与作者们与其他人合作的频率
    • 2.7绘制最大联通子图

1数据预处理

1.1数据读取

# 导入所需的package
import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具
def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi',
       'report-no', 'categories', 'license', 'abstract', 'versions',
       'update_date', 'authors_parsed'], count=None):
    '''
    定义读取文件的函数
        path: 文件路径
        columns: 需要选择的列
        count: 读取行数
    '''
    
    data  = []
    with open(path, 'r') as f: 
        for idx, line in enumerate(f): 
            if idx == count:
                break
                
            d = json.loads(line)
            d = {
     col : d[col] for col in columns}
            data.append(d)

    data = pd.DataFrame(data)
    return data

data = readArxivFile('D:\code\Github\data\AcademicTrendsAnalysis/arxiv-metadata-oai-snapshot.json', 
                     ['id','categories','authors_parsed'],
                    200000)

data['categories'] = data.categories.str.split(' ',expand=True)[0]
category = pd.read_csv('D:\code\Github\data\AcademicTrendsAnalysis\categories.csv')

1.2数据连接

data = data.merge(category,how='left')
data.head(3)
id categories authors_parsed group_name archive_name archive_id category_name category_description
0 0704.0001 hep-ph [[Balázs, C., ], [Berger, E. L., ], [Nadolsky,... Physics High Energy Physics - Phenomenology hep-ph High Energy Physics - Phenomenology Description coming soon
1 0704.0002 math.CO [[Streinu, Ileana, ], [Theran, Louis, ]] Mathematics Mathematics Mathematics Combinatorics Discrete mathematics, graph theory, enumeratio...
2 0704.0003 physics.gen-ph [[Pan, Hongjun, ]] Physics Physics physics General Physics Description coming soon

2统计机器学习领域的作者图谱

2.1抽取机器学习领域的数据

data_ML = data.loc[data.category_name == 'Machine Learning']
data_ML.shape
(596, 8)

2.2绘制图谱

  • 为了方便显示,仅取用了前十篇论文
  • baseline中的data取的太多,改小一点就可以正常显示图谱了
import networkx as nx 
# 创建无向图
G = nx.Graph()

# 只用五篇论文进行构建
for row in data_ML.iloc[:10].itertuples():
    authors = row[3]
    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)

论文趋势分析-作者关系图谱_第1张图片

2.3找到Machine Learning领域合作数量最多的作者

2.3.1第一步生成连接图

  • itertuples用于迭代DataFrame对象
  • G.add_edge()向图中添加边
G = nx.Graph()
for row in data_ML.itertuples():
    authors = row[3]
    authors = [' '.join(x[:-1]) for x in authors]
    
    # 第一个作者 与 其他作者链接
    for author in authors[1:]:
        G.add_edge(authors[0],author)

2.3.2按连接的边数进行排序

  • 可以看到,合作数量做多的三个人,他们分别曾于10,9,8个人进行过合作
num_sorted = sorted(dict(G.degree()).items(),key=lambda x :x[1],reverse=True)
for i,(name,num) in enumerate(num_sorted):
    if i <3:
        print(name,':',num)
Beygelzimer Alina : 10
Aran Oya  : 9
Liu Han : 8

2.4找到与Beygelzimer Alina’合作的作者


G['Beygelzimer Alina']
AtlasView({'Langford John': {}, 'Dasgupta Sanjoy': {}, 'Lifshits Yuri': {}, 'Sorkin Gregory': {}, 'Strehl Alex': {}, 'Li Lihong': {}, 'Reyzin Lev': {}, 'Schapire Robert E.': {}, 'Hsu Daniel': {}, 'Zhang Tong': {}})

2.5提取与Beygelzimer Alina’合作的连接图

def func(x):
    s = ''
    for i in x:
        t = ' '.join(i)
        s += t+','
    return s 
data_temp= data_ML.authors_parsed.apply(func=func)
data_ML_beya= data_temp[data_temp.str.contains('Beygelzimer Alina')]
# 创建无向图
import networkx as nx
G = nx.Graph()

# 只用五篇论文进行构建
for row in data_ML_beya.to_frame().itertuples():
    authors = row[1]
    authors = authors.split(',')
    
    # 第一个作者 与 其他作者链接
    for author in authors[1:]:
        G.add_edge(authors[0],author) # 添加节点2,3并链接23节点
nx.draw(G, with_labels=True)

论文趋势分析-作者关系图谱_第2张图片

2.6绘制与作者们与其他人合作的频率

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.bar(range(len(nx.degree_histogram(G))) ,nx.degree_histogram(G))
plt.xlabel('合作作者的数量')
plt.ylabel('人数')
plt.title('机器学习领域论文论文作者与其他人合作的数量')

Text(0.5, 1.0, '机器学习领域论文论文作者与其他人合作的数量')

论文趋势分析-作者关系图谱_第3张图片

2.7绘制最大联通子图

  • 每个节点都代表一个作者

#取出每个节点的度(链接边数)
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
dmax = max(degree_sequence)

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()

论文趋势分析-作者关系图谱_第4张图片

你可能感兴趣的:(论文趋势分析,机器学习,数据分析,可视化,python)