python算法學習雙曲嵌入論文代碼實現(xiàn)數(shù)據(jù)集介紹
學習的文章:
Poincaré Embeddings for Learning Hierarchical Representations
主要參考的代碼:
poincare_embeddings
gensim – Topic Modelling in Python - poincare.py
由于有些代碼難以運行,有些比較難讀(封裝程度非常高)甚至有些代碼寫得存在一些問題。因此我們重新按照論文的設置,利用Python重現(xiàn)了對應的方法,并成功運行,同時進行繪圖展示。
1. 目標
我們有一些層級結(jié)構(gòu)的網(wǎng)絡類型數(shù)據(jù),如何能夠根據(jù)每個詞的上下結(jié)構(gòu)路徑,將每個詞語能夠用一個向量來替換,換句話說,就是將詞映射為實數(shù)域中的向量(詞嵌入,word embedding)。最簡單的想法是使用one-hot詞向量,其構(gòu)造起來很容易,但通常并不是一個好選擇。主要的原因是,one-hot詞向量無法準確表達不同詞之間的相似度,同時也不能刻畫詞語之間的層次結(jié)構(gòu)。而在另外的方法中,采用最多的是在歐式空間里進行嵌入(word2vec),這種方式的embedding可以有效表示出詞語間的相似性,但卻依舊難以刻畫出詞語之間的層次結(jié)構(gòu)。
這時候為了既能夠衡量詞與詞之間的相似性,又能衡量這種詞與詞之間的層次結(jié)構(gòu),引入了雙曲幾何的思想,在雙曲空間中進行嵌入。雙曲嵌入表征層級結(jié)構(gòu)的能力就要比歐氏空間嵌入的能力高得多,同時需要的維數(shù)卻更少。
Python 代碼依賴庫
為了能夠順利跑通后面的代碼,這里先展示出代碼需要依賴的庫:
import nltk
# nltk.download('wordnet') # 第一次運行需運行此命令,安裝wordnet數(shù)據(jù)集
from nltk.corpus import wordnet as wn
from math import *
import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import networkx as nx
2. 數(shù)據(jù)集
訓練數(shù)據(jù)集采用wordnet中的數(shù)據(jù)進行實現(xiàn),相關的數(shù)據(jù)說明在上周的文檔中已經(jīng)進行了介紹,這里不再進行贅述。
由于整個的wordnet數(shù)據(jù)集比較大,為了測試代碼,我們只使用哺乳動物(mammal)及其相關的分支進行學習。首先我們看看數(shù)據(jù)集長什么樣。由于我們只需要用到層次結(jié)構(gòu)信息,因此我們只需將數(shù)據(jù)集里面每個哺乳動物相關名詞的子節(jié)點與父節(jié)點的關系進行讀取與構(gòu)建。
network = {} # 構(gòu)建層級網(wǎng)絡
last_level = 8 # 最深的層設置為8層
levelOfNode = {} # 數(shù)據(jù)的層級信息,0為哺乳動物(根節(jié)點),1為哺乳動物下一結(jié)構(gòu)
# 遞歸構(gòu)建network
def get_hyponyms(synset, level):
if (level == last_level):
levelOfNode[str(synset)] = level
return
if not str(synset) in network:
network[str(synset)] = [str(s) for s in synset.hyponyms()]
levelOfNode[str(synset)] = level
for hyponym in synset.hyponyms():
get_hyponyms(hyponym, level + 1)
# 構(gòu)建以哺乳動物為根節(jié)點的層次結(jié)構(gòu)數(shù)據(jù)集
mammal = wn.synset('mammal.n.01')
get_hyponyms(mammal, 0)
levelOfNode[str(mammal)] = 0
# 將終端葉子節(jié)點補到network字典中
for a in levelOfNode:
if not a in network:
network[a] = []
數(shù)據(jù)展示
運行完成上述代碼后,可以得到對應的節(jié)點層級,以及總體的網(wǎng)絡分支。
節(jié)點層級(數(shù)值表示層級數(shù),最深的層設置為6,0為根節(jié)點)

網(wǎng)絡分支情況

為了更清晰地將樹的結(jié)構(gòu)進行刻畫,用一個代碼進一步將相關的層次結(jié)構(gòu)直接進行展示。
def norm(x):
return np.dot(x, x)
def traverse(graph, start, node):
node_name = node.name().split(".")[0]
graph.depth[node_name] = node.shortest_path_distance(start)
for child in node.hyponyms():
child_name = child.name().split(".")[0]
graph.add_edge(node_name, child_name) # 添加邊
traverse(graph, start, child) # 遞歸構(gòu)建
def hyponym_graph(start):
G = nx.Graph() # 定義一個圖
G.depth = {}
traverse(G, start, start)
return G
def graph_draw(graph):
plt.figure(figsize=(10, 10)) # 展示整體的網(wǎng)絡
# plt.figure(figsize=(3, 3)) # 展示大象網(wǎng)絡
nx.draw(graph,
node_size = [10 * graph.degree(n) for n in graph],
node_color = [graph.depth[n] for n in graph],
alpha = 0.8,
font_size = 4,
width = 0.5,
with_labels = True)
def get_keys(d, value):
return [k for k,v in d.items() if v == value]
root_name = get_keys(graph.depth, 0)[0]
plt.savefig("~/hyperE/fig/" + root_name + ".png", dpi = 300)
graph = hyponym_graph(mammal)
graph_draw(graph)
繪制出來的哺乳動物(mammal)全體的結(jié)構(gòu)如下(此時沒有空間信息,只有層級信息,為了展示才顯示為下圖所示的樣式):
其中,顏色越深,節(jié)點越大,表示節(jié)點的層級越接近根節(jié)點(哺乳動物)。
由于數(shù)據(jù)非常多,展示的不是很清楚,這里我們單純的提出出來大象(elephant)的結(jié)構(gòu),進一步看看數(shù)據(jù)集的情況。
elephant = wn.synset('elephant.n.01')
graph = hyponym_graph(elephant)
graph_draw(graph)

后面我們將利用這份數(shù)據(jù)集,進行方法的介紹,以及雙曲嵌入模型的訓練。
請見:python算法學習雙曲嵌入論文方法與代碼解析說明
以上就是python算法學習雙曲嵌入論文代碼實現(xiàn)數(shù)據(jù)集介紹的詳細內(nèi)容,更多關于python算法數(shù)據(jù)集雙曲嵌入論文代碼的資料請關注本站其它相關文章!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
關注官方微信