近 30 年来,arXiv 一直向公众和研究社区提供开放访问的学术文章,从物理学的广阔分支到计算机科学的众多子学科,再到经济学等所有领域,包括数学、统计学、电气工程、定量生物学等。这一丰富的信息库提供了重要的深度,但有时也会显得令人难以应对。

在这些独特的全球挑战时期,从数据中高效提取洞察至关重要。为了使 arXiv 更加易于访问,康奈尔大学将 arXiv元信息数据集存放在 Kaggle 供大家下载,该数据集目前含 268 万篇元信息,如文章标题、作者、类别、摘要、全文 PDF 等。


一、数据集概况

数据集名: arXiv学术论文元数据
数据来源: https://arxiv.org/
提交日期: 1986-04-25 ~ 2025-03-13(数据每周更新)
论文数量: 2689088(截止到2025.3.14)
所含字段: 标题、作者、摘要、期刊信息、DOI等
数据格式: json
数据体积: 4.58G
下载数据: https://www.kaggle.com/datasets/Cornell-University/arxiv
本文声明: 科研用途; 如分享有问题,可加微信372335839,备注「姓名-学校-专业」



二、查看数据

2.1 读取数据

import pandas as pd

df = pd.read_json('arxiv-metadata-oai-snapshot.json', lines=True)
print('论文数量: ', len(df))
df.head()

Run

论文数量: 2689088


2.2 提交日期

字段 versions 中含论文提交日期信息,可以通过如下代码提取并保存为字段 created

df['created'] = df['versions'].apply(lambda text: text[0]['created'])
df['created'] = pd.to_datetime(df['created'])

print('提交日期: ', df['update_date'].min().date(), '~', df['update_date'].max().date())

Run

提交日期:  1986-04-25 ~ 2025-03-13

2.3 所含字段

for col in df.columns:
    print(f' - {col}')

Run

 - id               ArXiv ID(可以用来访问论文,详情请见下方)
 - submitter        论文提交者
 - authors          论文作者
 - title            标题
 - comments         附加信息,例如页数和图表数量
 - journal-ref      论文发表的期刊信息
 - doi              论文的DOI号(数字对象标识符)
 - report-no        报告编号(作者在提交到arXiv前已经获得作者所属机构的报告编号)
 - categories       arXiv 系统的类别/标签
 - license          论文所依据的许可协议
 - abstract         论文摘要
 - versions         版本历史
 - update_date      论文更新日期
 - authors_parsed   论文作者

字段数据的缺失程度

import missingno as ms

ms.matrix(df)


2.4 作者

可以使用字段 authors_parsed 计算每篇论文的作者数量

df['N_authors'] = df['authors_parsed'].apply(lambda ap: len(ap))
df['N_authors'] 

Run

0          4
1          2
2          1
3          1
4          2
          ..
2689083    7
2689084    4
2689085    3
2689086    1
2689087    3
Name: N_authors, Length: 2689088, dtype: int64

data = df['N_authors'].value_counts().sort_index(ascending=True).reset_index()
data['N_authors'] = data['N_authors'].astype(str)
data



三、可视化

3.1 论文年度提交量

from plotnine import *
from matplotlib.font_manager import FontProperties

font_prop = FontProperties(fname='文泉驿微米黑.ttf')

data = df.created.dt.year.value_counts().sort_index().reset_index()


(
    ggplot(data, aes(x='created', y='count'))
    +geom_bar(stat='identity')
    +labs(title='arXiv论文年度提交量趋势图(1986-2025.3)',
          x='',
          y='')
    + annotate(
        'text',
        x= 1986,
        y= data['count'].max() * 1.05,
        label='公众号: 大邓和他的Python',
        ha='left',
        va='top',
        size=10,
        color='black',
    )
    +scale_x_continuous(breaks=range(1986, 2026, 3))
    +theme(figure_size=(8, 5),
           text=element_text(family= font_prop.get_name(), size=8, rotation=0),
           plot_title = element_text(size=13, rotation=0, weight='bold'),
           axis_text_x = element_text(size=8, rotation=0))
)


3.2 作者数量分布图

from plotnine import *
from matplotlib.font_manager import FontProperties

font_prop = FontProperties(fname='文泉驿微米黑.ttf')

data = df['N_authors'].value_counts().sort_index(ascending=True).reset_index()

(
    ggplot(data.head(20), aes(x='N_authors', y='count'))
    +geom_bar(stat='identity')
    +labs(title='arXiv每篇论文作者数量分布图',
          x='',
          y='')
    + annotate(
        'text',
        x= 16,
        y= data['count'].max() ,
        label='公众号: 大邓和他的Python',
        ha='left',
        va='top',
        size=10,
        color='black',
    )
    +scale_x_continuous(breaks=range(0, 21, 1))
    +theme(figure_size=(8, 5),
           text=element_text(family= font_prop.get_name(), size=8, rotation=0),
           plot_title = element_text(size=13, rotation=0, weight='bold'),
           axis_text_x = element_text(size=8, rotation=0))
)


3.3 前10大研究热点

from plotnine import *
import pandas as pd
from matplotlib.font_manager import FontProperties

font_prop = FontProperties(fname='文泉驿微米黑.ttf')
data = df['categories'].value_counts().reset_index()
data.sort_values(by='count', ascending=False, inplace=True)
data['categories'] = pd.Categorical(data['categories'], categories=data['categories'], ordered=True)

(
    ggplot(data.head(10), aes(x='categories', y='count'))  # 注意这里x和y的位置
    + geom_bar(stat='identity')
    + labs(title='arXiv每篇论文作者数量分布图',
           x='',
           y='')
    + coord_flip()  # 翻转坐标轴以创建水平条形图
    + theme(figure_size=(8, 4),
            text=element_text(family=font_prop.get_name(), size=8, rotation=0),
            plot_title=element_text(size=12, rotation=0, weight='bold'),
            axis_text_x=element_text(size=8, rotation=0))
)