一、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