Модель настроений Keras IMDB - как предсказать настроение новых предложений? - PullRequest
0 голосов
/ 09 мая 2018

Я пробираюсь через книгу Deep Learning with Python , где есть пример изучения встраивания слов для настроения:

from keras.datasets import imdb
from keras import preprocessing

max_features = 10000
maxlen = 20

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)

x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)

from keras.models import Sequential
from keras.layers import Flatten, Dense

model = Sequential()
model.add(Embedding(10000, 8, input_length=maxlen))
model.add(Flatten())

model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

history = model.fit(x_train, y_train,
                    epochs=10,
                    batch_size=32,
                    validation_split=0.2)

Я хотел бы передать предложение и сделать прогноз в отношении настроения. Моей первой мыслью было передать массив индексов (потому что именно так представлены работы в модели, если я правильно понял), таких как:

import numpy as np

# does this reflect a really bad review?
model.predict(np.array([[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,]]))
[out] array([[ 0.0066505]], dtype=float32)

# does this reflect a really good review?
model.predict(np.array([[9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999,9999 ]]))
[out] array([[ 0.64767915]], dtype=float32)

Как я могу передать список слов вместо индексов? То есть как я могу получить список индексов слов для моего нового предложения?

Обновление - Я попытался токенизировать некоторые слова:

def index(word):
    if word in word_index:
        return word_index[word]
    else:
        return "0"

def sequences(words):
    words = text_to_word_sequence(words)
    seqs = [[index(word) for word in words if word != "0"]]
    return preprocessing.sequence.pad_sequences(seqs, maxlen=maxlen)

bad_seq = sequences("Rubbish terrible awful dreadful hate stinks")
good_seq = sequences("Awesome recommended brilliant best")

print("bad movie: " + str(model.predict(bad_seq)))   # 0.00759153
print("good movie: " + str(model.predict(good_seq))) # 0.00423771

Чувство очень похоже, что говорит о том, что подход токенизации не работает.

...