Word2vecをgensimでトレーニングしました。 Kerasでは、Wordの埋め込みを使用して文章のマトリックスを作成するために使用したいと思います。すべての文の行列を保存することは非常にスペースとメモリ効率が悪いので。それで、これを達成するためにKerasに埋め込みレイヤーを作成して、それを他のレイヤー(LSTM)で使用できるようにしたいと考えています。これを行う方法を詳しく教えてもらえますか?
PS:ケラの代わりにgensimをWord2vecトレーニングに使用しているため、他の質問とは異なります。
エンコードする必要がある次のデータがあるとしましょう
docs = ['Well done!',
'Good work',
'Great effort',
'Nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
次に、このようにKerasのTokenizer
を使用してトークン化し、vocab_size
を見つける必要があります
t = Tokenizer()
t.fit_on_texts(docs)
vocab_size = len(t.Word_index) + 1
次に、これをこのようなシーケンスに含めることができます
encoded_docs = t.texts_to_sequences(docs)
print(encoded_docs)
その後、すべてのシーケンスが固定長になるようにシーケンスをパディングできます
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)
埋め込み行列を取得したら、次のようにEmbedding
レイヤーで使用できます
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)
すべてのコードは this の素晴らしいブログ投稿から改変されています。グローブを使用した埋め込みの詳細については、それに従ってください
Word2vecの使用については this を参照してください。
新しいGensimバージョンでは、これは非常に簡単です。
w2v_model.wv.get_keras_embedding(train_embeddings=False)
そこにあなたのケラス埋め込み層があります
Gensim-trained 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)