有一种优雅的方式可以满足您的需求。
您的解决方案的问题在于:
- 输入的大小很大:
(batch_size, MAX_SEQUENCE_LENGTH, dim),可能无法放入内存。
- 您将无法根据任务训练和更新词向量
您可以只使用:(batch_size, MAX_SEQUENCE_LENGTH)。 keras 嵌入层允许您传入一个单词索引并获取一个向量。所以,42 -> Embedding Layer -> [3, 5.2, ..., 33]。
方便的是,gensim 的 w2v 模型有一个函数 get_keras_embedding,它使用经过训练的权重为您创建所需的嵌入层。
gensim_model = # train it or load it
embedding_layer = gensim_model.wv.get_keras_embedding(train_embeddings=True)
embedding_layer.mask_zero = True # No need for a masking layer
model = Sequential()
model.add(embedding_layer) # your embedding layer
model.add(Bidirectional(
LSTM(num_lstm, dropout=0.5, recurrent_dropout=0.4, return_sequences=True))
)
但是,您必须确保数据中单词的索引与 word2vec 模型的索引相同。
word2index = {}
for index, word in enumerate(model.wv.index2word):
word2index[word] = index
使用上面的 word2index 字典将您的输入数据转换为与 gensim 模型具有相同的索引。
例如,您的数据可能是:
X_train = [["hello", "there"], ["General", "Kenobi"]]
new_X_train = []
for sent in X_train:
temp_sent = []
for word in sent:
temp_sent.append(word2index[word])
# Add the padding for each sentence. Here I am padding with 0
temp_sent += [0] * (MAX_SEQUENCE_LENGTH - len(temp_sent))
new_X_train.append(temp_sent)
X_train = numpy.as_array(new_X_train)
现在您可以使用X_train,它会像:[[23, 34, 0, 0], [21, 63, 0, 0]]
Embedding Layer 会自动将索引映射到该向量,并在需要时对其进行训练。
我认为这是最好的方法,但我会深入研究 gensim 希望如何完成并在需要时更新这篇文章。