学术前沿趋势分析 Task1:论文数据统计

学术前沿趋势分析 Task1:论文数据统计

    • 一、任务说明
    • 二、数据及背景
    • 三、具体代码实现及解释
      • 1、导入数据集
      • 2、数据预处理
      • 3、数据分析及可视化

一、任务说明

  • 任务主题:论文数量统计,即统计2019年全年计算机各个方向论文数量;
  • 任务内容:赛题的理解、使用 Pandas 读取数据并进行统计;
  • 任务成果:学习 Pandas 的基础操作;
  • 可参考的学习资料:开源组织Datawhale joyful-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:作者的信息。
  • 数据集示例如下:
"root":{
     
   	"id":string"0704.0001"
   	"submitter":string"Pavel Nadolsky"
   	"authors":string"C. Bal\'azs, E. L. Berger, P. M. Nadolsky, C.-P. Yuan"
   	"title":string"Calculation of prompt diphoton production cross sections at Tevatron and LHC energies"
   	"comments":string"37 pages, 15 figures; published version"
   	"journal-ref":string"Phys.Rev.D76:013009,2007"
   	"doi":string"10.1103/PhysRevD.76.013009"
   	"report-no":string"ANL-HEP-PR-07-12"
   	"categories":string"hep-ph"
   	"license":NULL
   	"abstract":string"  A fully differential calculation in perturbative quantum chromodynamics is presented for the production of massive photon pairs at hadron colliders. All next-to-leading order perturbative contributions from quark-antiquark, gluon-(anti)quark, and gluon-gluon subprocesses are included, as well as all-orders resummation of initial-state gluon radiation valid at next-to-next-to leading logarithmic accuracy. The region of phase space is specified in which the calculation is most reliable. Good agreement is demonstrated with data from the Fermilab Tevatron, and predictions are made for more detailed tests with CDF and DO data. Predictions are shown for distributions of diphoton pairs produced at the energy of the Large Hadron Collider (LHC). Distributions of the diphoton pairs from the decay of a Higgs boson are contrasted with those produced from QCD processes at the LHC, showing that enhanced sensitivity to the signal can be obtained with judicious selection of events."
   	"versions":[
   			0:{
     
   					"version":string"v1"
   					"created":string"Mon, 2 Apr 2007 19:18:42 GMT"
   				}
   			1:{
     
   					"version":string"v2"
   					"created":string"Tue, 24 Jul 2007 20:10:27 GMT"
   				}]
   	"update_date":string"2008-11-26"
   	"authors_parsed":[
   			0:[
   					0:string"Balázs"
   					1:string"C."
   					2:string""]
   			1:[
   					0:string"Berger"
   					1:string"E. L."
   					2:string""]
   			2:[
   					0:string"Nadolsky"
   					1:string"P. M."
   					2:string""]
   			3:[
   					0:string"Yuan"
   					1:string"C. -P."
   					2:string""]]
}

三、具体代码实现及解释

1、导入数据集

首先导入相关的包:用于画图的seaborn和matplotlib;用于爬虫;BeautifulSoup和requests;用于数据处理、读取数据的json和pandas;用于匹配字符串模式的re;用于建立model的sklearn;用于复杂网络数据分析的networkx。安装时可以直接 pip install {packagename} 。

# 导入所需的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 #画图工具
import json

由于数据量太大,所以先读取数据的前1000行。将读取的数据转化为DataFrame格式,方便用pandas分析。

