官网地址:Embedding — PyTorch master documentation
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)
这个函数的作用就是词嵌入,把词典中的词映射为指定维度的词向量,下面是主要参数说明:
num_embeddings :字典中词的个数
embedding_dim:embedding的维度
padding_idx(索引指定填充):如果给定,则遇到padding_idx中的索引,则将其位置填0(0是默认值,事实上随便填充什么值都可以)。
input:(∗) , LongTensor 结构
output:(*,e):*是input的大小,e是embedding_dim,即每个词的embedding的维度
注:embeddings中的值是正态分布N(0,1)中随机取值。
一般任务中的流程,embedding是如何处理文本的:
输入一段文本,中文会先分词,英文会按照空格提取词
1)首先将单词转成字典的形式,由于英语中以空格为词的分割,所以可以直接建立词典索引结构。类似于:word2id = {'i' : 1, 'like' : 2, 'you' : 3, 'want' : 4, 'an' : 5, 'apple' : 6} 这样的形式。如果是中文的话,首先进行分词操作。
2)然后再以句子为list,为每个句子建立索引结构,list [ [ sentence1 ] , [ sentence2 ] ] 。以上面字典的索引来说,最终建立的就是 [ [ 1 , 2 , 3 ] , [ 1 , 4 , 5 , 6 ] ] 。这样长短不一的句子
3) 接下来要进行padding的操作。由于tensor结构中都是等长的,所以要对上面那样的句子做padding操作后再利用 nn.Embedding 来进行词的初始化。padding后的可能是这样的结构
[ [ 1 , 2 , 3, 0 ] , [ 1 , 4 , 5 , 6 ] ] 。其中0作为填充。(注意:由于在NMT任务中肯定存在着填充问题,所以在embedding时一定存在着第三个参数,让某些索引下的值为0,代表无实际意义的填充)
下面是一个例子代码解读:
实际任务中有很多方式可以进行词嵌入,因为自然语言处理第一步肯定就是先把词转换成计算机可以处理的方式,可以通过查表导入静态词向量,如 word2vec,glove等;也可以直接初始化通过 nn.Embedding() ,还可以根据自己的需求定义,
例如:自定义的初始化编码方式,比如那个日期识别模型里面是把输入输出都初始化成30和10维的向量,在每个对应单词的索引置1,其他是置0: