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