python算法學(xué)習(xí)雙曲嵌入論文代碼實(shí)現(xiàn)數(shù)據(jù)集介紹
學(xué)習(xí)的文章:
Poincaré Embeddings for Learning Hierarchical Representations
主要參考的代碼:
gensim – Topic Modelling in Python - poincare.py
由于有些代碼難以運(yùn)行,有些比較難讀(封裝程度非常高)甚至有些代碼寫得存在一些問題。因此我們重新按照論文的設(shè)置,利用Python
重現(xiàn)了對應(yīng)的方法,并成功運(yùn)行,同時進(jìn)行繪圖展示。
1. 目標(biāo)
我們有一些層級結(jié)構(gòu)的網(wǎng)絡(luò)類型數(shù)據(jù),如何能夠根據(jù)每個詞的上下結(jié)構(gòu)路徑,將每個詞語能夠用一個向量來替換,換句話說,就是將詞映射為實(shí)數(shù)域中的向量(詞嵌入,word embedding)。最簡單的想法是使用one-hot詞向量,其構(gòu)造起來很容易,但通常并不是一個好選擇。主要的原因是,one-hot詞向量無法準(zhǔn)確表達(dá)不同詞之間的相似度,同時也不能刻畫詞語之間的層次結(jié)構(gòu)。而在另外的方法中,采用最多的是在歐式空間里進(jìn)行嵌入(word2vec),這種方式的embedding可以有效表示出詞語間的相似性,但卻依舊難以刻畫出詞語之間的層次結(jié)構(gòu)。
這時候?yàn)榱思饶軌蚝饬吭~與詞之間的相似性,又能衡量這種詞與詞之間的層次結(jié)構(gòu),引入了雙曲幾何的思想,在雙曲空間中進(jìn)行嵌入。雙曲嵌入表征層級結(jié)構(gòu)的能力就要比歐氏空間嵌入的能力高得多,同時需要的維數(shù)卻更少。
Python 代碼依賴庫
為了能夠順利跑通后面的代碼,這里先展示出代碼需要依賴的庫:
import nltk # nltk.download('wordnet') # 第一次運(yùn)行需運(yùn)行此命令,安裝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ù)集
訓(xùn)練數(shù)據(jù)集采用wordnet中的數(shù)據(jù)進(jìn)行實(shí)現(xiàn),相關(guān)的數(shù)據(jù)說明在上周的文檔中已經(jīng)進(jìn)行了介紹,這里不再進(jìn)行贅述。
由于整個的wordnet數(shù)據(jù)集比較大,為了測試代碼,我們只使用哺乳動物(mammal)及其相關(guān)的分支進(jìn)行學(xué)習(xí)。首先我們看看數(shù)據(jù)集長什么樣。由于我們只需要用到層次結(jié)構(gòu)信息,因此我們只需將數(shù)據(jù)集里面每個哺乳動物相關(guān)名詞的子節(jié)點(diǎn)與父節(jié)點(diǎn)的關(guān)系進(jìn)行讀取與構(gòu)建。
network = {} # 構(gòu)建層級網(wǎng)絡(luò) last_level = 8 # 最深的層設(shè)置為8層 levelOfNode = {} # 數(shù)據(jù)的層級信息,0為哺乳動物(根節(jié)點(diǎn)),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é)點(diǎn)的層次結(jié)構(gòu)數(shù)據(jù)集 mammal = wn.synset('mammal.n.01') get_hyponyms(mammal, 0) levelOfNode[str(mammal)] = 0 # 將終端葉子節(jié)點(diǎn)補(bǔ)到network字典中 for a in levelOfNode: if not a in network: network[a] = []
數(shù)據(jù)展示
運(yùn)行完成上述代碼后,可以得到對應(yīng)的節(jié)點(diǎn)層級,以及總體的網(wǎng)絡(luò)分支。
節(jié)點(diǎn)層級(數(shù)值表示層級數(shù),最深的層設(shè)置為6,0為根節(jié)點(diǎn))
網(wǎng)絡(luò)分支情況
為了更清晰地將樹的結(jié)構(gòu)進(jìn)行刻畫,用一個代碼進(jìn)一步將相關(guān)的層次結(jié)構(gòu)直接進(jìn)行展示。
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)絡(luò) # plt.figure(figsize=(3, 3)) # 展示大象網(wǎng)絡(luò) 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é)點(diǎn)越大,表示節(jié)點(diǎn)的層級越接近根節(jié)點(diǎn)(哺乳動物)。
由于數(shù)據(jù)非常多,展示的不是很清楚,這里我們單純的提出出來大象(elephant)的結(jié)構(gòu),進(jìn)一步看看數(shù)據(jù)集的情況。
elephant = wn.synset('elephant.n.01') graph = hyponym_graph(elephant) graph_draw(graph)
后面我們將利用這份數(shù)據(jù)集,進(jìn)行方法的介紹,以及雙曲嵌入模型的訓(xùn)練。
請見:python算法學(xué)習(xí)雙曲嵌入論文方法與代碼解析說明
以上就是python算法學(xué)習(xí)雙曲嵌入論文代碼實(shí)現(xiàn)數(shù)據(jù)集介紹的詳細(xì)內(nèi)容,更多關(guān)于python算法數(shù)據(jù)集雙曲嵌入論文代碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在服務(wù)器上安裝python3.8.2環(huán)境的教程詳解
這篇文章主要介紹了在服務(wù)器上安裝python3.8.2環(huán)境的教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Python實(shí)現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例
本文主要介紹了Python實(shí)現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11ubuntu系統(tǒng)如何從python3.7升級到python3.8
這篇文章主要給大家介紹了關(guān)于ubuntu系統(tǒng)如何從python3.7升級到python3.8的相關(guān)資料,Python是一種廣泛使用的編程語言,而Ubuntu是一個流行的開源操作系統(tǒng),通過升級Python您可以獲得新功能、性能改進(jìn)和安全修復(fù),需要的朋友可以參考下2023-11-11Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計算評估
本文是對隨機(jī)森林如何用在特征選擇上做一個簡單的介紹。隨機(jī)森林非常簡單,易于實(shí)現(xiàn),計算開銷也很小,更令人驚奇的是它在分類和回歸上表現(xiàn)出了十分驚人的性能2021-10-10從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)
在Python一般都是運(yùn)用內(nèi)置函數(shù)open()與文件進(jìn)行交互,下面說說具體用法2014-05-05Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密(推薦)
在Python中實(shí)現(xiàn)AES算法需要借助的第三方庫Crypto,其在各個操作系統(tǒng)上的安裝方法有些許復(fù)雜,所以對于簡單的使用有點(diǎn)殺雞用牛刀的意思。這篇文章主要介紹了利用Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密,需要的朋友可以參考下2019-12-12