DataWhale数据分析打卡营
开源内容
1. 研究目的
统计arXiv数据集中论文代码的页数
在本系列第一篇博客中已经详细介绍过arXiv数据集↓
- Kaggle上的一个数据集,可以理解为计算机领域论文信息库。
- 是一个有很多行的表,每一行代表一篇论文,记录每一篇论文的作者、标签、发表年份等信息。
2. 主要内容
这次做的内容主要使用正则表达式匹配。
代码来自Datawhale开源内容,只做了重新编排,非原创…
(1)读取数据
只读取我们需要使用的列即可,作者通常会在abstract或者comments处留下代码链接或者写下代码页数。
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', 'abstract', 'categories', 'comments'])
(2)获取代码页数并分析
作者在评论部分写下代码页数的情况
# 使用正则表达式匹配,XX pages
data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x)))
# 筛选出有pages的论文
data = data[data['pages'].apply(len) > 0]
# 由于匹配得到的是一个list,如['19 pages'],需要进行转换
data['pages'] = data['pages'].apply(lambda x: float(x[0].replace(' pages', '')))
a. 相关统计量
data['pages'].describe().astype(int)
statistics | value |
---|---|
count | 1089180 |
mean | 17 |
std | 22 |
min | 1 |
25% | 8 |
50% | 13 |
75% | 22 |
max | 11232 |
b. 按照类别计算代码页数均值
获得荧光部分即为主要类别。
# 选择主要类别
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)))
data = data[data['figures'].apply(len) > 0]
data['figures'] = data['figures'].apply(lambda x: float(x[0].replace(' figures', '')))
作者在评论部分留下github链接
# 筛选包含github的论文
data_with_code = data[
(data.comments.str.contains('github')==True)|
(data.abstract.str.contains('github')==True)
]
data_with_code['text'] = data_with_code['abstract'].fillna('') + data_with_code['comments'].fillna('')
# 使用正则表达式匹配论文
pattern = '[a-zA-z]+://github[^\s]*'
data_with_code['code_flag'] = data_with_code['text'].str.findall(pattern).apply(len)
其他情况
a. 作者留下文件下载地址,pdf格式或者工程文件格式
b. 代码在论文附录中
c. 伪代码*
啊,问,就是不会!(理直气壮.jpg)