论文作者统计
任务说明
任务主题:论⽂作者统计,统计所有论⽂作者出现频率Top10的姓名;
任务内容:论⽂作者的统计、使⽤ Pandas 读取数据并使⽤字符串操作;
任务成果:学习 Pandas 的字符串操作;
数据处理步骤
在原始arxiv数据集中论⽂作者 authors 字段是⼀个字符串格式,其中每个作者使⽤逗号进⾏分隔分,所
以我们我们⾸先需要完成以下步骤:
- 使⽤逗号对作者进⾏切分;
- 剔除单个作者中⾮常规的字符;
具体操作可以参考以下例⼦
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFwJ1ScV-1610805520422)(attachment:image.png)]
当然在原始数据集中 authors_parsed 字段已经帮我们处理好了作者信息,可以直接使⽤该字段完成后
续统计
字符串处理
在Python中字符串是最常⽤的数据类型,可以使⽤引号(‘或’)来创建字符串。 Python中所有的字符都使
⽤字符串存储,可以使⽤⽅括号来截取字符串,如下实例:
import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息(用于封装http)
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具
var1 = 'Hello Datawhale!'
var2 = "Python Everwhere!"
print("var1[-10:]: ", var1[-10:])
print("var2[1:5]: ", var2[0:7])
var1[-10:]: Datawhale!
var2[1:5]: Python
同时在Python中还⽀持转义符:
Python中还内置了很多内置函数,⾮常⽅便使⽤:
具体代码实现以及讲解
数据读取
data = []
with open("arxiv-metadata-oai-2019.json", 'r') as f:
for idx, line in enumerate(f):
d = json.loads(line)
d = {'authors': d['authors'], 'categories': d['categories'],'authors_parsed': d['authors_parsed']}#为了分离开方便转化为dataframe的形式
data.append(d)
data = pd.DataFrame(data)
data
authors | categories | authors_parsed | |
---|---|---|---|
0 | Sung-Chul Yoon, Philipp Podsiadlowski and Step... | astro-ph | [[Yoon, Sung-Chul, ], [Podsiadlowski, Philipp,... |
1 | B. Dugmore and PP. Ntumba | math.AT | [[Dugmore, B., ], [Ntumba, PP., ]] |
2 | T.V. Zaqarashvili and K Murawski | astro-ph | [[Zaqarashvili, T. V., ], [Murawski, K, ]] |
3 | Sezgin Aygun, Ismail Tarhan, Husnu Baysal | gr-qc | [[Aygun, Sezgin, ], [Tarhan, Ismail, ], [Baysa... |
4 | Antonio Pipino (1,3), Thomas H. Puzia (2,4), a... | astro-ph | [[Pipino, Antonio, ], [Puzia, Thomas H., ], [M... |
... | ... | ... | ... |
170613 | V. A. Sautenkov, M. D. Lukin, C. J. Bednar, G.... | quant-ph | [[Sautenkov, V. A., ], [Lukin, M. D., ], [Bedn... |
170614 | Wen-Xiu Ma, Benno Fuchssteiner | solv-int nlin.SI | [[Ma, Wen-Xiu, ], [Fuchssteiner, Benno, ]] |
170615 | J C Eilbeck, V Z Enol'skii, V B Kuznetsov, D V... | solv-int nlin.SI | [[Eilbeck, J C, ], [Enol'skii, V Z, ], [Kuznet... |
170616 | M. Adler, T. Shiota and P. van Moerbeke | solv-int adap-org hep-th nlin.AO nlin.SI | [[Adler, M., ], [Shiota, T., ], [van Moerbeke,... |
170617 | D.B. Fairlie and A.N. Leznov | solv-int nlin.SI | [[Fairlie, D. B., ], [Leznov, A. N., ]] |
170618 rows × 3 columns
为了⽅便处理数据,我们只选择了三个字段进⾏读取。
数据统计
接下来我们将完成以下统计操作:
- 统计所有作者姓名出现频率的Top10;
- 统计所有作者姓(姓名最后⼀个单词)的出现频率的Top10;
- 统计所有作者姓第⼀个字符的评率;
为了节约计算时间,下⾯选择部分类别下的论⽂进⾏处理:
# 选择类别为cs.CV下⾯的论⽂
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)] #lambda是用cs.CV下⾯的x替换之前的x
# 拼接所有作者
all_authors = sum(data2['authors_parsed'], []) #后面空着的一个[]是留给频率的
all_authors
[['Pal', 'Mahesh', ''],
['Mokhov', 'Serguei A.', '', 'for the MARF R&D Group'],
['Sinclair', 'Stephen', '', 'for the MARF R&D Group'],
['Clément', 'Ian', '', 'for the MARF R&D Group'],
['Nicolacopoulos', 'Dimitrios', '', 'for the MARF R&D Group'],
['Aholt', 'Chris', ''],
['Sturmfels', 'Bernd', ''],
['Thomas', 'Rekha', ''],
['Ronda', 'José I.', ''],
['Valdés', 'Antonio', ''],
['Gallego', 'Guillermo', ''],
['Guha', 'Tanaya', ''],
['Ward', 'Rabab K.', ''],
['Olaizola', 'Igor G.', ''],
['Quartulli', 'Marco', ''],
['Florez', 'Julian', ''],
['Sierra', 'Basilio', ''],
['Xie', 'Xiaohua', ''],
['Xu', 'Kai', ''],
['Mitra', 'Niloy J.', ''],
['Cohen-Or', 'Daniel', ''],
['Chen', 'Baoquan', ''],
['Guha', 'Tanaya', ''],
['Nezhadarya', 'Ehsan', ''],
['Ward', 'Rabab K', ''],
['Gao', 'Fei', ''],
['Tao', 'Dacheng', ''],
['Gao', 'Xinbo', ''],
['Li', 'Xuelong', ''],
['Sun', 'Yuli', ''],
['Tao', 'Jinxu', ''],
['Liu', 'Conggui', ''],
['Sun', 'Yuli', ''],
#中间略
['Desrosiers', 'Christian', ''],
['Zhou', 'Linjun', ''],
['Cui', 'Peng', ''],
['Yang', 'Shiqiang', ''],
['Zhu', 'Wenwu', ''],
['Tian', 'Qi', ''],
...]
处理完成后 all_authors 变成了所有⼀个list,其中每个元素为⼀个作者的姓名。我们⾸先来完成姓名
频率的统计。
# 拼接所有的作者
authors_names = [' '.join(x) for x in all_authors]#先连成list
authors_names
['Pal Mahesh ',
'Mokhov Serguei A. for the MARF R&D Group',
'Sinclair Stephen for the MARF R&D Group',
'Clément Ian for the MARF R&D Group',
'Nicolacopoulos Dimitrios for the MARF R&D Group',
'Aholt Chris ',
'Sturmfels Bernd ',
'Thomas Rekha ',
'Ronda José I. ',
'Valdés Antonio ',
'Gallego Guillermo ',
'Guha Tanaya ',
'Ward Rabab K. ',
'Olaizola Igor G. ',
'Quartulli Marco ',
'Florez Julian ',
#(中间略)
'Ayed Ismail Ben ',
'Yuan Jing ',
'Desrosiers Christian ',
'Zhou Linjun ',
'Cui Peng ',
'Yang Shiqiang ',
'Zhu Wenwu ',
'Tian Qi ',
...]
authors_names = pd.DataFrame(authors_names) #再转换成dataframe的形式
authors_names
0 | |
---|---|
0 | Pal Mahesh |
1 | Mokhov Serguei A. for the MARF R&D Group |
2 | Sinclair Stephen for the MARF R&D Group |
3 | Clément Ian for the MARF R&D Group |
4 | Nicolacopoulos Dimitrios for the MARF R&D Group |
... | ... |
49139 | Ti Yen-Wu |
49140 | Chen Dian |
49141 | Zhou Brady |
49142 | Koltun Vladlen |
49143 | Krähenbühl Philipp |
49144 rows × 1 columns
# 根据作者频率绘制直⽅图
plt.figure(figsize=(10, 6))
authors_names[0].value_counts().head(10).plot(kind='barh')
# 修改图配置
names = authors_names[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('Author')
plt.xlabel('Count')
Text(0.5, 0, 'Count')
接下来统计姓名姓,也就是 authors_parsed 字段中作者第⼀个单词
authors_lastnames = [x[0] for x in all_authors]
authors_lastnames = pd.DataFrame(authors_lastnames)
plt.figure(figsize=(10, 6))
authors_lastnames[0].value_counts().head(10).plot(kind='barh')
names = authors_lastnames[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('Author')
plt.xlabel('Count')
Text(0.5, 0, 'Count')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UVy1yiT-1610805520430)(output_27_1.png)]
绘制得到的结果,从结果看出这些都是华⼈或者中国姓⽒~
统计所有作者姓第⼀个字符的评率,这个流程与上述的类似.