使用DeepWalk 和Word2Vec實現單詞Embedding

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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45117.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GIS就業相關問題快問快答

目錄 前言1.現在處于經濟下行期&#xff0c;GIS就業崗位是否減少了&#xff1f;2.我未來的打算是進體制內研發崗&#xff0c;這方面需要掌握哪些技能呢&#xff1f;3.GIS前端需要掌握哪些知識&#xff1f;4.GIS后端需要掌握哪些知識&#xff1f;5.不論是前端還是后端&#xff0…

編程語言都是哪些人開發出來的?為什么都是國外較小國家的人

編程語言都是哪些人開發出來的&#xff1f; 編程語言的開發者通常是來自計算機科學、軟件工程、數學、物理學等領域的專家、學者和工程師。這些開發者具備深厚的編程技能、算法知識、系統設計能力以及創新思維&#xff0c;他們致力于創造出能夠解決特定問題或滿足特定需求的編…

Docker入門(清晰認識)

為什么學習Docker&#xff1f; 再學完linux后&#xff0c;我們需要遠程對Linux虛擬機下載一些軟件&#xff0c;如果在Linux里直接用命令下載軟件會十分麻煩&#xff0c;所以我們需要通過使用Docker將軟件直接下載到Docker中&#xff0c;這樣更方便下載和卸載等操作。 一張圖弄…

javaScript的面試重點--預解析

目錄 一.前言 二.預解析案例 一.前言 關于預解析&#xff0c;我們通過今天學習就能夠知道解析器運行JS分為哪兩步&#xff1b;能夠說出變量提升的步驟和運行過程&#xff1b;能夠說出函數提升的步驟和運行過程。 二.預解析案例 預解析&#xff0c;簡而言之&#xff0c;也就是…

7.13實訓日志

上午 學習網絡安全的過程中&#xff0c;我們深入了解了網絡的不同層面和技術&#xff0c;從表層網絡到深網再到暗網&#xff0c;以及涉及的產業分類和技術工具。這些知識不僅幫助我們理解網絡的復雜性&#xff0c;還揭示了如何應對和防范各種網絡威脅。 首先&#xff0c;我們…

簡易秒表的實現

目錄 描述 輸入描述&#xff1a; 輸出描述&#xff1a; 參考代碼 描述 請編寫一個模塊&#xff0c;實現簡易秒表的功能&#xff1a;具有兩個輸出&#xff0c;當輸出端口second從1-60循環計數&#xff0c;每當second計數到60&#xff0c;輸出端口minute加一&#xff0c;一直…

當在多線程環境中使用 C++進行編程時,怎樣確保線程安全以及如何處理線程之間的同步和通信?

在C中確保線程安全性和處理線程之間的同步和通信有多種方法。下面是一些常用的技術和技巧&#xff1a; 互斥鎖&#xff1a;使用互斥鎖可以確保只有一個線程可以訪問共享資源。在訪問共享資源之前獲取鎖&#xff0c;在完成后釋放鎖。這可以防止多個線程同時訪問同一份數據&#…

007-端口隔離

端口隔離配置 端口隔離簡介 為了實現報文之間的二層隔離&#xff0c;可以將不同的端口加入不同的VLAN&#xff0c;但會浪費有限的VLAN資源。采用端口隔離特性&#xff0c;可以實現同一VLAN內端口之間的隔離。 設備支持以下方式進行端口隔離&#xff1a; 基于隔離組的端口隔…

中介子方程五十七

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXαXXpXeXXkXyXWXOXiXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXα…

理解JavaScript中的對象傳遞與賦值操作

在JavaScript中&#xff0c;對象傳遞和賦值操作是兩個非常重要的概念。它們在日常開發中扮演著關鍵角色&#xff0c;但也常常會讓人感到困惑。本文將通過兩個簡單的例子&#xff0c;更好地理解它們的區別和實際應用。 示例代碼1&#xff1a;修改對象屬性 我們先來看第一段示例…

【數據結構】順序表的應用

