Loading

【数据分析】学术前沿分析(3)——论文代码统计

前言

赛题说明

任务

任务1 :论⽂数量量统计(数据统计任务):统计2019年全年,计算机各个⽅方向论⽂数量;
任务2 :论⽂作者统计(数据统计任务):统计所有论⽂作者出现评率Top10的姓名;
任务3 :论⽂代码统计(数据统计任务):统计所有论⽂类别下包含源代码论文的比例;
任务4 :论⽂分类(数据建模任务):利用已有数据建模,对新论文进行类别分类;
任务5 :作者关联(数据建模任务):对论文作者关系进⾏建模,统计最常出现的作者关系;

可视性任务

任务1:统计分析每个类别论⽂在不同时期的热⻔关键词,分析arXiv论⽂常见关键词的发展趋势,
并进⾏统计可视化;
任务2:统计分析每个类别论⽂综述句子的长度、情感和定冠词,并进⾏可视化;
任务3:统计分析论⽂作者的关联度,通过关联挖掘进行分析;

代码

导入库

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("arxiv-metadata-oai-2019.json", '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', 'abstract', 'categories', 'comments'])

对pages进行抽取

# 使用正则表达式匹配,XX pages
data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x)))

# 筛选出有pages的论文
# 对每一行使用len函数
data_with_page=data[data['pages'].apply(len) > 0]
# 这里要创建一个副本
data_with_page1=data_with_page.copy()
# 由于匹配得到的是一个list,如['19 pages'],需要进行转换
data_with_page1['pages']=data_with_page['pages'].apply(lambda x: float(x[0].replace(' pages', '')))

对pages进行统计

data['pages'].describe().astype(int)

来按照分类统计论文页数,选取了论文的第一个类别的主要类别

# 选择主要类别 先根据' '分开,再根据'.'分开
data['categories'] = data['categories'].apply(lambda x: x.split(' ')[0])
data['categories'] = data['categories'].apply(lambda x: x.split('.')[0])

# 每类论文的平均页数
plt.figure(figsize=(12, 6))
data.groupby(['categories'])['pages'].mean().plot(kind='bar')

来对论文图表个数进行抽取

data['figures'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* figures', str(x)))
data1 = data[data['figures'].apply(len) > 0]
data=data1.copy()  # 这里的data和上面的data也不一样了
data['figures'] = data1['figures'].apply(lambda x: float(x[0].replace(' figures', '')))

对论文的代码链接进行提取

# 筛选包含github的论文(comments和abstract里面是否有github)
data_with_code = data[
    (data.comments.str.contains('github')==True)|
                      (data.abstract.str.contains('github')==True)
]

data_with_github=data_with_code.copy()
# 空值用''填充
data_with_github['text'] = data_with_code['abstract'].fillna('') + data_with_code['comments'].fillna('')

# 使用正则表达式匹配论文(带有github链接的)
pattern = '[a-zA-z]+://github[^\s]*'
data_with_github['code_flag'] = data_with_github['text'].str.findall(pattern).apply(len)

对论文按照类别进行绘图

# data_with_code_flag = data_with_github[data_with_github['code_flag'] == 1] 
data_with_code_flag = data_with_github[data_with_github['code_flag'] >= 1] 
data_with_code_flag

plt.figure(figsize=(12, 6))
data_with_code_flag.groupby(['categories'])['code_flag'].count().plot(kind='bar')
posted @ 2021-01-19 22:59  AI_Ruler  阅读(224)  评论(0编辑  收藏  举报