मैंने इसके पूरा होने के समय में सुधार के लिए कुछ मामूली संशोधनों के साथ अपने स्वयं के डेटा सेट का उपयोग करके एक भावना विश्लेषण मशीन सीखने की परियोजना को फिर से बनाया, मैं अच्छा मॉडल बना सकता हूं, इसे संकलित कर सकता हूं, इसे फिट कर सकता हूं और बिना किसी समस्या के परीक्षण कर सकता हूं, समस्या यह है कि कैसे पास किया जाए एक नया स्ट्रिंग/लेख मॉडल करें और बदले में यह भविष्यवाणी करता है कि स्ट्रिंग टिप्पणियां सकारात्मक या नकारात्मक हैं और उम्मीद कर रही थीं कि कोई मेरी मदद कर सकता है।

मैंने आपकी समीक्षा के लिए अपना कोड नीचे पोस्ट किया है।

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)
0
Claudio Mazzoni 23 अक्टूबर 2018, 08:58

1 उत्तर

सबसे बढ़िया उत्तर

आपको बस उस नए टेक्स्ट को प्रीप्रोसेस करना है जिसे आप मॉडल को फीड करना चाहते हैं उसी तरह जैसे आपने प्रशिक्षण के लिए टेक्स्ट को प्रीप्रोसेस किया था। उसके बाद, आपके पास एक भविष्यवाणी विधि होनी चाहिए जो इसकी भविष्यवाणी को उसी तरह से आउटपुट करेगी जैसे मॉडल प्रशिक्षण में भविष्यवाणी को आउटपुट करता है। तो, भविष्यवाणी विधि में आपको कुछ इस तरह लिखना चाहिए:

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

क्या यह आपके लिए चीजों को स्पष्ट करता है?

1
Novak 23 अक्टूबर 2018, 06:11