天池赛学术前沿趋势分析Task1 论文数据统计

数据集介绍

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

数据集来源

数据集来自于arxiv官网论文的类别名称,由于数据集有点大,下载需要花费些许时间

部分代码实现过程讲解以及补充

源代码

#读入数据
data  = []
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open("arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx, line in enumerate(f): 
        
        # 读取前100行,如果读取所有数据需要8G内存
        if idx >= 100:
            break
        
        data.append(json.loads(line))
        
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小

补充

关于open和with open

open:

打开文件
    file=open(“文件名”,“读写模式”)

操作文件
   代码段

关闭文件
 file.close()

注意事项:使用open方法,文件操作完毕之后必须手动关闭,否则长期保持对文件的连接状态,造成内存溢出的现象发生。

with open

打开文件
    with open (“文件名”,“读写模式”) as file:

操作文件
    代码段

关闭文件(自动关闭)

注意事项:是自动关闭文件

打开文件方式with open

#打开文本类文件,必要时加上编码类型
with open('xxx.html', 'r', encoding='utf-8')as fp:
    r = fp.read()
    print(r)


#覆盖|创建文本类文件
with open('xxx.html', 'w', encoding='utf-8')as fp:
    fp.write('内容')


#追加|创建文本类文件
with open('xxx.html', 'a', encoding='utf-8')as fp:
    fp.write('内容')


#打开二进制类文件
with open('xxx.html', 'rb')as fp:
    fp.write('内容')


#覆盖|创建二进制类文件
with open('xxx.html', 'wb')as fp:
    fp.write('内容')


#追加|创建二进制类文件
with open('xxx.html', 'ab')as fp:
    fp.write('内容')

Python enumerate() 函数

>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

dataframe后得到数据集:
天池赛学术前沿趋势分析Task1 论文数据统计_第1张图片

继续上代码

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'])

ps:跑这段不仅吃配置,还需要耐心,耐心!

预处理

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

这里使用了 split 函数将多类别使用 “ ”(空格)分开,组成list,并使用 for 循环将独立出现的类别找出来,并使用 set 类别,将重复项去除得到最终所有的独立paper种类。
天池赛学术前沿趋势分析Task1 论文数据统计_第2张图片

关于爬出计算机领域内的所有文章:

#爬取所有的类别
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

#初始化 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":
        level_1_name = t.text    
        level_2_code = t.text
        level_2_name = t.text
    elif t.name == "h3":
        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"])
df_taxonomy

当时好像只找到h2,h4的,h3找不到在哪里
在这里插入图片描述

原来在这里
天池赛学术前沿趋势分析Task1 论文数据统计_第3张图片

本文主要侧重于分析如何对这些数据进行预处理,接下来数据分析/可视化用到的合并、去重、分组聚合、透视表以及matplotlib的一系列基础操作,在这里就不详细展开

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