tutorial example espaƱol python machine-learning neural-network nlp keras

python - example - keras tutorial pdf



Restaura el texto original del conjunto de datos imdb de Keras (3)

Esto sucedió debido a una preparación de datos básica de NLP . Las cargas de las llamadas palabras de parada fueron eliminadas del texto para hacer que el aprendizaje sea 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 similares en IMDB utilizando, por ejemplo, la API del navegador de Google.

Restaura el texto original del conjunto de datos imdb de Keras

Quiero restaurar el texto original de imdb del conjunto de datos imdb de Keras.

Primero, cuando cargué el conjunto de datos imdb de Keras, devolví la secuencia del í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 el diccionario de índice de palabras como {''create'': 984, ''make'': 94, ...}. Para la conversión, creo un diccionario de palabras de índice.

>>> word_index = imdb.get_word_index() >>> index_word = {v:k for k,v in word_index.items()}

Entonces, traté de restaurar el texto original como siguiente.

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

No soy bueno en inglés, pero sé que esta frase es algo extraño.

¿Por qué sucede esto? ¿Cómo puedo restaurar el texto original?


Puede obtener el conjunto de datos original sin eliminar palabras eliminadas usando 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édito - Jeremy Howards fast.ai lección del curso 5


Su ejemplo está saliendo como un galimatías, es mucho peor que solo algunas palabras vacías que faltan.

Si vuelve a leer los documentos para los start_char , oov_char e index_from de los [ keras.datasets.imdb.load_data ] ( https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification ) método explican lo que está pasando

start_char : int. El inicio de una secuencia se marcará con este carácter. Se establece en 1 porque 0 suele ser el carácter de relleno.

oov_char : int. las palabras que fueron recortadas debido al límite num_words o skip_top serán reemplazadas con este carácter.

index_from : int. Índice de palabras reales con este índice y superior.

Ese diccionario que invirtió asume que los índices de la palabra comienzan desde 1 .

Pero los índices devueltos mis keras tienen <START> y <UNKNOWN> como índices 1 y 2 . (Y se supone que utilizará 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 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 ..."