任務(wù):作者信息關(guān)聯(lián)
1 任務(wù)說(shuō)明
- 學(xué)習(xí)主題:作者關(guān)聯(lián)(數(shù)據(jù)建模任務(wù)),對(duì)論文作者關(guān)系進(jìn)行建模虐骑,統(tǒng)計(jì)最常出現(xiàn)的作者關(guān)系;
- 學(xué)習(xí)內(nèi)容:構(gòu)建作者關(guān)系圖,挖掘作者關(guān)系
- 學(xué)習(xí)成果:論文作者知識(shí)圖譜、圖關(guān)系挖掘
2 數(shù)據(jù)處理步驟
將作者列表進(jìn)行處理未蝌,并完成統(tǒng)計(jì)煌寇。具體步驟如下:
- 將論文第一作者與其他作者(論文非第一作者)構(gòu)建圖;
- 使用圖算法統(tǒng)計(jì)圖中作者與其他作者的聯(lián)系疫蔓;
3 社交網(wǎng)絡(luò)分析
圖是復(fù)雜網(wǎng)絡(luò)研究中的一個(gè)重要概念。Graph是用點(diǎn)和線來(lái)刻畫離散事物集合中的每對(duì)事物間以某種方式相聯(lián)系的數(shù)學(xué)模型身冬。Graph在現(xiàn)實(shí)世界中隨處可見(jiàn)衅胀,如交通運(yùn)輸圖、旅游圖酥筝、流程圖等滚躯。利用圖可以描述現(xiàn)實(shí)生活中的許多事物,如用點(diǎn)可以表示交叉口嘿歌,點(diǎn)之間的連線表示路徑掸掏,這樣就可以輕而易舉的描繪出一個(gè)交通運(yùn)輸網(wǎng)絡(luò)。
3.1 圖類型
無(wú)向圖搅幅,忽略了兩節(jié)點(diǎn)間邊的方向阅束。
指有向圖,考慮了邊的有向性茄唐。
多重?zé)o向圖息裸,即兩個(gè)結(jié)點(diǎn)之間的邊數(shù)多于一條,又允許頂點(diǎn)通過(guò)同一條邊和自己關(guān)聯(lián)沪编。
3.2 圖統(tǒng)計(jì)指標(biāo)
度:是指和該節(jié)點(diǎn)相關(guān)聯(lián)的邊的條數(shù)呼盆,又稱關(guān)聯(lián)度。對(duì)于有向圖蚁廓,節(jié)點(diǎn)的入度 是指進(jìn)入該節(jié)點(diǎn)的邊的條數(shù)访圃;節(jié)點(diǎn)的出度是指從該節(jié)點(diǎn)出發(fā)的邊的條數(shù);
-
迪杰斯特拉路徑(Dijkstra算法):.從一個(gè)源點(diǎn)到其它各點(diǎn)的最短路徑相嵌,可使用迪杰斯特拉算法來(lái)求最短路徑腿时;
算法邏輯:
- 連通圖:在一個(gè)無(wú)向圖 G 中况脆,若從頂點(diǎn)i到頂點(diǎn)j有路徑相連,則稱i和j是連通的批糟。如果 G 是有向圖格了,那么連接i和j的路徑中所有的邊都必須同向。如果圖中任意兩點(diǎn)都是連通的徽鼎,那么圖被稱作連通圖盛末。如果此圖是有向圖,則稱為強(qiáng)連通圖否淤。
對(duì)于其他圖算法悄但,可以在networkx和igraph兩個(gè)庫(kù)中找到。
4 具體代碼以及講解
首先讀取我們想要的數(shù)據(jù):
data = [] #初始化
#使用with語(yǔ)句優(yōu)勢(shì):1.自動(dòng)關(guān)閉文件句柄石抡;2.自動(dòng)顯示(處理)文件讀取數(shù)據(jù)異常
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變?yōu)閐ataframe格式檐嚣,方便使用pandas進(jìn)行分析
創(chuàng)建作者鏈接的無(wú)向圖:
import networkx as nx
# 創(chuàng)建無(wú)向圖
G = nx.Graph()
# 只用五篇論文進(jìn)行構(gòu)建
for row in data.iloc[:5].itertuples():
authors = row[1]
authors = [' '.join(x[:-1]) for x in authors]
# 第一個(gè)作者 與 其他作者鏈接
for author in authors[1:]:
G.add_edge(authors[0],author) # 添加節(jié)點(diǎn)2,3并鏈接23節(jié)點(diǎn)
將作者關(guān)系圖進(jìn)行繪制:
nx.draw(G, with_labels=True)
得到作者之間的距離:
try:
print(nx.dijkstra_path(G, 'Balázs C.', 'Ziambaras Eleni'))
except:
print('No path')
如果我們500片論文構(gòu)建圖汁雷,則可以得到更加完整作者關(guān)系净嘀,并選擇最大聯(lián)通子圖進(jìn)行繪制,折線圖為子圖節(jié)點(diǎn)度值侠讯。
計(jì)算論文關(guān)系中有多少個(gè)聯(lián)通子圖
print(len(nx.communicability(G)))
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()