一、任務說明
- 學習主題:作者關聯(資料模組化任務),對論文作者關系進行模組化,統計最常出現的作者關系;
- 學習内容:建構作者關系圖,挖掘作者關系
- 學習成果:論文作者知識圖譜、圖關系挖掘
二、資料處理步驟
将作者清單進行處理,并完成統計。具體步驟如下:
- 将論文第一作者與其他作者(論文非第一作者)建構圖;
- 使用圖算法統計圖中作者與其他作者的聯系;
三、社交網絡分析
圖是複雜網絡研究中的一個重要概念。Graph是用點和線來刻畫離散事物集合中的每對事物間以某種方式相聯系的數學模型。Graph在現實世界中随處可見,如交通運輸圖、旅遊圖、流程圖等。利用圖可以描述現實生活中的許多事物,如用點可以表示交叉口,點之間的連線表示路徑,這樣就可以輕而易舉的描繪出一個交通運輸網絡。
3.1 圖類型
- 無向圖,忽略了兩節點間邊的方向。
- 指有向圖,考慮了邊的有向性。
- 多重無向圖,即兩個結點之間的邊數多于一條,又允許頂點通過同一條邊和自己關聯。
3.2 圖統計名額
-
:是指和該節點相關聯的邊的條數,又稱關聯度。對于有向圖,節點的入度 是指進入該節點的邊的條數;節點的出度是指從該節點出發的邊的條數;度
-
:.從一個源點到其它各點的最短路徑,可使用迪傑斯特拉算法來求最短路徑;迪傑斯特拉路徑
-
:在一個無向圖 G 中,若從頂點i到頂點j有路徑相連,則稱i和j是連通的。如果 G 是有向圖,那麼連接配接i和j的路徑中所有的邊都必須同向。如果圖中任意兩點都是連通的,那麼圖被稱作連通圖。如果此圖是有向圖,則稱為強連通圖。連通圖
四、具體代碼以及講解
# 導入所需的package
import seaborn as sns #用于畫圖
from bs4 import BeautifulSoup #用于爬取arxiv的資料
import re #用于正規表達式,比對字元串的模式
import requests #用于網絡連接配接,發送網絡請求,使用域名擷取對應資訊
import json #讀取資料,我們的資料為json格式的
import pandas as pd #資料處理,資料分析
import matplotlib.pyplot as plt #畫圖工具
data = [] #初始化
#使用with語句優勢:1.自動關閉檔案句柄;2.自動顯示(處理)檔案讀取資料異常
with open("arxiv-metadata-oai-snapshot.json", 'r') as f:
for idx, line in enumerate(f):
d = json.loads(line)
d = {'authors_parsed': d['authors_parsed']}
data.append(d)
data = pd.DataFrame(data) #将list變為dataframe格式,友善使用pandas進行分析
authors_parsed | |
---|---|
[[Balázs, C., ], [Berger, E. L., ], [Nadolsky,... | |
1 | [[Streinu, Ileana, ], [Theran, Louis, ]] |
2 | [[Pan, Hongjun, ]] |
3 | [[Callan, David, ]] |
4 | [[Abu-Shammala, Wael, ], [Torchinsky, Alberto, ]] |
建立作者連結的無向圖:
import networkx as nx
# 建立無向圖
G = nx.Graph()
# 隻用五篇論文進行建構
for row in data.iloc[:5].itertuples():
authors = row[1]
authors = [' '.join(x[:-1]) for x in authors]
# 第一個作者 與 其他作者連結
for author in authors[1:]:
G.add_edge(authors[0],author) # 添加節點2,3并連結23節點
将作者關系圖進行繪制:
得到作者之間的距離:
try:
print(nx.dijkstra_path(G, 'Balázs C.', 'Ziambaras Eleni'))
except:
print('No path')
No path
如果我們500片論文建構圖,則可以得到更加完整作者關系,并選擇最大聯通子圖進行繪制,折線圖為子圖節點度值。
# 計算論文關系中有多少個聯通子圖
print(len(nx.communicability(G)))
8
degree_sequence = sorted([d for n, d in G.degree()], reverse=True)
dmax = max(degree_sequence)
plt.loglog(degree_sequence, "b-", marker="o")
plt.title("Degree rank plot")
plt.ylabel("degree")
plt.xlabel("rank")
# draw graph in inset
plt.axes([0.45, 0.45, 0.45, 0.45])
Gcc = G.subgraph(sorted(nx.connected_components(G), key=len, reverse=True)[0])
pos = nx.spring_layout(Gcc)
plt.axis("off")
nx.draw_networkx_nodes(Gcc, pos, node_size=20)
nx.draw_networkx_edges(Gcc, pos, alpha=0.4)
plt.show()
參考文獻
https://github.com/datawhalechina/team-learning-data-mining/blob/master/AcademicTrends/Task5%20%E4%BD%9C%E8%80%85%E4%BF%A1%E6%81%AF%E5%85%B3%E8%81%94.md