Как передать строковое значение в Последовательную модель RNN анализа чувств и получить прогноз - PullRequest
0 голосов
/ 23 октября 2018

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

Я разместил свой код ниже для вашего отзыва.

class tensor_rnn():
def __init__(self, corp_paths, hidden_layers=3, loadfile=True):
    self.h_layers = hidden_layers
    self.num_words = []
    if loadfile == False:
        data_set = pd.DataFrame(columns=['Article', 'Polarity'])
        craptopass = []
        for files in os.listdir(corp_paths[0]):
            with open(corp_paths[0] + '\\' + files, 'r', errors='replace') as text_file:
                line = text_file.readline().replace('|', '')
                text_file.close()
            if len(line.split(' ')) > 3:
                line = ''.join([i if ord(i) < 128 else ' ' for i in line])
                craptopass.append([line, 1])
        good = data_set.append(pd.DataFrame(craptopass, columns=['Article', 'Polarity']), ignore_index=True)
        data_set = pd.DataFrame(columns=['Article', 'Polarity'])
        craptopass = []
        for files in os.listdir(corp_paths[1]):
            with open(corp_paths[1] + '\\' + files, 'r', errors='replace') as text_file:
                line = text_file.readline().replace('|', '')
                text_file.close()
            if len(line.split(' ')) > 3:
                line = ''.join([i if ord(i) < 128 else ' ' for i in line])
                craptopass.append([line, -1])
        bad = data_set .append(pd.DataFrame(craptopass, columns=['Article', 'Polarity']), ignore_index=True)
        for line in good['Article'].tolist():
            counter = len(line.split())
            self.num_words.append(counter)

        for line in bad['Article'].tolist():
            counter = len(line.split())
            self.num_words.append(counter)
        self.features = pd.concat([good, bad]).reset_index(drop=True)
        # self.features = self.features.str.replace(',', '')
        self.features.to_csv('Headlines.csv', sep='|')
    else:
        self.features = pd.read_csv('Headlines.csv', sep='|')
        self.features['totalwords'] = self.features['Article'].str.count(' ') + 1
        self.num_words.extend(self.features['totalwords'].tolist())

    self.features = shuffle(self.features)
    self.max_len = len(max(self.features['Article'].tolist()))
    tokenizer = self.tok = preprocessing.text.Tokenizer(num_words=len(self.num_words), split=' ')
    self.tok.fit_on_texts(self.features['Article'].values)
    X = tokenizer.texts_to_sequences(self.features['Article'].values)
    self.X = preprocessing.sequence.pad_sequences(X)
    self.Y = pd.get_dummies(self.features['Polarity']).values
    self.X_train, self.X_test, self.Y_train, self.Y_test = train_test_split(self.X, self.Y,
                                                                            test_size=0.20, random_state=36)

def RNN(self):
    embed_dim = 128
    lstm_out = 128
    model = Sequential()
    model.add(Embedding(len(self.num_words), embed_dim, input_length=self.X.shape[1]))
    model.add(Bidirectional(CuDNNLSTM(lstm_out)))
    model.add(Dropout(0.2))
    model.add(Dense(2, activation='softmax'))
    opt = Adam(lr=0.0001, decay=1e-4)   #1e-3
    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

def model_train(self):
    self.model = self.RNN()

def model_test(self):
    batch_size = 128
    self.model.fit(self.X_train, self.Y_train, epochs=4, batch_size=batch_size, verbose=2,
                                callbacks=[EarlyStopping(monitor='val_loss', min_delta=0.0001,
                                                         patience=5, verbose=2, mode='auto')], validation_split=0.2)


if __name__ == "__main__":
    paths = 'PATHS TO ARTICLES'
    a = tensor_rnn([paths + '\\pos', paths + '\\neg'])
    a.model_train()
    a.model_test()
    a.model.save('RNNModelArticles.h5', include_optimizer=True)

1 Ответ

0 голосов
/ 23 октября 2018

Все, что вам нужно сделать, - это предварительно обработать новый текст, который вы хотите передать в модель, так же, как вы предварительно обработали текст для обучения.После этого у вас должен быть метод прогнозирования, который будет выводить свой прогноз точно так же, как модель выводит прогноз в обучении.Итак, в методе прогнозирования вы должны написать что-то вроде:

def predict(self, sequence):
  presprocessed = preprocess(sequence)
  prediction = self.model.predict(preprocessed, batch_size=None, verbose=0, steps=None)

Это проясняет для вас вещи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...