學術前沿趨勢分析 Task2 論文作者統計 筆記2
阿新 • • 發佈:2021-01-15
技術標籤:專案學術前沿趨勢分析
文章目錄
任務2:論文作者統計
2.1 任務說明
- 任務主題:論文作者統計,統計所有論文作者出現評率Top10的姓名;
- 任務內容:論文作者的統計、使用 Pandas 讀取資料並使用字串操作;
- 任務成果:學習 Pandas 的字串操作;
2.2 資料處理步驟
在原始arxiv資料集中論文作者authors
欄位是一個字串格式,其中每個作者使用逗號進行分隔分,所以我們我們首先需要完成以下步驟:
- 使用逗號對作者進行切分;
- 剔除單個作者中非常規的字元;
具體操作可以參考以下例子:
C. Bal\\'azs, E. L. Berger, P. M. Nadolsky, C.-P. Yuan
# 切分為,其中\\為轉義符
C. Ba'lazs
E. L. Berger
P. M. Nadolsky
C.-P. Yuan
當然在原始資料集中authors_parsed
欄位已經幫我們處理好了作者資訊,可以直接使用該欄位完成後續統計。
2.3 字串處理
在Python中字串是最常用的資料型別,可以使用引號('或")來建立字串。Python中所有的字元都使用字串儲存,可以使用方括號來擷取字串,如下例項:
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中還支援轉義符:
(在行尾時) | 續行符 |
---|---|
\ | 反斜槓符號 |
’ | 單引號 |
" | 雙引號 |
\n | 換行 |
\t | 橫向製表符 |
\r | 回車 |
Python中還內建了很多內建函式,非常方便使用:
方法 | 描述 |
---|---|
string.capitalize() | 把字串的第一個字元大寫 |
string.isalpha() | 如果 string 至少有一個字元並且所有字元都是字母則返回 True,否則返回 False |
string.title() | 返回"標題化"的 string,就是說所有單詞都是以大寫開始,其餘字母均為小寫(見 istitle()) |
string.upper() | 轉換 string 中的小寫字母為大寫 |
2.4 具體程式碼實現以及講解
2.4.1 資料讀取
data = []
with open("arxiv-metadata-oai-snapshot.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']}
data.append(d)
data = pd.DataFrame(data)
為了方便處理資料,我們只選擇了三個欄位進行讀取。
2.4.2 資料統計
接下來我們將完成以下統計操作:
- 統計所有作者姓名出現頻率的Top10;
- 統計所有作者姓(姓名最後一個單詞)的出現頻率的Top10;
- 統計所有作者姓第一個字元的評率;
為了節約計算時間,下面選擇部分類別下的論文進行處理:
# 選擇類別為cs.CV下面的論文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]
# 拼接所有作者
all_authors = sum(data2['authors_parsed'], [])
小小總結
- List itemlambda函式也叫匿名函式,它允許快速定義單行函式,可以用在任何需要函式的地方。這區別於def定義的函式。
- apply函式的格式為:apply(func,*args,**kwargs)
處理完成後all_authors
變成了所有一個list,其中每個元素為一個作者的姓名。我們首先來完成姓名頻率的統計。
# 拼接所有的作者
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')
繪製得到的結果:
接下來統計姓名姓,也就是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')
繪製得到的結果,從結果看出這些都是華人或者中國姓氏~
統計所有作者姓第一個字元的評率,這個流程與上述的類似,同學們可以自行嘗試。