pytorch提供word embeding的功能来构建词向量,非稀疏向量。我们来看看他的定义方式:
import torch.nn as NN
import torch
from torch.autograd import Variable
embeding=NN.Embedding(6,5)
print(embeding.weight)
输出:
Parameter containing:
tensor([[ 1.8258, -1.8348, -1.2096, 1.0891, 0.0996],
[ 0.3915, 0.6089, 1.4112, 0.2724, -0.3034],
[ 1.3619, 0.2148, -0.2694, -0.6444, -0.6987],
[ 1.4956, 0.3266, -0.3316, -0.9657, 0.6713],
[ 0.3749, -0.9375, -0.8220, -1.3379, 0.1247],
[-1.4812, 0.1289, 0.8787, -1.0455, 0.9147]])
这里NN.Embedding(6,5)两个参数第一个是指词典中词的个数,后面一个是词向量维度。如输出所示这样我们就构建一个词典大小为6,向量维度为5的向量库。
词典应该怎么构造呢?词典应该有词和索引,所以可以用dict来构造:
word_to_index={'中':[0],'国':[1],'我':[2],'的':[3],'母':[4],'亲':[5]}
注意,key是中文字符,value要是list。这个词典大小为6,,那么可以用定义好的embedding来构造词向量:
index=Variable(torch.LongTensor(word_to_index['中']))
print(embeding(index))
输出
tensor([[ 0.8598, 0.3122, 0.8926, -0.9521, 0.1800]])
这就得到‘中’这个字的word vector。
同理sentence vector可以如下表示:
index=[word_to_index['中'],word_to_index['国'],word_to_index['我'],word_to_index['的'],word_to_index['母'],word_to_index['亲']]
index=Variable(torch.LongTensor(index))
print(embeding(index))
输出
tensor([[[-0.2161, 0.2320, 0.2735, -0.1969, -0.7603]],
[[ 1.0680, 1.1965, 0.6511, 1.4256, -0.7490]],
[[ 0.3841, -0.5595, -0.9003, -1.2678, -1.4317]],
[[ 1.2867, 0.0704, 0.4049, -1.6118, 0.7231]],
[[-0.8996, 0.3947, 0.3799, 0.1408, -0.3430]],
[[ 2.0890, 0.6255, 0.7351, -0.4562, -1.0978]]])
可见embedding的原理就是随机生成词向量给每个词。