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>)
參考資料: