如何从 Keras 嵌入层获取词向量

Posted

技术标签:

【中文标题】如何从 Keras 嵌入层获取词向量【英文标题】:How to get word vectors from Keras Embedding Layer 【发布时间】:2018-12-16 12:31:50 【问题描述】:

我目前正在使用具有嵌入层作为第一层的 Keras 模型。为了可视化单词之间的关系和相似性,我需要一个函数来返回词汇表中每个元素的单词和向量的映射(例如,'love' - [0.21, 0.56, ..., 0.65, 0.10] )。

有什么办法吗?

【问题讨论】:

【参考方案1】:

您可以使用嵌入层的get_weights() 方法获得词嵌入(即嵌入层的权重本质上是嵌入向量):

# if you have access to the embedding layer explicitly
embeddings = emebdding_layer.get_weights()[0]

# or access the embedding layer through the constructed model 
# first `0` refers to the position of embedding layer in the `model`
embeddings = model.layers[0].get_weights()[0]

# `embeddings` has a shape of (num_vocab, embedding_dim) 

# `word_to_index` is a mapping (i.e. dict) from words to their index, e.g. `love`: 69
words_embeddings = w:embeddings[idx] for w, idx in word_to_index.items()

# now you can use it like this for example
print(words_embeddings['love'])  # possible output: [0.21, 0.56, ..., 0.65, 0.10]

【讨论】:

使用这一行 'words_embeddings = w: embeddings[idx] for w, idx in tokenizer.word_index' 我得到以下异常:IndexError: only integers, slices (:), ellipsis (...)、numpy.newaxis (None) 和整数或布尔数组是有效的索引。 tokenizer.word_index 返回从单词到其索引的映射。 @dermaschder 我想你忘记在字典上调用items(),即tokenizer.word_index.items() 不要忘记添加特殊字符,以防您在输入中为某些用例(例如 LSTM)添加填充。您也可以为填充添加索引,例如 word_to_index['__padding__'] = 0 @today,在 Keras 中嵌入是静态的还是动态的(有时称为上下文嵌入)? @A.B 如果您指的是上下文化与非上下文化嵌入,那么这与您使用的 Keras 或 DL 框架完全无关。相反,它与您使用的方法或算法有关。嵌入层本身只是一个查找表:给定一个整数索引,它返回一个与该索引对应的向量。是您,作为模型的方法或架构的设计者,决定以模型为您提供上下文化或非上下文化嵌入的方式使用它。

以上是关于如何从 Keras 嵌入层获取词向量的主要内容,如果未能解决你的问题,请参考以下文章

第九篇:分布式语义

第九篇:分布式语义

如何在 Keras 中使用 return_sequences 选项和 TimeDistributed 层?

如何在 Keras 中为循环神经网络 (RNN) 使用嵌入层

来自 Keras 中 lm_1b 的字符-词嵌入

用Word2Vec词向量化的数据训练Seq2Seq翻译模型的问题?