import torch
import torch.nn as nn
instr = "词嵌入怎么用?"
print("原句子为:", instr)
# 该查找表即为极简词汇表(vocabulary)
lookup_table = list("啊窝饿词入嵌怎用么?")
print("词汇表(极简版)为:", lookup_table)
inp = []
for ch in instr:
inp.append(lookup_table.index(ch))
print("经过查找表之后,原句子变为:", inp)
inp = torch.tensor(inp)
embedding_dim = 3
emb = nn.Embedding(
num_embeddings=len(lookup_table),
embedding_dim=embedding_dim)
print("最终结果:")
print(emb(inp))
print("词嵌入就是这样用的!")
定义embedding对象的时候主要设置两个参数:
第一个是词汇表的大小,也就是说输入的向量最大值+1为多少,比如上述例子中,词汇表大小为10,那么第一个参数就为10;
第二个参数,嵌入维度的大小,也就是想要把这些词嵌入到多少维的空间中去,这里选择的是3。
要注意的是,embedding定义完成之后,直接将文字输入进去显然是不行的,这里需要借助词汇表(就是上述代码中的查找表)将句子中的每一个单位转变为一个ID,即整数。转换完成之后,句子变为:
[3, 5, 4, 6, 8, 7, 9]
之后,使用该数组,使用torch.tensor初始化一个张量(其实严格来说应该是LongTensor,但是实测普通的也可以),要注意的是,每一个数值必须是整形。
那么上述的代码最终输出即为:
原句子为: 词嵌入怎么用?
词汇表(极简版)为: ['啊', '窝', '饿', '词', '入', '嵌', '怎', '用', '么', '?']
经过查找表之后,原句子变为: [3, 5, 4, 6, 8, 7, 9]
最终结果:
tensor([[ 1.7100, -1.1664, -1.0826],
[ 0.4269, 0.0083, 0.1705],
[ 0.5437, 0.4313, -0.3120],
[-1.2683, 1.1118, -0.3076],
[-0.1764, 1.1064, 0.5663],
[-1.0042, -1.8506, -0.0175],
[-0.9052, 0.5412, -0.2921]], grad_fn=<EmbeddingBackward>)
词嵌入就是这样用的!
可以看到,嵌入模块将原句子嵌入成为了一个7 x 3的张量 ,7为句子长度,3为定义的嵌入维度。