Task1|Datawhale:论文数量统计

Task1:论文数量统计

# -*- coding: utf-8 -*-
"""
Created on Mon Jan 11 16:07:31 2021

@author: Zoey

task1:论文数量统计,即统计2019年全年计算机各个方向论文数量
"""

#######  1.1 导⼊package并读取原始数据
import seaborn as sns
from bs4 import BeautifulSoup #用于爬取arxiv数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json
import pandas as pd
import matplotlib.pyplot as plt


data = []
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open('F:/qyz/a2sdu/datawhale_20200110/arxiv-metadata-oai-2019.json','r') as f:
    for idx, line in enumerate(f):
        # 读取前100行,如果读取所有数据需要8G内存
        if idx >= 1000:
            break
        
        data.append(json.loads(line))
        
data = pd.DataFrame(data)
data.shape

data.head() #显示数据的前五行

'''
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 >= 1000:
                break
            
            d = json.loads(line)
            d = {col: d[col] for col in colums}
            data.append(d)
    data  = pd.DataFrame(data)
    return data

data = readArxivFile('F:/qyz/a2sdu/datawhale_20200110/arxiv-metadata-oai-2019.json',['id', 'categories', 'update_date'])
'''


###### 1.2 数据预处理
    
#count:一列数据的元素个数;
#unique:一列数据中元素的种类;
#top:一列数据中出现频率最高的元素;
#freq:一列数据中出现频率最高的元素的个数
data['categories'].describe()
#set顾名思义是集合,里面不能包含重复的元素,接收一个list作为参数
unique_categories = set([i for l in [x.split(' ') for x in data['categories']] for i in l])
'''
上式为列表生成式等价于:
y = []
for x in data['categories']:
    y.append(x.split(' '))
    
i1 = []
for l in y:
    for i in l:
        i1.append(i)
参考https://www.cnblogs.com/yyds/p/6281453.html
len(set(i1)) #33
'''

len(unique_categories)
unique_categories

#获取2019年以后的论文
#将update_date从例如2019-02-20的str变为datetime格式,并提取处year
data['year'] = pd.to_datetime(data['update_date']).dt.year
del data['update_date']
data = data[data['year'] >= 2019]

#以 categories 进行排序,如果同一个categories 相同则使用 year 特征进行排序
#data.groupby(['categories','year'])
data.reset_index(drop=True, inplace=True) #重新编号

#挑选出计算机领域内的所有文章

#爬取所有类别
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
        #正则表达式:模式字符串:(.*)\((.*)\);被替换字符串"\2";被处理字符串:raw
        level_2_code = re.sub(r'(.*)\((.*)\)',r'\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
        
})

df_taxonomy['archive_name']

#按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(['group_name','archive_name'])

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


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

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





你可能感兴趣的