web-dev-qa-db-ja.com

トレーニングセットにない新しい単語にケラストークナイザーを使用する

現在Keras Tokenizerを使用してWordインデックスを作成し、そのWordインデックスをインポートしたG​​loVe辞書と照合して、埋め込み行列を作成しています。ただし、私が抱えている問題は、予測にトレーニング済みモデルを使用すると、トークナイザーのWordインデックスにない新しいWordが実行されると、シーケンスからそれが削除されるため、Wordベクトルの埋め込みを使用する利点の1つを無効にするように見えることです。 。

#fit the tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
Word_index = tokenizer.Word_index

#load glove embedding into a dict
embeddings_index = {}
dims = 100
glove_data = 'glove.6B.'+str(dims)+'d.txt'
f = open(glove_data)
for line in f:
    values = line.split()
    Word = values[0]
    value = np.asarray(values[1:], dtype='float32')
    embeddings_index[Word] = value
f.close()

#create embedding matrix
embedding_matrix = np.zeros((len(Word_index) + 1, dims))
for Word, i in Word_index.items():
    embedding_vector = embeddings_index.get(Word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector[:dims]

#Embedding layer:
embedding_layer = Embedding(embedding_matrix.shape[0],
                        embedding_matrix.shape[1],
                        weights=[embedding_matrix],
                        input_length=12)

#then to make a prediction
sequence = tokenizer.texts_to_sequences(["Test sentence"])
model.predict(sequence)

では、トークナイザを使用して文を配列に変換し、トレーニングテキストに表示される単語だけでなく、GloVe辞書をできるだけ多く使用できる方法はありますか?

編集:さらに熟考すると、1つのオプションは、トークン辞書にあるキーのリストを含む、トークナイザーが適合するテキストにテキストを追加することだと思います。ただし、tf-idfを使用する場合は、統計の一部が混乱する可能性があります。これを行うための好ましい方法または別のより良いアプローチはありますか?

14
Nick Caussade

Keras Tokenizerにはoov_tokenパラメータがあります。トークンを選択するだけで、不明な単語にそのトークンが含まれます。

tokenizer_a = Tokenizer(oov_token=1)
tokenizer_b = Tokenizer()
tokenizer_a.fit_on_texts(["Hello world"])
tokenizer_b.fit_on_texts(["Hello world"])

アウトプット

In [26]: tokenizer_a.texts_to_sequences(["Hello cruel world"])
Out[26]: [[2, 1, 3]]

In [27]: tokenizer_b.texts_to_sequences(["Hello cruel world"])
Out[27]: [[1, 2]]
4
tonicebrian

別のアプローチを試してみます。主な問題は、あなたのWord_indexはトレーニングデータに基づいています。これを試して:

#load glove embedding into a dict
embeddings_index = {}
dims = 100
glove_data = 'glove.6B.'+str(dims)+'d.txt'
f = open(glove_data)
for line in f:
    values = line.split()
    Word = values[0]
    value = np.asarray(values[1:], dtype='float32')
    embeddings_index[Word] = value
f.close()

Word_index = {w: i for i, w in enumerate(embeddings_index.keys(), 1)}

#create embedding matrix
embedding_matrix = np.zeros((len(Word_index) + 1, dims))
for Word, i in Word_index.items():
    embedding_vector = embeddings_index.get(Word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector[:dims]

今あなたのembedding_matrixには、GloVeのすべての作品が含まれています。

テキストをトークン化するには、次のようなものを使用できます。

from keras.preprocessing.text import text_to_Word_sequence

def texts_to_sequences(texts, Word_index):
    for text in texts:
        tokens = text_to_Word_sequence(text)
        yield [Word_index.get(w) for w in tokens if w in Word_index]

sequence = texts_to_sequences(['Test sentence'], Word_index)
4
spadarian