目錄 一.引言 二.順序表概念 三.順序表的實現 1.定義順序表 2.順序表初始化 ?編輯 3.檢查空間&#xff0c;如果滿了&#xff0c;進行增容 4.順序表尾插 5.順序表尾刪 6.順序表頭插 7.順序表頭刪 ?編輯 8.順序表查找 9.順序表在pos位置插入x 10.順序表刪…

展開說說:Android頁面繪制流程源碼解析

說到Android系統View的繪制流程&#xff0c;大家一定知道是分為測量&#xff08;Measure&#xff09;、布局&#xff08;Layout&#xff09;和繪制&#xff08;Draw&#xff09;三個階段&#xff0c;這篇文章主要聊一聊在這三個步驟之前的源碼執行流程&#xff0c;頁面啟動后是…

C語言丟失精度 如何實現高精度計算

&#xff08;1&#xff09;int 類型舉例 int &#xff1a;占4個字節&#xff0c;也就是32位&#xff0c;及最大值是2^32-11024*1024*1024*4-14294967295 以上說法錯誤&#xff0c;因為Int是有符號類型整數&#xff0c;所以最高位是符號位&#xff0c;及int的最大值應該是2^31…

【Java】鏈表的頭插法和尾插法

頭插法 頭插法就是在已有的節點的前面插入新節點 如何實現 &#xff08;1&#xff09;先定義一個節點類ListNode&#xff0c;里面有value值和地址 public class ListNode {int value;ListNode next;public ListNode(int value){this.value value;}Overridepublic String t…

開發指南046-機構樹控件

為了簡化編程&#xff0c;平臺封裝了很多前端組件。機構樹就是常用的組件之一。 基本用法&#xff1a; import QlmOrgTree from /qlmcomponents/tree/QlmOrgTree <QlmOrgTree></QlmOrgTree> 功能&#xff1a; 根據權限和控制參數顯示機構樹。機構樹數據來源于核…

讓我們一起來看看這些強大的中國汽車品牌如何勇攀巔峰!

咱們中國的汽車品牌&#xff0c;就是這么牛&#xff01;你知道嗎&#xff1f;他們已經悄悄崛起&#xff0c;一步步向著更廣闊的海外市場進軍了。盡管這個過程可能有點坎坷&#xff0c;但是“勇敢”始終是他們前行的動力&#xff0c;推動著他們不斷向前&#xff0c;打造屬于我們…

AGI 之 【Hugging Face】 的【文本摘要】的 [評估PEGASUS ] / [ 微調PEGASUS ] / [生成對話摘要] 的簡單整理

AGI 之 【Hugging Face】 的【文本摘要】的 [評估PEGASUS ] / [ 微調PEGASUS ] / [生成對話摘要] 的簡單整理 目錄 AGI 之 【Hugging Face】 的【文本摘要】的 [評估PEGASUS ] / [ 微調PEGASUS ] / [生成對話摘要] 的簡單整理 一、簡單介紹 二、文本摘要 三、在CNN/Daily…

秋招突擊——7/9——MySQL索引的使用

文章目錄 引言正文B站網課索引基礎創建索引如何在一個表中查看索引為字符串建立索引全文索引復合索引復合索引中的排序問題索引失效的情況使用索引進行排序覆蓋索引維護索引 數據庫基礎——文檔資料學習整理創建索引刪除索引創建唯一索引索引提示復合索引聚集索引索引基數字符串…

C#基于任務的異步模式(TAP)

1、C#異步模式分類 基于任務的異步模式&#xff08;TAP&#xff09; 基于事件的異步模式&#xff08;EAP&#xff09;和異步編程模型模式&#xff08;APM&#xff09; 2、基于任務的異步模式&#xff08;TAP&#xff09; 基于任務的異步模式&#xff08;TAP&#xff09;用單個方…

從零手寫實現 nginx-28-error pages 指令

前言 大家好&#xff0c;我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的&#xff0c;可以參考我的另一個項目&#xff1a; 手寫從零實現簡易版 tomcat minicat 手寫 nginx 系列 …