实现词嵌入通常有两种做法:
(1)利用PyTorch自带的Embedding Layer;
(2)使用预训练模型,例如ELMo,Bert等,使词嵌入之间有更好的语义信息;
PyTorch词嵌入的主要的步骤如下所示:
1、准备好所要使用的语料库 2、构建字典,使语料库中的每个词都对应一个索引 3、利用Embedding Layer对输入的自然语言做embedding嵌入,作为网络的第一层 4、训练网络模型,更新第3步输入的权重
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None, device=None, dtype=None)
与制作 one-hot 向量时对每个单词定义一个特殊的索引类似,当我们使用词向量时也需要为每个单词定义一个索引。这些索引将是查询表的关键点。词嵌入被被存储在一个$|V|* D$的向量中,其中$D$是词嵌入的维度。词被分配的索引$i$,表示在向量的第$i$行存储它的嵌入。在下面代码中,从单词到索引的映射是一个叫 word_to_ix 的字典。
另外,需要注意的是,索引这张表时,你必须使用torch.LongTensor(因为索引是整数,不是浮点数)。
import torch
import torch.nn as nn
torch.manual_seed(1)
word_to_ix = {"hello": 0, "world": 1}
embeds = nn.Embedding(2, 5) # 2 words in vocab, 5 dimensional embeddings
lookup_tensor = torch.tensor([word_to_ix["hello"]], dtype=torch.long)
hello_embed = embeds(lookup_tensor)
print(hello_embed)
输出结果为:
tensor([[ 0.6614, 0.2669, 0.0617, 0.6213, -0.4519]],
grad_fn=<EmbeddingBackward0>)