如何在概念上考虑标记化单词和单词嵌入之间的关系?

时间:2018-05-04 23:32:10

标签: r nlp keras text-analysis

我一直在使用JJ Allaire的指南在神经网络模型中使用文字嵌入进行文本处理(https://jjallaire.github.io/deep-learning-with-r-notebooks/notebooks/6.1-using-word-embeddings.nb.html)。我很困惑模型如何将标记化的单词序列(x_train)与使用整个数据集定义的单词嵌入(而不仅仅是训练数据)相关联。有没有办法概念化单词标记如何映射到单词嵌入?否则,一个像“王”这样的词怎么样?映射到嵌入一词(例如使用Glove获得)。我正在谈论这些代码块之间的关系:

#building model 
history <- model %>% fit(
 x_train, y_train,
 epochs = 20,
 batch_size = 32,
 validation_data = list(x_val, y_val)
)

#relating model to word embeddings
model <- keras_model_sequential() %>% 
layer_embedding(input_dim = max_words, output_dim = embedding_dim, 
              input_length = maxlen) %>% 
layer_flatten() %>% 
layer_dense(units = 32, activation = "relu") %>% 
layer_dense(units = 1, activation = "sigmoid")

get_layer(model, index = 1) %>% 
 set_weights(list(embedding_matrix)) %>% 
 freeze_weights()

如何将x_train中的标记化单词链接回embedding_matrix中的单词(特别是如果嵌入层是针对所有数据进行训练的话)?

2 个答案:

答案 0 :(得分:3)

简而言之

从概念上讲,keras::layer_embedding()采用2D矩阵[samples, word_sequences],其中值是整数字标识符(字索引),并将所述值替换为其字向量,以便它变为一个3D矩阵[samples, word_sequences, embeddings] - 换句话说,其中值是单词向量,而不是单词标识符。粘贴的单词向量可以来自其他地方,如上例所示,或者它们可以在培训期间随机初始化和更新。

短篇

您传递了keras::layer_embedding()个单词序列。 train_x是一个2D矩阵,其中行是样本(文档),列是单词序列。 train_x中的值是每个单词的整数标识符(单词索引),对应于它们在单独存储的单词列表(词汇表)中的位置。我们可以将train_x样式化为:

enter image description here

此处,值75对应于词汇表第75位的单词。

您传递给embedding_matrix的{​​{1}}是一个2D矩阵,其中的行与词汇表的行匹配。例如,keras::set_weights()的第75行上的值是词汇表第75位的单词向量。

因此,如果您正在使用预先训练的嵌入,如上例所示,那么embedding_matrix只会将单词index替换为keras::layer_embedding()行中的单词向量。我们可以将操作风格化为

embedding_matrix

因此,我们以3d矩阵(立方体)结束,我们可以将其设置为:

enter image description here

答案 1 :(得分:0)

标记器包含两个字典,一个是单词 - >索引,另一个是索引 - >单词。索引显示单词的频率,因此只计算单词出现在所有数据集中的次数,单词出现的次数越多,索引就越小。

Word嵌入就像字典一样,它将单词或索引映射到向量,比如说我们要用128个dims向量表示一个单词。它可以在庞大的数据集上进行训练,您可以使用GloVe或Word2Vec(skip-gram模型)。在Keras中,您可以轻松添加嵌入图层,嵌入图层可以学习如何通过矢量表示索引。

我认为您的训练数据和测试数据来自相同的分布,因此单词索引或嵌入向量应该相等,这就是我们在整个数据集上训练嵌入的原因。