数据来源:https://www.kaggle.com/Cornell-University/arxiv
数据集的格式:
arxiv论文类别介绍
arxiv官网的5.3小节Subject Classifications 的部分有论文的类别及解释。
# 读取数据集
import json
import pandas as pd
path = './arxiv-metadata-oai-2019.json'
data = []
with open(path, 'r') as f:
for idx, line in enumerate(f):
data.append(json.loads(line))
Data = pd.DataFrame(data)
# 打印数据集的第一行
Data.head(1).T
0 | |
---|---|
abstract | We systematically explore the evolution of t… |
authors | Sung-Chul Yoon, Philipp Podsiadlowski and Step… |
authors_parsed | [[Yoon, Sung-Chul, ], [Podsiadlowski, Philipp,… |
categories | astro-ph |
comments | 15 pages, 15 figures, 3 tables, submitted to M… |
doi | 10.1111/j.1365-2966.2007.12161.x |
id | 0704.0297 |
journal-ref | None |
license | None |
report-no | None |
submitter | Sung-Chul Yoon |
title | Remnant evolution after a carbon-oxygen white … |
update_date | 2019-08-19 |
versions | [{‘version’: ‘v1’, ‘created’: 'Tue, 3 Apr 2007… |
print(Data.shape)
print(Data.columns)
#### result ####
(170618, 14)
Index(['abstract', 'authors', 'authors_parsed', 'categories', 'comments',
'doi', 'id', 'journal-ref', 'license', 'report-no', 'submitter',
'title', 'update_date', 'versions'],
dtype='object')
由此可得该数据集有170618个样本,每个样本有14个特征。因为要统计论文的数量,重点关注categories这一特征。
Data['categories'][:20]
unique_categories = []
for l in [x.split(' ') for x in Data['categories']]:
for i in l:
unique_categories.append(i)
print(len(set(unique_categories)))
# 该数据集中论文的类别有172种
#### result ####
172
Data['categories'].describe()
# 共有170618条数据,15592个子类,其中paper中cs.CV类别最多,有5559篇
#### result ####
count 170618
unique 15592
top cs.CV
freq 5559
Name: categories, dtype: object
要对2019年以后的paper进行统计,所以先对时间特征进行预处理,从而得到2019年以后的各类paper
# 将str转化为时间格式,提取年份
Data['year'] = pd.to_datetime(Data['update_date']).dt.year
Data['year'].value_counts()
#### result ####
2019 170618
Name: year, dtype: int64
上面结果显示paper都是2019年的,为了严谨起见,对year还需做一些处理
del Data['update_date']
Data = Data[Data['year']>=2019]
Data.shape
#### result ####
(170618, 14)
接下来要统计2019年计算机各个方向的paper数量,先要搞清楚计算机方向的paper都有哪些类别,可以从https://arxiv.org/category_taxonomy官网上查询,因此先要获取计算机方向paper的类别
import requests
from bs4 import BeautifulSoup # 从网页中爬取数据
# 获取网页的文本数据
website_url = requests.get('https://arxiv.org/category_taxonomy').text
# html.parser python标准库中HTML解析器
soup = BeautifulSoup(website_url, 'html.parser')
# 找出 BeautifulSoup 对应的标签
root = soup.find('div',{
'id':'category_taxonomy_list'})
# 读取 tags
tags = root.find_all(["h2","h3","h4","p"], recursive=True)
print(tags)
#### result ####
level_1_name = ""
level_2_name = ""
level_2_code = ""
level_1_names = []
level_2_codes = []
level_2_names = []
level_3_codes = []
level_3_names = []
level_3_notes = []
for t in tags:
if t.name == "h2": # t.name 是指>里面的内容,即h2,h3
# Computer Science
level_1_name = t.text # t.text 是指去掉>后的文本内容
level_2_code = t.text
level_2_name = t.text
elif t.name == "h3": # Astrophysics
(astro-ph)
raw = t.text # Astrophysics(astro-ph)
# (.*)是指匹配除换行符\n之外的任何单字符零次或多次,()标记一个子表达式的开始和结束
level_2_code = re.sub(r"(.*)\((.*)\)",r"\2",raw) # 将从raw匹配的表达式替换为第二个子表达式 astro-ph
level_2_name = re.sub(r"(.*)\((.*)\)",r"\1",raw) # 将从raw匹配的表达式替换为第一个子表达式 Astrophysics
elif t.name == "h4": # cs.AI (Artificial Intelligence)
raw = t.text # cs.DB (Databases)
level_3_code = re.sub(r"(.*) \((.*)\)",r"\1",raw) # cs.DB
level_3_name = re.sub(r"(.*) \((.*)\)",r"\2",raw) # Databases
elif t.name == "p":
notes = t.text
level_1_names.append(level_1_name)
level_2_names.append(level_2_name)
level_2_codes.append(level_2_code)
level_3_names.append(level_3_name)
level_3_codes.append(level_3_code)
level_3_notes.append(notes)
#根据以上信息生成dataframe格式的数据
df_taxonomy = pd.DataFrame({
'group_name' : level_1_names,
'archive_name' : level_2_names,
'archive_id' : level_2_codes,
'category_name' : level_3_names,
'categories' : level_3_codes,
'category_description': level_3_notes
})
#按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(["group_name","archive_name"])
df_taxonomy.head(1).T
0 | |
---|---|
group_name | Computer Science |
archive_name | Computer Science |
archive_id | Computer Science |
category_name | Artificial Intelligence |
categories | cs.AI |
category_description | Covers all areas of AI except Vision, Robotics… |
df = Data.merge(df_taxonomy, on="categories", how="left").drop_duplicates(["id","group_name"]).groupby("group_name").agg({
"id":"count"}).sort_values(by="id",ascending=False).reset_index()
# 以两个DataFrame共有特征categories进行合并,删除id和group_name重复项,然后以group_name作为类别进行统计,统计结果放在id中并排序
df.head()
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(15,12))
explode = (0, 0, 0, 0.2, 0.3, 0.3, 0.2, 0.1) # 每一块距离中心的距离
plt.pie(df["id"], labels=df["group_name"], autopct='%1.2f%%', startangle=160, explode=explode)
plt.tight_layout()
#plt.savefig('pie.jpg')
plt.show()
统计在计算机各个子领域2019年后的paper数量,使用 merge 函数,对于两个dataframe 共同的特征 categories 进行合并并且进行查询。然后再对于数据进行统计和排序从而得到以下的结果:
cats = Data.merge(df_taxonomy, on="categories").query("group_name == 'Computer Science' ")
cats.groupby(["year","category_name"]).count().reset_index().pivot(index="category_name", columns="year",values="id")