Restaure el texto original del conjunto de datos imdb de Keras
Quiero restaurar el texto original de imdb del conjunto de datos de imdb de Keras.
Primero, cuando cargo el conjunto de datos imdb de Keras, devuelve una secuencia de índice de palabras.
>>> (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]Encontré el método imdb.get_word_index(), devuelve un diccionario de índice de palabras como {'create': 984, 'make': 94,…}. Para convertir, creo un diccionario de palabras índice.
>>> word_index = imdb.get_word_index() >>> index_word = {v:k for k,v in word_index.items()}Luego, traté de restaurar el texto original como sigue.
>>> ' '.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 ii slowly lot of above freshened with connect in of script their that out end his deceptively ii"No soy bueno en inglés, pero sé que esta oración es algo extraña.
¿Por qué sucede esto? ¿Cómo puedo restaurar el texto original?
Su ejemplo está saliendo como un galimatías, es mucho peor que solo faltan algunas palabras de parada.
Si vuelve a leer los documentos para los start_char , oov_char e index_from del método [ keras.datasets.imdb.load_data ]( https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification ) explican lo que está pasando:
start_char : int. El inicio de una secuencia se marcará con este carácter. Establézcalo en 1 porque 0 suele ser el carácter de relleno.
oov_char : int. las palabras que se eliminaron debido al límite de num_words o skip_top se reemplazarán con este carácter.
index_from : int. Indexe palabras reales con este índice y superior.
Ese diccionario que invirtió asume que los índices de palabras comienzan desde 1 .
Pero los índices que devolvieron mis keras tienen <START> y <UNKNOWN> como índices 1 y 2 . (Y asume que usará 0 para <PADDING> ).
Esto funciona para mí:
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] ))Falta la puntuación, pero eso es todo:
"<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 ..."Puede obtener el conjunto de datos original sin eliminar palabras vacías utilizando 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)Esto sucedió debido a una preparación básica de datos de NLP . Muchas de las llamadas palabras vacías se eliminaron del texto para que el aprendizaje fuera factible. Por lo general, también la mayor parte de la puntuación y las palabras menos frecuentes se eliminan del texto durante el preprocesamiento. Creo que la única forma de restaurar el texto original es encontrar los textos más coincidentes en IMDB usando, por ejemplo, la API del navegador de Google.