如何从 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 层?