因为文本不能够直接被模型计算,所以需要将其转化为向量
把文本转化为向量有两种方式:
在one-hot编码中,每一个token使用一个长度为N的向量表示,N表示词典的数量。
即:把待处理的文档进行分词或者是N-gram处理,然后进行去重得到词典。
token | one-hot encoding |
---|---|
深 | 1000 |
度 | 0100 |
学 | 0010 |
习 | 0001 |
弊端:我们有1万个词的时候,编码很长,而且只有一个位置的1有效。使用稀疏向量表示文本,占用空间比较大。
word embedding是深度学习中表示文本常用的一种方法。和one-hot编码不同,word embedding使用了浮点型的稠密矩阵来表示token。根据词典的大小,我们的向量通常使用不同的维度,例如100,256,300等。其中向量中的每一个值是一个超参数,其初始值是随机生成的,之后会在训练的过程中进行学习中获得。Word embedding 的目标是捕捉词语之间的语义关系,使得相似含义的词在向量空间中的表示更为接近。
如果我们文本中有20000个词语,如果使用one-hot编码,那么我们会有20000*20000的矩阵,其中大多数的位置都为0,但是如果我们使用word embedding来表示的话,只需要20000*维度,比如20000*300的形象表示就是:
token | num | vector |
---|---|---|
词1 | 0 | [w11,w12,w13···w1N],其中N表示维度(dimension) |
词2 | 1 | [w21,w22,w23···w2N] |
词3 | 2 | [w31,w32,w33···w3N] |
··· | ··· | ··· |
词m | m | [wm1,wm2,wm3···wmN],其中m表示词典的大小 |
我们会把所有的文本转化为向量,把句子用向量来表示
在这之间,我们会先把token使用数字来表示再把数字用向量来表示
即:token —> num —> vector。
比如,dog是1,cat是2,lion是3,然后再将1、2、3转化为向量。
token | d1 | d2 | d3 | d4 |
---|---|---|---|---|
dog | -0.4 | 0.37 | 0.02 | -0.34 |
cat | -0.15 | -0.02 | -0.23 | -0.23 |
lion | 0.19 | -0.4 | 0.35 | -0.48 |
tiger | -0.08 | 0.31 | 0.56 | 0.07 |
elephant | -0.04 | -0.09 | 0.11 | -0.06 |
cheetah | 0.27 | -0.28 | -0.2 | -0.43 |
monkey | -0.02 | -0.67 | -0.21 | -0.48 |
rabbit | -0.04 | -0.3 | -0.18 | -0.47 |
mouse | 0.09 | -0.46 | -0.35 | -0.24 |
这批batch的每个句子有N个词,总共有batch_size个句子,也就是说这批batch的形状为[batch_size, N]。
word embedding规定,每个词映射到长度为4的向量上,即维度为4。其形状为[M, D]
这批batch经过word embedding后,查询其中的词典(M个词),把每一个句子的词映射到其中的向量上,最终batch的形状变成了[batch_size, N, D]。
torch.nn.Embedding(num_embeddings,embedding_dim)
参数:
使用方法:
embedding = nn.Embedding(vocab_size,300)#实例化
input_embed = embedding(input) #进行embedding操作
思考:每一个batch中的句子有10个词语,经过形状为[20, 4]的word embedding之后,原来的句子会变成什么形状?
因为word emdedding规定每个词用长度为4的向量表示,所以batch中每个句子中的10个词语会分布到向量的4个分量上,最终变成[batch_size, 10, 4]。
做图码字不易,可以点个赞嘛,谢谢你~~~