任务背景
- 统计论文作者,选出出现频率TOP10的姓名
- 主要难点:一篇文章可能有多个作者
数据处理步骤
观察数据
在原始arxiv数据集中论文作者authors字段是一个字符串格式,其中每个作者使用逗号进行分隔分。
处理步骤
- 使用逗号对作者进行切分
- 剔除单个作者中非常规的字符:在实际工作中,可能需要多次尝试和观察,把非常规字符找出
当然在原始数据集中authors_parsed字段已经帮我们处理好了作者信息,可以直接使用该字段完成后续统计。
字符串处理
转义符
(在行尾时) | (续行符) |
---|---|
|反斜杠符号 | |
‘ | 单引号 |
“ | 双引号 |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
内置函数(针对字符串处理)
方法 | 描述 |
---|---|
string.capitalize() | 把字符串的第一个字符大写 |
string.isalpha() | 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False |
string.title() | 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle()) |
string.upper() | 转换 string 中的小写字母为大写 |
具体代码实现以及讲解
读取数据
import pandas as pd
import json
data = []
with open(r'E:\学习相关文档\datawhale\202101\arxiv-metadata-oai-2019.json\arxiv-metadata-oai-2019.json','r') as f:
for idx,line in enumerate(f):
d = json.loads(line)
#d是字典
d = {'authors':d['authors'],'categories':d['categories'],'authors_parsed':d['authors_parsed']}
#data是列表
data.append(d)
#由字典组成的列表转换为dataframe
data = pd.DataFrame(data)
补充:
enumerate()函数跟单纯用for循环遍历的差别在于,enumerate会返回元素对应索引。
数据统计
统计目的
- 统计姓名频率TOP10
- 统计姓频率TOP10
- 统计姓第一个字符的频率
实现代码
#选择类别为cs.CV下面的论文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]
#其他实现方式:通过包含字段进行筛选
#data2 = data[data['categories'].str.contains('cs.CV')]
#拼接所有作者
#把series转变成list
all_authors = sum(data2['authors_parsed'],[])
#拼接所有作者
authors_names = [''.join(x) for x in all_authors]
authors_names = pd.DataFrame(authors_name)
# 根据作者频率绘制直方图
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')
补充: