Восстановить исходный текст из набора данных Kerass imdb

Восстановить исходный текст из набора данных Kerass imdb

Я хочу восстановить исходный текст imdbs из набора данных Kerass imdb.

Во-первых, когда я загружаю набор данных Kerass imdb, он возвращал последовательность индекса слова.

>>> (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(), он возвращает словарь индекса слов, например {'create: 984,' make: 94,...}. Для преобразования я создаю словарь словаря индекса.

>>> 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 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"

Я не очень хорошо знаком с английским, но я знаю, что это предложение является чем-то странным.

Почему это произошло? Как восстановить исходный текст?

Ответ 1

Ваш пример выглядит как бред, он намного хуже, чем просто пропущенные стоп-слова.

Если вы перечитываете документы для параметров start_char, oov_char и index_from в [keras.datasets.imdb.load_data] (https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification ) метод, который они объясняют, что происходит:

start_char: инт. Начало последовательности будет помечено этим символом. Установите в 1, потому что 0 обычно является символом заполнения.

oov_char: инт. слова, которые были вырезаны из-за ограничения num_words или skip_top, будут заменены этим символом.

index_from: инт. Индексируйте фактические слова этим индексом и выше.

В том словаре, который вы перевернули, индексы слов начинаются с 1.

Но индексы вернули мои керасы <START> и <UNKNOWN> в качестве индексов 1 и 2. (И предполагается, что вы будете использовать 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
word_to_id["<UNUSED>"] = 3

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 ..."

Ответ 2

Вы можете получить исходный набор данных без удаления стоп-слов, используя get_file из keras.utils.data_utils:

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)

Credit - Джереми Ховардс Урок fast.ai, урок 5

Ответ 3

Это произошло из-за базовой подготовки данных NLP. Нагрузки так называемых стоп-слов были удалены из текста, чтобы сделать изучение возможным. Обычно - также большая часть puntuation и менее частые слова удаляются из текста во время предварительной обработки. Я думаю, что единственный способ восстановить исходный текст - найти наиболее подходящие тексты в IMDB, используя, например, API браузера Google.

Ответ 4

Индексы смещены на 3, потому что 0, 1 и 2 являются зарезервированными индексами для "заполнения", "начала последовательности" и "неизвестно". Следующее должно работать.

imdb = tf.keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

word_index = imdb.get_word_index()
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

review = [reverse_word_index.get(i-3, "?") for i in train_data[0]]