data  = [] #初始化
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open("arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx,line in enumerate(f): 
        print(idx)
        print(line)
        if idx > 1000:
            break
        data.append(json.loads(line))

data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
print(data.shape) #显示数据大小
data.head()

数据前五行结果如下:
学术前沿趋势分析 Task1:论文数据统计_第1张图片
我们的任务是统计2019年全年计算机各个方向论文数量,所以只选取部分特征进行分析即可(‘id’, ‘categories’, ‘update_date’)。

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('arxiv-metadata-oai-snapshot.json', ['id', 'categories', 'update_date'])

此时数据格式为:
学术前沿趋势分析 Task1:论文数据统计_第2张图片

2、数据预处理

首先对数据中论文类别进行统计分析

data["categories"].describe()

学术前沿趋势分析 Task1:论文数据统计_第3张图片
可以看到论文数据量为1796911,不同的子类别有62055种。但部分论文种类不止一种,这里算成了不同的种类,所以我们需要使用 split 函数将多类别使用 “ ”(空格)分开,组成list,并使用 for 循环将独立出现的类别找出来,并使用 set 类别,将重复项去除得到最终所有的独立paper种类。

unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
print(len(unique_categories))
print(unique_categories)

结果表明,有176种paper种类。
学术前沿趋势分析 Task1:论文数据统计_第4张图片
计算机方向的论文种类数如下,有40种。

cs_categories = []
for i in unique_categories:
    if re.match('cs.', i):
        cs_categories.append(i)
print(cs_categories,len(cs_categories))

在这里插入图片描述
接着我们对2019年之后的时间特征进行预处理,得到2019年之后的论文。

data["year"] = pd.to_datetime(data["update_date"]).dt.year #将update_date从例如2019-02-20的str变为datetime格式,并提取处year
del data["update_date"] #删除 update_date特征,其使命已完成
data = data[data["year"] >= 2019] #找出 year 中2019年以后的数据,并将其他数据删除
data.reset_index(drop=True, inplace=True) #重新编号
print(data)

下面我们将不同领域论文的具体类别信息爬取下来,以寻找计算机领域的论文。
参考http://c.biancheng.net/view/2011.html了解python爬虫的相关知识。使用的Beautiful Soup 库能够轻松解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用。HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中,它为一个复杂的树形结构,每个节点都是Python对象。

#爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy').text #获取网页的文本数据
soup = BeautifulSoup(website_url,'lxml') #爬取数据,这里使用lxml的解析器,加速
root = soup.find('div',{
     'id':'category_taxonomy_list'}) #找出 BeautifulSoup 对应的标签入口
tags = root.find_all(["h2","h3","h4","p"], recursive=True) #读取 tags

find和find_all方法参数如下(参考资料):
学术前沿趋势分析 Task1:论文数据统计_第5张图片
查看网页源码,在elements中找到我们想要的信息:

#初始化 str 和 list 变量
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":#"h2"论文大类
        level_1_name = t.text    
        level_2_code = t.text
        level_2_name = t.text
    elif t.name == "h3":#论文种类的子类如ASTROPHYSICS(ASTRO-PH)
        raw = t.text
        level_2_code = re.sub(r"(.*)\((.*)\)",r"\2",raw) #正则表达式:模式字符串:(.*)\((.*)\);被替换字符串"\2";被处理字符串:raw
        level_2_name = re.sub(r"(.*)\((.*)\)",r"\1",raw)
    elif t.name == "h4":#论文最小类别
        raw = t.text
        level_3_code = re.sub(r"(.*) \((.*)\)",r"\1",raw)
        level_3_name = re.sub(r"(.*) \((.*)\)",r"\2",raw)
    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"])
print(df_taxonomy)

这里re.sub(r"(.) ((.))",r"\1",raw):

.表示匹配任意1个字符
*表示匹配前一个字符出现0次多次或者无限次
\(表示匹配“(” 具体的这个语句,(.*)为括号前所有的str,\((.*)\)为后面括号的str 例如:
原始的str为:Astrophysics(astro-ph)
经过re.sub(r"(.*)\((.*)\)",r"\2",raw)后的str为 astro-ph
经过re.sub(r"(.*)\((.*)\)",r"\1",raw)后的str为 Astrophysics
\1表示()前的部分
\2表示()里的部分

学术前沿趋势分析 Task1:论文数据统计_第6张图片

3、数据分析及可视化

我们首先看一下所有大类的paper数量分布,使用merge函数,以两个dataframe共同的属性 “categories” 进行合并,并以 “group_name” 作为类别进行统计,统计结果放入 “id” 列中并排序:

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

_df

结果如下:
学术前沿趋势分析 Task1:论文数据统计_第7张图片
使用饼图可视化:

fig = plt.figure(figsize=(15,15))
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.show()

学术前沿趋势分析 Task1:论文数据统计_第8张图片
下面统计在计算机各个子领域2019年后的paper数量:

group_name="Computer Science"
cats = data.merge(df_taxonomy, on="categories").query("group_name == @group_name")
result = cats.groupby(["year","category_name"]).count().reset_index().pivot(index="category_name", columns="year",values="id") 
result

我们同样使用 merge 函数,对于两个dataframe 共同的特征 categories 进行合并并且进行查询。然后我们再对于数据进行统计和排序从而得到以下的结果:
学术前沿趋势分析 Task1:论文数据统计_第9张图片
学术前沿趋势分析 Task1:论文数据统计_第10张图片
计算2019年之后各类别论文总数并排序:

result['total'] = result[2020]+result[2019]
result.sort_values("total",inplace=True,ascending=False)
result

计算机领域论文数最多的前十个大类如下:
学术前沿趋势分析 Task1:论文数据统计_第11张图片
Computer Vision and Pattern Recognition(计算机视觉与模式识别)类是CS中paper数量最多的子类,遥遥领先于其他的CS子类,并且paper的数量还在逐年增加;另外,Computation and Language(计算与语言)、Cryptography and Security(密码学与安全)以及 Robotics(机器人学)的2019年paper数量均超过1000或接近1000,这与我们的认知是一致的。

你可能感兴趣的:(数据分析实战,数据分析)