一、embedding如何处理文本
在NLP任务中,首先要对文本进行处理,将文本进行编码转换,形成向量表达,embedding处理文本的流程如下:
(1)输入一段文本,中文会先分词(如jieba分词),英文会按照空格提取词
(2)首先将单词转成字典的形式,由于英语中以空格为词的分割,所以可以直接建立词典索引结构。类似于:word2id = {‘i’ : 1, ‘like’ : 2, ‘you’ : 3, ‘want’ : 4, ‘an’ : 5, ‘apple’ : 6} 这样的形式。如果是中文的话,首先进行分词操作。
(3)然后再以句子为list,为每个句子建立索引结构,list [ [ sentence1 ] , [ sentence2 ] ] 。以上面字典的索引来说,最终建立的就是 [ [ 1 , 2 , 3 ] , [ 1 , 4 , 5 , 6 ] ] 。这样长短不一的句子
(4)接下来要进行padding的操作。由于tensor结构中都是等长的,所以要对上面那样的句子做padding操作后再利用 nn.Embedding 来进行词的初始化。padding后的可能是这样的结构
[ [ 1 , 2 , 3, 0 ] , [ 1 , 4 , 5 , 6 ] ] 。其中0作为填充。(注意:由于在NMT任务中肯定存在着填充问题,所以在embedding时一定存在着第三个参数,让某些索引下的值为0,代表无实际意义的填充)
二、embedding使用示例
比如有两个句子:
I want a plane
I want to travel to Beijing
将两个句子转化为ID映射:
{I:1,want:2,a:3,plane:4,to:5,travel:6,Beijing:7}
转化成ID表示的两个句子如下:
1,2,3,4
1,2,5,6,5,7
import torch
from torch import nnif __name__ == "__main__":# 将第一个句子填充0,与第二个句子长度对齐# data.shape = (2, 6)# one-hot data = 2 * 6 * 10data = [[1, 2, 3, 4, 0, 0], [1, 2, 5, 6, 5, 7]]in_vector = torch.LongTensor(data)# 创建字典,最大词个数为10,每个词用维度为4表示embedding = nn.Embedding(10, 4)out_emb = embedding(in_vector)print("in_vector.shape:",in_vector.shape)print("embedding.weight.shape:",embedding.weight.shape)print("out_emb.shape:",out_emb.shape)print("out_emb:",out_emb)print("embedding.weight:",embedding.weight)
输出结果:
in_vector.shape: torch.Size([2, 6])
embedding.weight.shape: torch.Size([10, 4])
out_emb.shape: torch.Size([2, 6, 4])
out_emb: tensor([[[ 0.3840, 1.8390, -0.4930, 1.9279],[-0.8952, 0.1091, -0.2830, 0.4099],[-0.5144, -1.7991, 0.6782, -0.5414],[ 0.7053, -0.8193, 1.1752, -0.7090],[ 0.8880, 0.3052, 1.3366, -0.9206],[ 0.8880, 0.3052, 1.3366, -0.9206]],[[ 0.3840, 1.8390, -0.4930, 1.9279],[-0.8952, 0.1091, -0.2830, 0.4099],[-1.1050, 0.4040, -0.7571, 0.8230],[-0.4365, -0.9059, -3.7702, -0.0430],[-1.1050, 0.4040, -0.7571, 0.8230],[ 0.2677, -1.5236, 0.3324, -1.9825]]], grad_fn=<EmbeddingBackward0>)
embedding.weight: Parameter containing:
tensor([[ 0.8880, 0.3052, 1.3366, -0.9206],[ 0.3840, 1.8390, -0.4930, 1.9279],[-0.8952, 0.1091, -0.2830, 0.4099],[-0.5144, -1.7991, 0.6782, -0.5414],[ 0.7053, -0.8193, 1.1752, -0.7090],[-1.1050, 0.4040, -0.7571, 0.8230],[-0.4365, -0.9059, -3.7702, -0.0430],[ 0.2677, -1.5236, 0.3324, -1.9825],[-0.8469, -1.0805, 1.0592, -0.5903],[ 1.0013, -1.6504, -1.7999, -0.8189]], requires_grad=True)
如果使用one-hot编码,输入的向量维度为(2,6,10)
如果使用embedding,输入的向量维度为(2,6,4)维度大幅降低
nn.Embedding相当于是一本词典,本例中,词典中一共有10个词,每个词的嵌入维度为4。
链接:
1.https://blog.csdn.net/qq_41477675/article/details/114645012
2.https://blog.csdn.net/qq_43426908/article/details/133046902?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-133046902-blog-132993128.235v43pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.1&utm_relevant_index=3
3.https://zhuanlan.zhihu.com/p/164502624