1. 程式人生 > 其它 >學術前沿趨勢分析 Task2 論文作者統計 筆記2

學術前沿趨勢分析 Task2 論文作者統計 筆記2

技術標籤:專案學術前沿趨勢分析

文章目錄

任務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'], [])

小小總結

Python中的lambda和apply用法

  • 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')

繪製得到的結果:

task2_image1

接下來統計姓名姓,也就是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')

繪製得到的結果,從結果看出這些都是華人或者中國姓氏~

task2_image2

統計所有作者姓第一個字元的評率,這個流程與上述的類似,同學們可以自行嘗試。