写在最前面,很有幸参加Datawhale第21期组队学习!github开源地址
这里使用的package的版本如下(python 3.7.4):本地是 python 3.7.9 pytorch 1.3.1
一顿操作猛如虎,pip install
就完事了,除了BeautifulSoup:4.8.0,它需要pip install beautifulsoup4
看到**successful!**说明安装完成啦!举个例子:
再检验一下,
终端输入python
进入python模式>>>
输入:import 库
导入库,没有报错,成功!
记住,程序里没有反应就是最好的反应。
格式,通俗地理解就是有序的存的。(觉得是废话的,别理我!)
数据来源
数据集的格式如下:
id:arXiv ID,可用于访问论文;
submitter:论文提交者;
authors:论文作者;
title:论文标题;
comments:论文页数和图表等其他信息;
journal-ref:论文发表的期刊的信息;
doi:数字对象标识符,https://www.doi.org;
report-no:报告编号;
categories:论文在 arXiv 系统的所属类别或标签;
license:文章的许可证;
abstract:论文摘要;
versions:论文版本;
authors_parsed:作者的信息。
我们从arxiv官网,查询到论文的类别名称以及其解释如下。
链接1 或者 链接2
这里使用pycharm
软件,
python
第一步导入库,这里不再赘述,好吧,还是说一说,免得忘了
# 导入所需的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 #画图工具
注意:数据文件夹的位置,没有放到程序包内部的,一个好方法就是使用绝对路径。
使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常。
# 读入数据
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进行分析
print(data.shape) #显示数据大小
print(data.head() #显示数据的前五行)
那么就是类似于:
f = open("arxiv-metadata-oai-snapshot.json", 'r')
# 你的操作
f.close()
相比确实方便。
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'])
re库手册
data = readArxivFile('/home/shangzq/Documents/dataset/arxiv-metadata-oai-2019.json', ['id', 'categories', 'update_date'])
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.groupby(['categories','year']) #以 categories 进行排序,如果同一个categories 相同则使用 year 特征进行排序
data.reset_index(drop=True, inplace=True) #重新编号
# print(data)
# 爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy',verify=False).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
})
我们使用merge函数,以两个dataframe共同的属性 “categories” 进行合并,并以 “group_name” 作为类别进行统计,统计结果放入 “id” 列中并排序。
# 按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(["group_name", "archive_name"])
print(df_taxonomy)
_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()
错误分析:就是没有安装 lxml 包
解决方式:pip install lxml
检查办法:linux服务器上的话 就 ping www.XXX.com
具体网址随便!