web-dev-qa-db-fra.com

Restaurer le texte original de l'ensemble de données imdb de Keras

Restaurer le texte original de l'ensemble de données imdb de Keras

Je souhaite restaurer le texte d'origine d'imdb à partir du jeu de données imdb de Keras.

Tout d'abord, lorsque je charge l'ensemble de données imdb de Keras, il renvoie une séquence d'index 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]

J'ai trouvé la méthode imdb.get_Word_index (), elle renvoie le dictionnaire d'index Word comme {‘create’: 984, ‘make’: 94,…}. Pour la conversion, je crée un dictionnaire Word index.

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

Ensuite, j'ai essayé de restaurer le texte d'origine comme suit.

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

Je ne suis pas bon en anglais, mais je sais que cette phrase est quelque chose d’étrange.

Pourquoi est-ce arrivé? Comment restaurer le texte original?

29
Hironsan

Votre exemple apparaît comme du charabia, c'est bien pire que quelques mots vides manquants.

Si vous relisez les documents pour le start_char, oov_char, et index_from paramètres de [keras.datasets.imdb.load_data] ( https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification ) méthode, ils expliquent ce qui se passe:

start_char: int. Le début d'une séquence sera marqué avec ce caractère. Défini sur 1 car 0 est généralement le caractère de remplissage.

oov_char: int. les mots qui ont été supprimés en raison de la limite num_words ou skip_top seront remplacés par ce caractère.

index_from: int. Indexez les mots réels avec cet index et plus.

Ce dictionnaire que vous avez inversé suppose que les indices Word commencent par 1.

Mais les indices retournés mes keras ont <START> et <UNKNOWN> comme index 1 et 2. (Et cela suppose que vous utiliserez 0 pour <PADDING>).

Cela fonctionne pour moi:

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] ))

La ponctuation manque, mais c'est tout:

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

Vous pouvez obtenir le jeu de données d'origine sans supprimer les mots vides à l'aide de get_file de 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)

Crédit - Jeremy Howards leçon 5 du cours fast.ai

6
kmak

Cela s'est produit en raison d'une préparation de base des données NLP. Des charges de ce qu'on appelle mots vides ont été supprimées du texte afin de rendre l'apprentissage possible. Habituellement, le plus de ponctuation et les mots moins fréquents sont également supprimés du texte pendant le prétraitement. Je pense que la seule façon de restaurer le texte original est de trouver les textes les plus correspondants sur IMDB en utilisant par exemple une API de navigateur Google.

1
Marcin Możejko