Task2|Datawhale: 論文作者統計
阿新 • • 發佈:2021-01-17
Task2:論文作者統計
import os
import seaborn as sns
from bs4 import BeautifulSoup #用於爬取arxiv資料
import re #用於正則表示式,匹配字串的模式
import requests #用於網路連線,傳送網路請求,使用域名獲取對應資訊
import json
import pandas as pd
import matplotlib.pyplot as plt
os.chdir('D:/Zoey/datawhale_20210110')
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語句優勢:1.自動關閉檔案控制代碼;2.自動顯示(處理)檔案讀取資料異常
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
data2 = readArxivFile('arxiv-metadata-oai-snapshot.json', ['id','authors','categories','authors_parsed','update_date'])
##### 2.1 統計所有論文作者出現頻率Top10的姓名
# 為節約時間,選擇類別為cs.CV下面的論文
data_cv = data2[data2['categories'].apply(lambda x: 'cs.CV' in x)]
# 拼接所有作者
# sum將巢狀的list轉換為list,參考https://segmentfault.com/q/1010000010514370
all_authors = sum(data_cv['authors_parsed'],[])
'''
data_cv['authors_parsed']
[[姓,名],[姓,名],[姓,名]]
[[姓,名],[姓,名]]
sum======>
all_authors
[[姓,名],[姓,名],[姓,名]]
join=====>
authors_names
['姓 名','姓 名','姓 名']
'''
# 拼接所有作者
authors_names = [' '.join(x) for x in all_authors]
authors_names = pd.DataFrame(authors_names)
# 根據作者頻率繪製直方圖
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')
##### 2.2 統計所有作者姓(姓名最後一個單詞)的出現頻率的Top10
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')
##### 2.3 統計所有作者姓第一個字元的評率
# authors_initial = [x[0:1] for x in authors_lastnames[0]]
authors_initial = [x[0][0] for x in all_authors]
authors_initial = pd.DataFrame(authors_initial)
plt.figure(figsize=(10, 6))
authors_initial[0].value_counts().head(10).plot(kind='barh')
names = authors_initial[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('Author')
plt.xlabel('Count')
# cv領域論文數量隨年份走勢
data_cv['year'] = pd.to_datetime(data_cv['update_date']).dt.year
data_cv_year = data_cv.groupby(['year']).agg({'id':'count'}).rename(columns={'id':'counts'}).reset_index()
plt.plot(data_cv_year['year'],data_cv_year['counts'])
plt.xlabel('year')
plt.ylabel('counts')
plt.title('Trend of papers in CV field')
# 設定資料標籤
for a, b in zip(data_cv_year["year"],data_cv_year["counts"]):
plt.text(a, b+1, '%.0f' % b, ha='center', va='bottom', fontsize=10, rotation=0)
plt.tight_layout()
plt.show()