web-dev-qa-db-ja.com

Kerasのimdbデータセットから元のテキストを復元する

Kerasのimdbデータセットから元のテキストを復元する

Kerasのimdbデータセットからimdbの元のテキストを復元したい。

まず、Kerasのimdbデータセットを読み込むと、Wordインデックスのシーケンスが返されました。

>>> (X_train, y_train), (X_test, y_test) = imdb.load_data()
>>> X_train[0]
[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 22665, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 21631, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 19193, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 10311, 8, 4, 107, 117, 5952, 15, 256, 4, 31050, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 12118, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

Imdb.get_Word_index method()を見つけました。{'create':984、 'make':94、…}のようなWordインデックス辞書を返します。変換のために、インデックスのWord辞書を作成します。

>>> Word_index = imdb.get_Word_index()
>>> index_Word = {v:k for k,v in Word_index.items()}

次に、次のように元のテキストを復元しようとしました。

>>> ' '.join(index_Word.get(w) for w in X_train[5])
"the effort still been that usually makes for of finished sucking ended cbc's an because before if just though something know novel female i i slowly lot of above freshened with connect in of script their that out end his deceptively i i"

私は英語が得意ではありませんが、この文は奇妙なものであることを知っています。

なぜこれが起こったのですか?元のテキストを復元するにはどうすればよいですか?

29
Hironsan

あなたの例は意味不明なものとして出てきており、ストップワードが欠けているよりもずっと悪いです。

[start_char]( https:// kerasのoov_charindex_from、およびkeras.datasets.imdb.load_dataパラメーターのドキュメントを再読した場合.io/datasets /#imdb-movie-reviews-sentiment-classification )メソッドは、何が起こっているのかを説明します:

start_char:int。シーケンスの開始は、この文字でマークされます。 0は通常パディング文字であるため、1に設定します。

oov_char:int。 num_wordsまたはskip_topの制限のために切り取られた単語は、この文字に置き換えられます。

index_from:int。このインデックス以上で実際の単語にインデックスを付けます。

反転した辞書は、Wordのインデックスが1から始まると想定しています。

しかし、返されたインデックスには、<START><UNKNOWN>というインデックスとして12があります。 (また、0<PADDING>を使用することを前提としています)。

これは私のために働く:

import keras
NUM_WORDS=1000 # only use top 1000 words
INDEX_FROM=3   # Word index offset

train,test = keras.datasets.imdb.load_data(num_words=NUM_WORDS, index_from=INDEX_FROM)
train_x,train_y = train
test_x,test_y = test

Word_to_id = keras.datasets.imdb.get_Word_index()
Word_to_id = {k:(v+INDEX_FROM) for k,v in Word_to_id.items()}
Word_to_id["<PAD>"] = 0
Word_to_id["<START>"] = 1
Word_to_id["<UNK>"] = 2

id_to_Word = {value:key for key,value in Word_to_id.items()}
print(' '.join(id_to_Word[id] for id in train_x[0] ))

句読点はありませんが、それだけです:

"<START> this film was just brilliant casting <UNK> <UNK> story
 direction <UNK> really <UNK> the part they played and you could just
 imagine being there robert <UNK> is an amazing actor ..."
33
mdaoust

Keras.utils.data_utilsのget_fileを使用して、ストップワードを削除せずに元のデータセットを取得できます。

path = get_file('imdb_full.pkl',
               Origin='https://s3.amazonaws.com/text-datasets/imdb_full.pkl',
                md5_hash='d091312047c43cf9e4e38fef92437263')
f = open(path, 'rb')
(training_data, training_labels), (test_data, test_labels) = pickle.load(f)

クレジット-Jeremy Howards fast.aiコースレッスン5

6
kmak

これは、基本的なNLPデータ準備のために発生しました。いわゆるstop wordsの負荷は、学習を実行可能にするためにテキストから削除されました。通常-また、前処理中にテキストのほとんどのパントや頻度の低い単語が削除されます。元のテキストを復元する唯一の方法は、IMDBで最も一致するテキストを見つけることです。 GoogleのブラウザAPI。

1
Marcin Możejko