Прогнозируйте настроение отзывов с помощью Python.

Классификация текста относится к обучению модели машинного обучения для прогнозирования категории некоторого открытого текста (документа). Например:

  • Прогнозирование того, будет ли настроение (эмоции) отзыва положительным/отрицательным.
  • Прогнозирование того, является ли электронное письмо спамом или обычным
  • Прогнозирование того, является ли файл pdf годовым отчетом/брошюрой и т. д.

В этой статье мы будем использовать набор данных анализа настроений, чтобы предсказать, будет ли настроение положительным (1) или отрицательным (0).

Наш набор данных (анализ настроений)

Мы будем использовать следующий набор данных:

https://www.kaggle.com/datasets/zlliu246/simple-sentiment-analysis-reviews

Здесь у нас 5000 строк, и в каждой строке есть 2 столбца:

  • настроение — 1, если отзыв положительный, 0, если отзыв отрицательный
  • обзор — сам обзор

Введение — CountVectorizer

Давайте посмотрим на этот обзор:

"I'm quite happy with my purchase"

Наши модели машинного обучения не могут понять этот обзор самостоятельно. Мы должны преобразовать его в набор чисел, чтобы наши модели машинного обучения могли его понять. Этот набор чисел известен как вектор. Мы можем превратить документ (обзор) в вектор, используя CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer
documents = [
    "apple orange pear",
    "apple apple",
    "orange pear"
]
vectorizer = CountVectorizer()
x = vectorizer.fit_transform(documents)
print(vectorizer.vocabulary_)
print(x.toarray())

Печатный вывод:

{'apple': 0, 'orange': 1, 'pear': 2}
array([[1, 1, 1],   # vector of "apple orange pear"
       [2, 0, 0],   # vector of "apple apple"
       [0, 1, 1]])  # vector of "orange pear"

Что происходит:

apple  orange  pear   # unique words in ALL documents
1      1       1      # apple, orange, pear appears once each
2      0       0      # apple appears twice
0      1       1      # orange and pear appears once each

Подготовка наших переменных X и Y

from sklearn.model_selection import train_test_split
x = data["review"]
y = data["sentiment"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
print(x_train.shape) # (3750,) -> reviews for training
print(y_train.shape) # (3750,) -> labels for training 
print(x_test.shape)  # (1250,) -> reviews for testing
print(y_test.shape)  # (1250,) -> labels for testing

Векторизация наших обзоров

vec = CountVectorizer()
x_train_vec = vec.fit_transform(x_train)
x_test_vec = vec.transform(x_test)
print(x_train_vec.shape) # (3750, 20555)
print(x_test_vec.shape)  # (1250, 20555)

Здесь каждый обзор как в x_train, так и в x_test преобразуется в вектор длиной 20 555. Обратите внимание, что мы используем fit_transform для данных поезда, а transform — для тестовых данных, поскольку fit_transform повторно изучит словарь векторизатора.

После этого шага мы превратили все наши обзоры в векторы, которые могут понять наши модели машинного обучения. Таким образом, мы можем перейти к обучению нашей модели.

Примечание. Каждый вектор имеет длину 20 555, так как данные поезда содержат 20 555 уникальных слов. Это число может измениться, если мы запустим его снова, так как train_test_split каждый раз разбивает данные случайным образом.

Обучение и оценка нашей модели логистической регрессии

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x_train_vec, y_train)
print(model.score(x_test_vec, y_test))
# 0.8328

Давайте просто воспользуемся простой моделью LogisticRegression. После обучения нашей модели (шаг .fit) мы получаем показатель точности 0,8328 после тестирования ее на тестовых данных. Это означает, что наша модель имеет 83%-й шанс угадать правильно, когда мы проверяем ее на обзорах, которых она раньше не видела.

Тестирование нашей обученной модели

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

my_reviews = [
    "I am quite happy with my purchase",
    "The quality kinda sucks",
    "meh"
]

Поскольку наша модель не может понимать необработанные отзывы в текстовом виде, нам нужно сначала преобразовать их в векторы, используя тот же CountVectorizer, что и раньше.

my_reviews_vec = vec.transform(my_reviews)

На данный момент my_reviews_vec представляет собой список из 3 векторов, один вектор соответствует одному отзыву. Затем мы можем использовать метод predict нашей модели, чтобы сделать прогноз.

print(model.predict(my_reviews_vec))
# array([1, 0, 0])

Прогнозируется, что первый отзыв будет положительным, а второй и третий — отрицательными.

Весь код в одном месте

Несколько заключительных слов

И вот она у нас — базовая классификация текста за 4 минуты. Надеюсь, это было полезно и информативно!

Заключение

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

Зарегистрируйтесь, используя мою ссылку здесь, чтобы читать неограниченное количество статей на Medium.

Я пишу статьи по программированию (раз в 1–2 дня), которые, вероятно, помогли бы мне в более молодом возрасте ускорить процесс обучения. Присоединяйтесь к моему списку адресов электронной почты, чтобы получать уведомления о каждой публикации.



Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.