В этом блоге я выполняю анализ настроений в наборе данных 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(" ")

Результат был

Матрица путаницы