0、準備“邊”數據集Wiki_edgelist
import pandas as pddf = pd.read_csv('./data/wiki/Wiki_edgelist.txt', sep=' ', header=None, names=["source", "target"])
df.head()

1、讀入 起點-終點 邊數據,構建圖
# 1、讀入 起點-終點 邊數據,構建圖
import networkx as nx
# G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())
G = nx.read_edgelist('./data/wiki/Wiki_edgelist.txt',create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)])
print(G)
print(len(G))
DiGraph with 2405 nodes and 16523 edges
2405
2. 定義并實現一個輸入起始點和隨機游走步數的函數
# 2. 定義并實現一個輸入起始點和隨機游走步數的函數
import random
def get_randomwalk(node, path_length):'''輸入起始節點和路徑長度,生成隨機游走節點序列'''random_walk = [node]for i in range(path_length-1):# 匯總鄰接節點temp = list(G.neighbors(node))temp = list(set(temp) - set(random_walk)) if len(temp) == 0:break# 從鄰接節點中隨機選擇下一個節點random_node = random.choice(temp)random_walk.append(random_node)node = random_nodereturn random_walk# 試著從隨機森林出發,采樣五個節點
# get_randomwalk('random forest', 5)
get_randomwalk('66', 5)
['66', '68', '1449', '1465', '1461']
3. 把所有節點放進一個列表list中。
4. 對每個節點生成隨機游走序列
?5. 對每個結點跑DeepWalk
# 3. 把所有節點放進一個列表list中。
all_nodes = list(G.nodes())
print(all_nodes[:10])# 4. 接下來對每個節點生成隨機游走序列
gamma = 10 # 每個節點作為起始點生成隨機游走序列個數
walk_length = 5
# walk_length 為隨機游走序列最大長度
# 可是是無向圖喔,length為什么可以小于5呢,不回原路返回嗎?答案是不會,看上面get_randomwalk函數的定義,是會排除掉出發點的from tqdm import tqdm
# 5. 對每個結點跑DeepWalk
random_walks = []for n in tqdm(all_nodes):# 遍歷每個節點for i in range(gamma):#每個節點作為起始點生成gamma個隨機游走序列random_walks.append(get_randomwalk(n, walk_length))# 跑出來的隨機游走序列個數
print(len(random_walks))
# 查看一個節點的 10個隨機游走序列
print(random_walks[:gamma])
['1397', '1470', '362', '226', '750', '489', '1462', '1713', '393', '445']
100%|██████████| 2405/2405 [00:00<00:00, 7602.81it/s]
24050
[['1397', '226', '1467', '1466', '1450'], ['1397', '750', '489', '464', '397'], ['1397', '226', '246', '225', '224'], ['1397', '750', '489', '339', '1717'], ['1397', '226', '216', '222', '124'], ['1397', '226', '1464', '1444', '1445'], ['1397', '750', '1525', '1470', '1540'], ['1397', '226', '232', '235', '247'], ['1397', '489', '1825', '1860', '1722'], ['1397', '489', '708', '1530', '1498']]
6. 直接用Word2Vec來處理DeepWalk
# 6. 直接用Word2Vec來處理DeepWalk
from gensim.models import Word2Vec # 自然語言處理
model = Word2Vec(vector_size=256, # Embedding維數window=4, # 窗口寬度,NLP中就是左邊看四個詞,右邊看四個詞,graph就是左看四節點,右看四節點sg=1, # Skip-Gram,中心節點預測周圍4*2節點;為0就是周圍節點預測中心節點hs=0, # 不加分層softmaxnegative=10, # 負采樣alpha=0.03, # 初始學習率min_alpha=0.0007, # 最小學習率seed=14 # 隨機數種子)# 用隨機游走序列構建詞匯表
model.build_vocab(random_walks, progress_per=2)# 訓練,啟動
model.train(random_walks, total_examples=model.corpus_count, epochs=50, report_delay=1)
7. ?分析Wod2Vec(DeepWalk)結果
# 7. 分析Wod2Vec(DeepWalk)結果
# 查看單詞/節點 的embedding
print(model.wv.get_vector("66").shape)
model.wv.get_vector("66")
8、查看和單詞相似度高的單詞(節點)
# 8、查看和單詞相似度高的單詞(節點)model.wv.similar_by_word("66")
[('966', 0.7036892175674438),('897', 0.6912005543708801),('60', 0.6891793608665466),('183', 0.684368908405304),('67', 0.6747772693634033),('11', 0.6455847024917603),('118', 0.638038694858551),('2006', 0.6363611817359924),('181', 0.6297730803489685),('65', 0.623363196849823)]
9、繪制圖 可視化
# 將Embedding用TSNE降維到2維
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, n_iter=1000)
embed_2d = tsne.fit_transform(X)plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:, 0], embed_2d[:, 1])
plt.show()

將我們關心的節點展示在二維空間直角坐標系中
# 結合PageRank,計算出PageRank節點重要度前三十的節點,再加上一些手動補充我們關心的節點,把這一些節點進行可視化在二維圖里。# 計算PageRank重要度
pagerank = nx.pagerank(G)
# 從高到低排序
node_importance = sorted(pagerank.items(), key=lambda x:x[1], reverse=True) # 排序# 取最高的前n個節點
n = 30
terms_chosen = []
for each in node_importance[:n]:terms_chosen.append(each[0])# 手動補充我們關心的節點
terms_chosen.extend(['666','66'])# 得到一個轉換器term2index :輸入詞條,輸出詞典中的索引號
term2index = model.wv.key_to_index# 10-2 將剛剛的PageRank節點重要度前三十的節點,再加上一些手動補充我們關心的節點再次展示在二維空間直角坐標系中。
plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:, 0], embed_2d[:, 1])
for item in terms_chosen:idx = term2index[item]plt.scatter(embed_2d[idx,0], embed_2d[idx,1],c='r',s=50)plt.annotate(item, xy=(embed_2d[idx,0], embed_2d[idx,1]),c='k',fontsize=12)
plt.show()
