学术前沿趋势分析(一):论文数量统计

主要任务

  • 论文数量的统计,即统计2019年全年计算机各个方向论文数量
  • 赛题理解,使用pandas读取数据并进行统计

数据集介绍

数据来源:https://www.kaggle.com/Cornell-University/arxiv
数据集的格式:

  • id:arXiv ID,可用于访问论文;
  • submitter:论文提交者;
  • authors:论文作者;
  • title:论文标题;
  • comments:论文页数和图表等其他信息;
  • journal-ref:论文发表的期刊的信息;
  • doi:数字对象标识符,https://www.doi.org;
  • report-no:报告编号;
  • categories:论文在 arXiv系统的所属类别或标签;
  • license:文章的许可证;
  • abstract:论文摘要;
  • versions:论文版本;
  • authors_parsed:作者的信息。

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]

学术前沿趋势分析(一):论文数量统计_第1张图片
注意到一篇paper可以属于多个类别

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 ####

学术前沿趋势分析(一):论文数量统计_第2张图片
爬虫分析:
学术前沿趋势分析(一):论文数量统计_第3张图片
学术前沿趋势分析(一):论文数量统计_第4张图片
学术前沿趋势分析(一):论文数量统计_第5张图片

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

学术前沿趋势分析(一):论文数量统计_第6张图片
绘制饼图

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

学术前沿趋势分析(一):论文数量统计_第7张图片
统计在计算机各个子领域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")

学术前沿趋势分析(一):论文数量统计_第8张图片

你可能感兴趣的:(Datawhale,python)