Python 在keras中使用预训练gensim-Word2vec嵌入
我在gensim培训了word2vec。在Keras中,我想用它来制作句子矩阵,使用单词嵌入。因为存储所有句子的矩阵空间很大,而且内存效率低下。所以,我想在Keras中制作嵌入层来实现这一点,这样它就可以用于进一步的层(LSTM)。你能详细告诉我怎么做吗Python 在keras中使用预训练gensim-Word2vec嵌入,python,keras,gensim,word2vec,word-embedding,Python,Keras,Gensim,Word2vec,Word Embedding,我在gensim培训了word2vec。在Keras中,我想用它来制作句子矩阵,使用单词嵌入。因为存储所有句子的矩阵空间很大,而且内存效率低下。所以,我想在Keras中制作嵌入层来实现这一点,这样它就可以用于进一步的层(LSTM)。你能详细告诉我怎么做吗 PS:这与其他问题不同,因为我使用gensim进行word2vec培训,而不是keras。假设您有以下数据需要编码 docs = ['Well done!', 'Good work', 'Great effort
PS:这与其他问题不同,因为我使用gensim进行word2vec培训,而不是keras。假设您有以下数据需要编码
docs = ['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
然后,您必须像这样使用Keras的标记器对其进行标记化,并找到vocab\u大小
t = Tokenizer()
t.fit_on_texts(docs)
vocab_size = len(t.word_index) + 1
然后你可以把它编码成这样的序列
encoded_docs = t.texts_to_sequences(docs)
print(encoded_docs)
e = Embedding(vocab_size, 100, weights=[embedding_vectors], input_length=4, trainable=False)
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)
然后可以填充序列,使所有序列具有固定长度
max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
然后利用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)
一旦你有了嵌入矩阵,你就可以像这样在嵌入层中使用它
encoded_docs = t.texts_to_sequences(docs)
print(encoded_docs)
e = Embedding(vocab_size, 100, weights=[embedding_vectors], input_length=4, trainable=False)
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)
该层可用于制作这样的模型
encoded_docs = t.texts_to_sequences(docs)
print(encoded_docs)
e = Embedding(vocab_size, 100, weights=[embedding_vectors], input_length=4, trainable=False)
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)
所有的代码都是根据很棒的博客文章改编的。按照它了解更多有关使用手套嵌入的信息
有关word2vec的使用,请参见post我的gensim培训w2v型号代码。假设w2v模型中训练的所有单词现在都是名为all_words的列表变量
from keras.preprocessing.text import Tokenizer
import gensim
import pandas as pd
import numpy as np
from itertools import chain
w2v = gensim.models.Word2Vec.load("models/w2v.model")
vocab = w2v.wv.vocab
t = Tokenizer()
vocab_size = len(all_words) + 1
t.fit_on_texts(all_words)
def get_weight_matrix():
# define weight matrix dimensions with all 0
weight_matrix = np.zeros((vocab_size, w2v.vector_size))
# step vocab, store vectors using the Tokenizer's integer mapping
for i in range(len(all_words)):
weight_matrix[i + 1] = w2v[all_words[i]]
return weight_matrix
embedding_vectors = get_weight_matrix()
emb_layer = Embedding(vocab_size, output_dim=w2v.vector_size, weights=[embedding_vectors], input_length=FIXED_LENGTH, trainable=False)
使用新的Gensim版本,这非常简单:
w2v_model.wv.get_keras_embedding(train_embeddings=False)
你有你的Keras嵌入层如果我的Word2vec嵌入是使用gensim训练的,它会工作吗?我问是因为gensim的Word2vec训练模型不是txt文件,你已经为文本文件编写了。否,它是模型文件。但是有办法把它保存在.bin中。我会的。这样行吗?行。如果存在bin文件,您可以将其保存到TXT。如果您检查此()和此()以及组合数据的具体内容,我会觉得keras.layers.Embedding
和weights
的格式不受欢迎。@AleksandarMakragićEdited.what所有单词
,难道不是所有的单词==vocab吗?简单且简单,如果您尝试使用tf.keras和“pure”keras,那么以后可能会出现问题。如果调用此函数,我是否仍应使用标记器?我有点困惑,这个嵌入层是否真的适合标记器创建的表示。如果没有,那么我如何标记文本样本?好的,我设法找到了答案:您可以从gensim模型提取单词索引并向标记器提供信息:```词汇={word:vector.index for word,vector in embedded.vocab.items()}tk=标记器(num\u words=len(词汇))tk.word\u索引=词汇tk.text\u to\u序列(样本)“``这里介绍如何将GENSIM模型合并到Keras中