在keras中使用预训练的gensim Word2vec嵌入

shi*_*k01 6 python gensim word2vec keras word-embedding

我在gensim训练过word2vec.在Keras,我想用它来制作句子矩阵使用那个词嵌入.由于存储所有句子的矩阵,因此空间和内存效率很低.因此,我想在Keras中实现嵌入层以实现这一点,以便可以在其他层(LSTM)中使用它.你能详细告诉我怎么做吗?

PS:它与其他问题不同,因为我使用gensim进行word2vec训练而不是keras.

Sre*_* TP 10

假设您有以下数据需要编码

docs = ['Well done!',
        'Good work',
        'Great effort',
        'nice work',
        'Excellent!',
        'Weak',
        'Poor effort!',
        'not good',
        'poor work',
        'Could have done better.']
Run Code Online (Sandbox Code Playgroud)

然后,您必须Tokenizer像这样使用Keras中的来标记它,并找到vocab_size

t = Tokenizer()
t.fit_on_texts(docs)
vocab_size = len(t.word_index) + 1
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其包裹到这样的序列中

encoded_docs = t.texts_to_sequences(docs)
print(encoded_docs)
Run Code Online (Sandbox Code Playgroud)

然后,您可以填充序列,以使所有序列具有固定的长度

max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
Run Code Online (Sandbox Code Playgroud)

然后使用word2vec模型制作嵌入矩阵

# load embedding as a dict
def load_embedding(filename):
    # load embedding into memory, skip first line
    file = open(filename,'r')
    lines = file.readlines()[1:]
    file.close()
    # create a map of words to vectors
    embedding = dict()
    for line in lines:
        parts = line.split()
        # key is string word, value is numpy array for vector
        embedding[parts[0]] = asarray(parts[1:], dtype='float32')
    return embedding

# create a weight matrix for the Embedding layer from a loaded embedding
def get_weight_matrix(embedding, vocab):
    # total vocabulary size plus 0 for unknown words
    vocab_size = len(vocab) + 1
    # define weight matrix dimensions with all 0
    weight_matrix = zeros((vocab_size, 100))
    # step vocab, store vectors using the Tokenizer's integer mapping
    for word, i in vocab.items():
        weight_matrix[i] = embedding.get(word)
    return weight_matrix

# load embedding from file
raw_embedding = load_embedding('embedding_word2vec.txt')
# get vectors in the right order
embedding_vectors = get_weight_matrix(raw_embedding, t.word_index)
Run Code Online (Sandbox Code Playgroud)

一旦有了嵌入矩阵,就可以Embedding像这样在图层中使用它

e = Embedding(vocab_size, 100, weights=[embedding_vectors], input_length=4, trainable=False)
Run Code Online (Sandbox Code Playgroud)

该层可用于制作这样的模型

model = Sequential()
e = Embedding(vocab_size, 100, weights=[embedding_matrix], input_length=4, trainable=False)
model.add(e)
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
# summarize the model
print(model.summary())
# fit the model
model.fit(padded_docs, labels, epochs=50, verbose=0)
Run Code Online (Sandbox Code Playgroud)

所有代码均改编自这篇很棒的博客文章。关注它,以了解有关使用手套的嵌入的更多信息

有关使用word2vec的信息,请参见这篇文章


Seb*_*ogt 7

使用新的Gensim版本,这非常容易:

w2v_model.wv.get_keras_embedding(train_embeddings=False)
Run Code Online (Sandbox Code Playgroud)

那里有Keras嵌入层

  • 好的,我设法找到了答案:您可以从 gensim 模型中提取单词索引并提供给分词器:````vocabulary = {word: vector.index for word, vector in embedding.vocab.items()} tk = Tokenizer(num_words=len(vocabulary)) tk.word_index = 词汇表 tk.texts_to_sequences(samples) ``` (3认同)
  • 简洁大方 (2认同)
  • 如果您尝试使用 tf.keras 和“纯”keras,似乎稍后会出现问题 (2认同)