В этом блоге я выполняю анализ настроений в наборе данных Twitter, чтобы классифицировать настроения твитов на «положительные», «нейтральные» и «отрицательные» с использованием Word2Vecвстраивания слов идвунаправленного LSTM сеть.
Набор данных
Используемый набор данных содержит 163 000 твитов вместе с метками настроений. Набор данных имеет два столбца, в первом столбце есть твиты, а во втором столбце указана их сентиментальная метка.
Метка тональности: 1, 0 или -1.
0 Указывает, что это нейтральный твит
1 Указывает на позитивный твит
-1 Указывает на негативный твит
Твиты были связаны с индийской политикой и всеобщими выборами.
Визуализация данных
Облако слов
Я сделал облако слов, чтобы визуализировать наиболее часто используемые слова в твитах.
wc = WordCloud( max_words=500, width = 1600 , height = 800, collocations=False, stopwords = STOP_WORDS).generate(" ".join(data)) plt.figure(figsize = (20,20)) plt.imshow(wc) plt.show()
Облако слов
Предварительная обработка данных
На этом этапе было выполнено удаление стоп-слова, а затем я удалил гиперссылки и упоминания, найденные в твитах.
def preprocess(tweet): # Eliminating links and mentions tweet = re.sub('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|'\ '(?:%[0-9a-fA-F][0-9a-fA-F]))+','', tweet) tweet = re.sub("(@[A-Za-z0-9_]+)","", tweet) words = tweet.split() # remove stopwords words = [w for w in words if w not in STOP_WORDS] return words X = list(map(preprocess, df['clean_text']))
Набор данных был разделен на тестовые, обучающие и проверочные наборы, а столбец меток был закодирован для дальнейшего использования.
Y = pd.get_dummies(df['category'])
Вложение слов
Нам нужно выполнить задачи по встраиванию слов, чтобы преобразовать наши текстовые данные в векторные представления, чтобы данные можно было подавать в качестве входных данных в классификатор глубокого обучения, который я собираюсь использовать.
Word2Vec
Я использовал модель Word2Vec для создания вложений слов.
# Creating Word2Vec training dataset Word2vec_train_data = list(map(lambda x: x, X_train)) Embedding_dimensions = 100 # Defining the model and training it word2vec_model = Word2Vec(Word2vec_train_data, vector_size=Embedding_dimensions, workers=8, min_count=5)
Токенизация и заполнение
Токенизация выполняется для разбиения твитов на более мелкие единицы, называемые токенами, а заполнение — для поддержания единого размера токенизированных данных.
input_length = 60 #length of each token vocab_length = 60000 #length of vocabulary set tokenizer = Tokenizer() tokenizer.fit_on_texts(X) tokenizer.num_words = vocab_length X_train = pad_sequences(tokenizer.texts_to_sequences(X_train), maxlen=input_length) X_test = pad_sequences(tokenizer.texts_to_sequences(X_test) , maxlen=input_length) X_val = pad_sequences(tokenizer.texts_to_sequences(X_val) , maxlen=input_length)
Встраивание матрицы
Это матричное представление всех слов и их вложений.
# Creating Embedding Matrix embedding_matrix = np.zeros((vocab_length, Embedding_dimensions)) for word, token in tokenizer.word_index.items(): if word2vec_model.wv.__contains__(word): embedding_matrix[token] = word2vec_model.wv.__getitem__(word)
Построение модели
Я использовал модель двунаправленной долговременной кратковременной памяти (LSTM) для анализа настроений.
def get_model(): model = Sequential() model.add(Embedding(vocab_length, Embedding_dimensions, input_length=input_length)) model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Bidirectional(LSTM(32))) model.add(Dropout(0.4)) model.add(Dense(3, activation='softmax')) return model model = get_model() # Model summary training_model = get_model() training_model.summary()
После компиляции и обучения модели я получил следующие графики точности и потерь.
Оценка модели
Модель оценивалась на тестовом наборе данных. Я использовал показатели точности, прецизионности и отзыва для оценки производительности модели.
# Evaluating the accuracy, precison and recall of the model loss, accuracy, precision, recall = model.evaluate(X_test, y_test, verbose=0) print(" ") print('Accuracy : {:.2f} %'.format(accuracy*100)) print('Precision : {:.2f} %'.format(precision*100)) print('Recall : {:.2f} %'.format(recall*100)) print(" ")
Результат был