pytorch實現word embedding: torch.nn.Embedding


pytorch中實現詞嵌入的模塊是torch.nn.Embedding(m,n),其中m是單詞總數,n是單詞的特征屬性數目。

例一

import torch
from torch import nn

embedding = nn.Embedding(10, 3)     #總共有10個單詞,每個單詞表示為3個維度特征。此行程序將創建一個可查詢的表,
                                    #表中包含一個10*3的張量,張量中的數值是隨機初始化的,每一行代表一個單詞。
                                    #在神經網絡的訓練過程中,張量中的數值也將得到訓練,每次迭代都將更新。

input = torch.LongTensor([5])       #假如我想取出第6個單詞的詞向量。
word_vector = embedding(input)      #這樣就取出第6個單詞的詞向量了。input必須是Longtensor型的張量。
print('5th word embedding is:\n {}'.format(word_vector))

inputs = torch.LongTensor([0, 2, 9])     #假如我想取出第多個單詞的詞向量,比如第1、3、10個單詞的詞向量。
words_vector = embedding(inputs)         #這樣就取出多個單詞的詞向量了。
print("words' embedding are:\n {}".format(words_vector))

值得注意的是,程序第9行的word_vector是一個張量,size為([1, 3]),1表示只取出一個單詞的詞向量;3表示詞向量的長度是3,即有3個特征。同樣的,程序中的words_vector的size為([3, 3])。如果input的size是([n]),則輸出的size為([n, dim]),dim表示特征數目;如果input的size是([b,n]),則輸出的size為([b,n, dim]),b表示batchsize。

例二

例一程序中embedding的詞嵌入張量是隨機初始化的,如果從已經訓練好的詞向量中獲取,則采用

import torch
from torch import nn
import numpy as np

#已訓練好的詞向量,大小為10*3
pretrained_weight = np.array([[ 1.33869969, -0.16198419,  1.65357883],
                              [ 1.55555752,  2.25915442, -1.7898287 ],
                              [-0.31996402,  1.12052144,  0.76315345],
                              [ 0.03442668,  0.03288871, -0.46975346],
                              [ 0.36835297,  1.47698013,  0.26740319],
                              [ 2.21786653, -0.64531753, -0.57987762],
                              [-1.82413935,  0.44493353, -1.54555689],
                              [ 0.44076455,  0.28416441,  0.38695892],
                              [-0.18101847,  0.13821242,  0.28120627],
                              [ 0.99084866, -0.03077417,  1.08613474]])

embedding = nn.Embedding(10, 3)  #隨機初始化詞向量
embedding.weight.data.copy_(torch.from_numpy(pretrained_weight))   #把隨機初始化的詞向量替換為已訓練好的詞向量
print(embedding.weight.data)

輸出結果:

tensor([[ 1.3387, -0.1620,  1.6536],
        [ 1.5556,  2.2592, -1.7898],
        [-0.3200,  1.1205,  0.7632],
        [ 0.0344,  0.0329, -0.4698],
        [ 0.3684,  1.4770,  0.2674],
        [ 2.2179, -0.6453, -0.5799],
        [-1.8241,  0.4449, -1.5456],
        [ 0.4408,  0.2842,  0.3870],
        [-0.1810,  0.1382,  0.2812],
        [ 0.9908, -0.0308,  1.0861]])

例三

把‘I earn the trust and respect of those around through my commitment every single day’這句話做詞嵌入。

import torch
from torch import nn

words = 'I earn the trust and respect of those around through my commitment every single day'.split()
words = set(words)  #去掉重復的單詞
word_to_idx = {word: i for i, word in enumerate(words)}     #把每個單詞都編號,因為在embedding中取出詞向量時只能用數字
embedding = nn.Embedding(len(words), 8)                     #每個詞向量長度為8,即有8個特征
trust_idx = torch.LongTensor([word_to_idx['trust']])        #假如我想取出單詞trust的詞向量
trust_vector = embedding(trust_idx)
print(trust_vector)

輸出結果為:

tensor([[ 0.8197,  0.1230,  2.7905,  1.0388, -0.5418, -1.4987,  0.6195, -1.6211]],
       grad_fn=<EmbeddingBackward>)

 

參考資料:

[1] pytorch中的embedding詞向量的使用方法

[2] 10分鍾快速入門PyTorch (7) word embedding


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM