深度学习:如何建立字符级嵌入?

时间:2019-05-14 13:21:08

标签: python tensorflow keras pytorch embedding

我正在尝试在模型中使用字符级嵌入,但是我对字符级嵌入几乎没有疑问。

对于单词级嵌入:

Sentence = 'this is a example sentence'

创建词汇:

vocab = {'this' : 0 , 'is' :1 , 'a': 2 'example' : 3, 'sentence' : 4 }

对句子进行编码:

encoded_sentence = [ 0, 1 , 2 , 3 , 4 ]

现在将其发送到任何经过预训练的嵌入程序,例如word2vec或手套:

每个id都将替换为300或嵌入dim:

embedding_sentence = [ [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] , [ 0.331,0.11 , ----300th dim ] ] 

如果我们要批处理,那么我们填充句子

所以形状像这样:

[ batch_size , max_sentence_length , embedding_dim ]

现在可以进行字符级嵌入了:

因此对于char级嵌入:

Sentence = 'this is a example sentence'

创建char_vocab:

char_vocab = [' ', 'a', 'c', 'e', 'h', 'i', 'l', 'm', 'n', 'p', 's', 't', 'x']

int_to_vocab = {n:m for m,n in enumerate(char_vocab)}

按字符级对句子进行编码:

现在这是我的困惑,因此在单词嵌入中,我们首先将句子标记化,然后使用vocab id(word_id)对每个标记进行编码

但是对于char嵌入,如果我对句子进行标记,然后使用字符级编码,则shape将为4暗,并且我无法将其输入LSTM。

但是,如果我没有标记和直接编码原始文本,则它为3暗,我可以将其输入LSTM

例如:

具有标记化:

 token_sentence = ['this','is','a','example','sentence']

encoded_char_level = []

for words in token_sentence:
    char_lvel = [int_to_vocab[char] for char in words]
    encoded_char_level.append(char_lvel)

它看起来像这样:

[[0, 1, 2, 3],
 [2, 3],
 [5],
 [6, 7, 5, 8, 9, 10, 6],
 [3, 6, 11, 0, 6, 11, 12, 6]]

现在我们必须将其填充两个级别,一个是char_level填充,第二个是句子级填充:

char_level_padding:

[[0, 1, 2, 3, 0, 0, 0,0],
 [2, 3, 0, 0, 0, 0, 0, 0],
 [5, 0, 0, 0, 0, 0, 0, 0],
 [6, 7, 5, 8, 9, 10, 6, 0],
 [3, 6, 11, 0, 6, 11, 12, 6]]

现在,如果我们有4个句子,那么我们必须在每个句子中填充最大句子len,这样形状将是:

[batch_size , max_sentence_length , max_char_length ] 

现在,如果我们将其传递给嵌入层,则:

[ batch_size , max_sentence_length, max_char_length , embedding_dim ] 

4点昏暗。

如何使用字符级对句子进行编码并将其与tensorflow LSTM层一起使用?

Because lstm takes 3 dim input [ batch_size , max_sequence_length , embedding_dim ] 

我可以像这样使用它吗:

[ Batch_size , ( max_sentence_length x max_char_length ) , dim ] 

例如:

[ 12 , [ 3 x 4 ] , 300 ]

1 个答案:

答案 0 :(得分:1)

您可以将字符级特征以固定的长度连接起来。

例如:

``[[0, 1, 2, 3, 0, 0, 0,0],
  [2, 3, 0, 0, 0, 0, 0, 0],
  [5, 0, 0, 0, 0, 0, 0, 0],
  [6, 7, 5, 8, 9, 10, 6, 0],
  [3, 6, 11, 0, 6, 11, 12, 6]]``

可以更改为:     [[0, 1, 2, 3, 0, 0, 0,0,2, 3, 0, 0, 0, 0, 0, 0,5, 0, 0, 0, 0, 0, 0, 0,6, 7, 5, 8, 9, 10, 6, 0,3, 6, 11, 0, 6, 11, 12, 6]]