Search code examples
pythondictionarykeraskeras-layerword-embedding

How to get word vectors from Keras Embedding Layer


I'm currently working with a Keras model which has a embedding layer as first layer. In order to visualize the relationships and similarity of words between each other I need a function that returns the mapping of words and vectors of every element in the vocabulary (e.g. 'love' - [0.21, 0.56, ..., 0.65, 0.10]).

Is there any way to do it?


Solution

  • You can get the word embeddings by using the get_weights() method of the embedding layer (i.e. essentially the weights of an embedding layer are the embedding vectors):

    # 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]