¿Cómo creo una capa de incrustación Keras a partir de un conjunto de datos de incrustación de palabras previamente entrenado?

¿Cómo puedo cargar una inserción de palabras pre-entrenada en una capa de Embedding Keras?

Descargué el archivo glove.6B.50d.txt (glove.6B.zip de https://nlp.stanford.edu/projects/glove/ ) y no estoy seguro de cómo agregarlo a una capa de incrustación Keras. Ver: https://keras.io/layers/embeddings/

Deberá pasar una matriz de incrustación a la capa de Embedding siguiente manera:

Embedding(vocabLen, embDim, weights=[embeddingMatrix], trainable=isTrainable)

  • vocabLen : número de tokens en tu vocabulario
  • embDim : incrustación de vectores de dimensión (50 en su ejemplo)
  • embeddingMatrix : matriz de incrustación construida a partir de guante.6B.50d.txt
  • isTrainable : si desea que las incrustaciones sean entrenables o congelen la capa

El glove.6B.50d.txt es una lista de valores separados por espacios en blanco: token de palabra + (50) incrustación de valores. por ejemplo, the 0.418 0.24968 -0.41242 ...

Para crear un pretrainedEmbeddingLayer desde un archivo Glove:

 # Prepare Glove File def readGloveFile(gloveFile): with open(gloveFile, 'r') as f: wordToGlove = {} # map from a token (word) to a Glove embedding vector wordToIndex = {} # map from a token to an index indexToWord = {} # map from an index to a token for line in f: record = line.strip().split() token = record[0] # take the token (word) from the text line wordToGlove[token] = np.array(record[1:], dtype=np.float64) # associate the Glove embedding vector to a that token (word) tokens = sorted(wordToGlove.keys()) for idx, tok in enumerate(tokens): kerasIdx = idx + 1 # 0 is reserved for masking in Keras (see above) wordToIndex[tok] = kerasIdx # associate an index to a token (word) indexToWord[kerasIdx] = tok # associate a word to a token (word). Note: inverse of dictionary above return wordToIndex, indexToWord, wordToGlove # Create Pretrained Keras Embedding Layer def createPretrainedEmbeddingLayer(wordToGlove, wordToIndex, isTrainable): vocabLen = len(wordToIndex) + 1 # adding 1 to account for masking embDim = next(iter(wordToGlove.values())).shape[0] # works with any glove dimensions (eg 50) embeddingMatrix = np.zeros((vocabLen, embDim)) # initialize with zeros for word, index in wordToIndex.items(): embeddingMatrix[index, :] = wordToGlove[word] # create embedding: word index to Glove word embedding embeddingLayer = Embedding(vocabLen, embDim, weights=[embeddingMatrix], trainable=isTrainable) return embeddingLayer # usage wordToIndex, indexToWord, wordToGlove = readGloveFile("/path/to/glove.6B.50d.txt") pretrainedEmbeddingLayer = createPretrainedEmbeddingLayer(wordToGlove, wordToIndex, False) model = Sequential() model.add(pretrainedEmbeddingLayer) ... 

Hay una gran publicación en el blog que describe cómo crear una capa de incrustación con incrustaciones de vectores de palabras pre-entrenados:

https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

El código para el artículo anterior se puede encontrar aquí:

https://github.com/keras-team/keras/blob/master/examples/pretrained_word_embeddings.py

Otro buen blog para el mismo propósito: https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/