前書き
このブログでは、論文の著者関係をモデル化し、最も頻繁に発生する著者関係を数え、著者関係グラフを作成し、著者関係をマイニングします。
データ処理ステップ
著者リストを処理し、統計を完成させます。具体的な手順は次のとおりです。
- 論文の筆頭著者と他の著者(論文の筆頭著者ではない)の間でグラフを作成します。
- グラフアルゴリズムを使用して、作成者とグラフ内の他の作成者との関係を計算します。
ソーシャルネットワーク分析
グラフは、複雑なネットワーク研究における重要な概念です。グラフは、点と線を使用して、離散的なもののセット内の物の各ペア間の接続を特定の方法で記述する数学モデルです。グラフは、交通機関の地図、旅行の地図、フローチャートなど、現実の世界のいたるところに見られます。グラフを使用して、実際の生活の多くのことを説明できます。たとえば、ポイントを使用して交差点を表し、ポイント間の接続をパスを表すため、輸送ネットワークを簡単に表すことができます。
グラフタイプ
- 無向グラフは、2つのノード間のエッジの方向を無視します。
- エッジの方向性を考慮して、有向グラフを参照します。
- 複数の無向グラフ、つまり、2つのノード間のエッジの数が複数あり、頂点を同じエッジを介してそれ自体に関連付けることができます。
グラフ統計指標
- 度:ノードに関連付けられているエッジの数を指し、関連付けの度合いとも呼ばれます。有向グラフの場合、ノードの次数はノードに入るエッジの数を指し、ノードの次数はノードから始まるエッジの数を指します。
- ダイクストラパス:ソースポイントから他のポイントへの最短パス。ダイクストラアルゴリズムを使用して最短パスを見つけることができます。
- 連結グラフ:無向グラフGにおいて、頂点iから頂点jに連結された経路がある場合、iとjは連結されていると言われます。G
が有向グラフの場合、iとjを結ぶパスのすべてのエッジは同じ方向にある必要があります。グラフ内の任意の2点が接続されている場合、そのグラフは接続グラフと呼ばれます。このグラフが有向グラフである場合、それは強連結グラフと呼ばれます。
他のグラフアルゴリズムについては、networkxおよびigraphライブラリで見つけることができます。
特定のコードと説明
最初にパッケージをガイドします
import pandas as pd #数据处理,数据分析
import json #读取数据,我们的数据为json格式的
データをもう一度読む
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进行分析
著者リンクを使用して無向グラフを作成します。
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节点
著者の関係図を描きます。
nx.draw(G, with_labels=True)
著者間の距離を取得します。
try:
print(nx.dijkstra_path(G, 'Balázs C.', 'Ziambaras Eleni'))
except:
print('No path')
500の論文のグラフを作成すると、より完全な著者関係を取得し、接続されている最大のサブグラフを選択して描画できます。折れ線グラフは、サブグラフのノード次数の値です。
# 计算论文关系中有多少个联通子图
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()