МАШИНОСТРОЕНИЕ | ОБРАБОТКА ЕСТЕСТВЕННОГО ЯЗЫКА

Простой классификатор рецензий на фильмы в 3 шага!

Создайте классификатор обзоров фильмов с положительными / отрицательными характеристиками всего в нескольких строках кода.

Хотя есть много подходов, которые вы можете использовать для создания классификатора, который классифицирует, является ли обзор фильма положительным или отрицательным, мы можем создать простой с помощью Bag of Words и Naive Bayes всего за 3 простых шага! Перейдем непосредственно к кодированию. Мы собираемся использовать набор данных обзора фильмов IMDB.

1. Импорт и предварительная обработка!

Мы будем использовать наивный байесовский классификатор sklearn и CountVectorizer из Bag of Words для создания словаря функций и векторов.

import re
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer

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

for line in open('full_train.txt', encoding="utf8"):
    reviews_train.append(line.strip().lower())
for i in range(len(reviews_train)):
    reviews_train[i] = re.sub(r'<br.?.?>','',reviews_train[i])
reviews_test = []
for line in open('full_test.txt', encoding="utf8"):
    reviews_test.append(line.strip().lower())
for i in range(len(reviews_test)):
    reviews_test[i] = re.sub(r'<br.?.?>','',reviews_test[i])

2. Векторизация и маркировка

В нашем наборе данных первые 12500 являются положительными, а остальные 12500 - отрицательными как для данных поездов, так и для тестовых данных. Мы преобразуем наши данные (данные обучения и данные тестирования) в векторы с помощью CountVectorizer. Вы можете узнать больше о CountVectorizer здесь . Он создает словарь функций, и с его помощью мы можем преобразовывать наши обзоры в векторы.

training_labels = [1 if i < 12500 else 0 for i in range(25000)]
test_labels = [1 if i < 12500 else 0 for i in range(25000)]
# Defining bow_vectorizer:
bow_vectorizer = CountVectorizer()
# Defining training_vectors:
training_vectors = bow_vectorizer.fit_transform(reviews_train)
# Defining test_vectors:
test_vectors = bow_vectorizer.transform(reviews_test)

Метод .fit_transform () предназначен для создания словаря функций на основе заданного параметра и преобразования входных данных в векторы. Точно так же метод .transform () только преобразует входные данные в векторы на основе словаря функций.

3. Прогноз!

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

classifier = MultinomialNB()
def pos_or_not(label):
   return "Positive" if label else "Negative"
classifier.fit(training_vectors, training_labels)
accuracy = classifier.score(test_vectors, test_labels)
print("Accuracy: ", accuracy*100, "%")
sentence = input().strip().lower()
input_vector = bow_vectorizer.transform([sentence])
print("Probability for review being Negative:",classifier.predict_proba(input_vector)[0][0])
print("Probability for review being Positive:",classifier.predict_proba(input_vector)[0][1])
predict = classifier.predict(input_vector)
print(pos_or_not(predict))

Давайте проверим нашу модель, сделав прогноз для обзора: «Мне понравилась сцена на показе мод, когда Джесси шел по подиуму, глядя на синий неоновый треугольник перед собой». Ниже приведены результаты прогнозирования метки для нашего обзора вместе с вероятностями.

Если изменить отзыв так: «Мне не понравилась сцена на показе мод, когда Джесси шла по подиуму, глядя на синий неоновый треугольник перед собой». Мы получим следующий результат.

Это простейший классификатор обзоров фильмов, созданный с помощью классификатора Наивного Байеса. Приведенный выше код и набор данных можно найти здесь. Вы можете найти меня здесь в LinkedIn. Удачного кодирования!