欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python算法學(xué)習(xí)雙曲嵌入論文代碼實(shí)現(xiàn)數(shù)據(jù)集介紹

 更新時間:2021年11月05日 10:30:59   作者:Kanny廣小隸  
由于雙曲嵌入相關(guān)的文章已經(jīng)有了一系列的代碼。本篇博客主要目的實(shí)現(xiàn)最開始的雙曲嵌入論文,將論文中有些直接寫出來的內(nèi)容進(jìn)行了細(xì)節(jié)的推導(dǎo),同時實(shí)現(xiàn)對應(yīng)的代碼

學(xué)習(xí)的文章:

Poincaré Embeddings for Learning Hierarchical Representations

主要參考的代碼:

poincare_embeddings

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)文章

  • Python3多線程操作簡單示例

    Python3多線程操作簡單示例

    這篇文章主要介紹了Python3多線程操作,結(jié)合實(shí)例形式分析了Python3兼容Python2使用_thread進(jìn)行多線程操作的簡單實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-05-05
  • 在服務(wù)器上安裝python3.8.2環(huán)境的教程詳解

    在服務(wù)器上安裝python3.8.2環(huán)境的教程詳解

    這篇文章主要介紹了在服務(wù)器上安裝python3.8.2環(huán)境的教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Python實(shí)現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例

    Python實(shí)現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例

    本文主要介紹了Python實(shí)現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • ubuntu系統(tǒng)如何從python3.7升級到python3.8

    ubuntu系統(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-11
  • 詳解python中文編碼問題

    詳解python中文編碼問題

    一直以來python中文編碼是個及其頭大的問題,需要好好學(xué)習(xí)下,我用python為例,簡單介紹下python編程時如何處理好中文編碼的問題,感興趣的朋友們可以參考下
    2021-06-06
  • 基于Python 的語音重采樣函數(shù)解析

    基于Python 的語音重采樣函數(shù)解析

    這篇文章主要介紹了基于Python 的語音重采樣函數(shù)解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計算評估

    Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計算評估

    本文是對隨機(jī)森林如何用在特征選擇上做一個簡單的介紹。隨機(jī)森林非常簡單,易于實(shí)現(xiàn),計算開銷也很小,更令人驚奇的是它在分類和回歸上表現(xiàn)出了十分驚人的性能
    2021-10-10
  • Django實(shí)現(xiàn)文件上傳下載功能

    Django實(shí)現(xiàn)文件上傳下載功能

    這篇文章主要為大家詳細(xì)介紹了Django實(shí)現(xiàn)文件上傳下載功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)

    從零學(xué)python系列之從文件讀取和保存數(shù)據(jù)

    在Python一般都是運(yùn)用內(nèi)置函數(shù)open()與文件進(jìn)行交互,下面說說具體用法
    2014-05-05
  • Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密(推薦)

    Python內(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

最新評論