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

spa*_*h2o 3 nlp r text-analysis keras

我一直在使用 JJ Allaire 的指南,在神经网络模型中使用词嵌入进行文本处理(https://jjallaire.github.io/deep-learning-with-r-notebooks/notebooks/6.1-using-word-embeddings.nb .html)。我对模型如何将标记化的单词序列 (x_train) 与使用整个数据集(而不仅仅是训练数据)定义的词嵌入相关联感到困惑。有没有办法概念化单词标记如何映射到单词嵌入?否则,像“king”这样的词如何映射到词嵌入(例如使用 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()
Run Code Online (Sandbox Code Playgroud)

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

小智 6

简而言之

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


简而言之

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

在此处输入图片说明

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

embedding_matrix要传递到keras::set_weights()一个二维矩阵,其中的行匹配你的词汇。例如,第 75 行的值embedding_matrix是词汇表第 75 位单词的词向量。

因此,如果您在预先训练的嵌入上进行粘合,如上面的示例所示,那么keras::layer_embedding()只需将embedding_matrix. 我们可以将操作风格化为

for (x in 1:nrow(train_x)) {
  for (y in 1:ncol(train_x)) {
    train_x[x, y] <- embedding_matrix[train_x[x, y], ]
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,我们以一个 3d 矩阵(一个立方体)结束,我们可以将其风格化为:

在此处输入图片说明


Cra*_*.Li 1

分词器包含两个字典,一个是words->index,另一个是index->​​words。索引显示了单词的频率,所以它只是统计该单词在所有数据集中出现的次数,单词出现的次数越多,索引就会越小。

词嵌入有点像字典,它将单词或索引映射到向量,假设我们想用 128 个维度的向量来表示一个单词。它可以在巨大的数据集上进行训练,可以使用 GloVe 或 Word2Vec(skip-gram 模型)。在 Keras 中,您可以轻松添加嵌入层,嵌入层学习如何通过向量表示索引。

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