论文数据分析02

论文作者统计

任务说明

任务主题:论⽂作者统计,统计所有论⽂作者出现频率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
authorscategoriesauthors_parsed
0Sung-Chul Yoon, Philipp Podsiadlowski and Step...astro-ph[[Yoon, Sung-Chul, ], [Podsiadlowski, Philipp,...
1B. Dugmore and PP. Ntumbamath.AT[[Dugmore, B., ], [Ntumba, PP., ]]
2T.V. Zaqarashvili and K Murawskiastro-ph[[Zaqarashvili, T. V., ], [Murawski, K, ]]
3Sezgin Aygun, Ismail Tarhan, Husnu Baysalgr-qc[[Aygun, Sezgin, ], [Tarhan, Ismail, ], [Baysa...
4Antonio Pipino (1,3), Thomas H. Puzia (2,4), a...astro-ph[[Pipino, Antonio, ], [Puzia, Thomas H., ], [M...
............
170613V. A. Sautenkov, M. D. Lukin, C. J. Bednar, G....quant-ph[[Sautenkov, V. A., ], [Lukin, M. D., ], [Bedn...
170614Wen-Xiu Ma, Benno Fuchssteinersolv-int nlin.SI[[Ma, Wen-Xiu, ], [Fuchssteiner, Benno, ]]
170615J C Eilbeck, V Z Enol'skii, V B Kuznetsov, D V...solv-int nlin.SI[[Eilbeck, J C, ], [Enol'skii, V Z, ], [Kuznet...
170616M. Adler, T. Shiota and P. van Moerbekesolv-int adap-org hep-th nlin.AO nlin.SI[[Adler, M., ], [Shiota, T., ], [van Moerbeke,...
170617D.B. Fairlie and A.N. Leznovsolv-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
0Pal Mahesh
1Mokhov Serguei A. for the MARF R&D Group
2Sinclair Stephen for the MARF R&D Group
3Clément Ian for the MARF R&D Group
4Nicolacopoulos Dimitrios for the MARF R&D Group
......
49139Ti Yen-Wu
49140Chen Dian
49141Zhou Brady
49142Koltun Vladlen
49143Krä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)]

绘制得到的结果,从结果看出这些都是华⼈或者中国姓⽒~

统计所有作者姓第⼀个字符的评率,这个流程与上述的类似.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值