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

Анализ настроений помогает специалистам по обработке данных анализировать любые данные, например данные о бизнесе, политике, социальных сетях и т. д.

Анализ настроений - это задача НЛП, которая является подполем искусственного интеллекта, помогающего машинам работать с человеческими языками. Разобраться с 6500 человеческими языками непросто. Прочтите о НЛП здесь.

NLTK (набор инструментов для естественного языка), TextBlob, Spacy - это модули для задач НЛП.

Что такое SVM?

SVM - это контролируемый (автоматически передаваемый) алгоритм машинного обучения, который можно использовать как для задач классификации, так и для решения задач регрессии. Классификация предсказывает label/group, а регрессия предсказывает continuous value. SVM выполняет классификацию, находя гиперплоскость, которая различает классы, которые мы построили в n-мерном пространстве.

SVM рисует эту гиперплоскость, преобразовывая наши данные с помощью математических функций, называемых «ядрами». Типы ядер: линейные, сигмовидные, RBF, нелинейные, полиномиальные и т. д.

Параметр настройки Ядро - «RBF» предназначен для нелинейных задач, а также является ядром общего назначения, используемым, когда нет предварительных знаний о данных. Ядро - «линейный» для линейных разделимых задач. Поскольку наша проблема здесь линейная (как положительная, так и отрицательная), мы выберем «линейную SVM».

Шаги, необходимые для построения модели

  • Сбор точных данных для обучения и тестирования
  • Векторизация данных
  • Создание линейной модели SVM для обучения и последующего прогнозирования

Сбор данных

Я выбираю данные из наборов данных полярности настроений 2.0, которые правильно классифицируют набор данных фильмов и преобразуются в CSV для удобства использования.

import pandas as pd
# train Data
trainData = pd.read_csv("https://raw.githubusercontent.com/Vasistareddy/sentiment_analysis/master/data/train.csv")
# test Data
testData = pd.read_csv("https://raw.githubusercontent.com/Vasistareddy/sentiment_analysis/master/data/test.csv")

Давайте посмотрим на образцы данных

trainData.sample(frac=1).head(5) # shuffle the df and pick first 5
      Content                                             Label
56    jarvis cocker of pulp once said that he wrote ...   pos
1467  david spade has a snide , sarcastic sense of h...   neg
392   upon arriving at the theater during the openin...   pos
104   every once in a while , a film sneaks up on me...   pos
1035  susan granger's review of " american outlaws "...   neg

Векторизация данных

«Мучите данные, и они признаются во всем». - Рональд Коуз

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

from sklearn.feature_extraction.text import TfidfVectorizer
# Create feature vectors
vectorizer = TfidfVectorizer(min_df = 5,
                             max_df = 0.8,
                             sublinear_tf = True,
                             use_idf = True)
train_vectors = vectorizer.fit_transform(trainData['Content'])
test_vectors = vectorizer.transform(testData['Content'])

О параметрах читайте в документации здесь.

Создание линейной модели SVM

import time
from sklearn import svm
from sklearn.metrics import classification_report
# Perform classification with SVM, kernel=linear
classifier_linear = svm.SVC(kernel='linear')
t0 = time.time()
classifier_linear.fit(train_vectors, trainData['Label'])
t1 = time.time()
prediction_linear = classifier_linear.predict(test_vectors)
t2 = time.time()
time_linear_train = t1-t0
time_linear_predict = t2-t1
# results
print("Training time: %fs; Prediction time: %fs" % (time_linear_train, time_linear_predict))
report = classification_report(testData['Label'], prediction_linear, output_dict=True)
print('positive: ', report['pos'])
print('negative: ', report['neg'])
--------------------------------------------------------------------
Training time: 10.460406s; Prediction time: 1.003383s
positive:  {'precision': 0.9191919191919192, 'recall': 0.91, 'f1-score': 0.9145728643216081, 'support': 100}
negative:  {'precision': 0.9108910891089109, 'recall': 0.92, 'f1-score': 0.9154228855721394, 'support': 100}

f1-score в обоих случаях равен 91%, что является средним гармоническим точности и полноты. Подробнее о точности и запоминании см. здесь.

f1-score = 2 * ((precision * recall)/(precision + recall))

Протестируйте классификатор SVM на обзорах Amazon

review = """SUPERB, I AM IN LOVE IN THIS PHONE"""
review_vector = vectorizer.transform([review]) # vectorizing
print(classifier_linear.predict(review_vector))
--------------------------------------------------------------------
['pos']
review = """Do not purchase this product. My cell phone blast when I switched the charger"""
review_vector = vectorizer.transform([review]) # vectorizing
print(classifier_linear.predict(review_vector))
--------------------------------------------------------------------
['neg']
review = """I received defective piece display is not working properly"""
review_vector = vectorizer.transform([review]) # vectorizing
print(classifier_linear.predict(review_vector))
--------------------------------------------------------------------
['neg']
review = """It's not even 5 days since i purchased this product.
I would say this a specially blended worst Phone in all formats.
ISSUE 1:
Have you ever heard of phone which gets drained even in standby mode during night?
Kindly please see the screenshot if you want to believe my statement.
My phone was in full charge at night 10:07 PM . I took this screenshot and went to sleep.
Then I woke up at morning and 6:35 AM and battery got drained by 56% in just standby condition.
If this is the case consider how many hours it will work, during day time.
It's not even 5 hours the battery is able to withstand.
ISSUE 2:
Apart from the battery, the next issue is the heating issue .I purchased a iron box recently from Bajaj in this sale.
But I realized this phone acts a very good Iron box than the Bajaj Iron box. I am using only my headphones to get connected in the call. I am not sure when this phone is will get busted due to this heating issue. It is definitely a challenge to hold this phone for even 1 minute. The heat that the phone is causing will definitely burn your hands and for man if you keep this phone in your pant pocket easily this will lead to infertility for you. Kindly please be aware about that.
Issue 3:
Even some unknown brands has a better touch sensitivity. The touch sensitivity is pathetic, if perform some operation it will easily take 1-2 minutes for the phone to response.
For your kind information my system has 73% of Memory free and the RAM is also 56% free.
Kindly please make this Review famous and lets make everyone aware of this issue with this phone.
Let's save people from buying this phone. There are people who don't even know what to do if this issue happens after 10 days from the date of purchase. So I feel at least this review will help people from purchasing this product in mere future."""
review_vector = vectorizer.transform([review]) # vectorizing
print(classifier_linear.predict(review_vector))
--------------------------------------------------------------------
['neg']

Полный код линейной классификации SVM находится здесь.

Травление модели

Для повторного использования мы можем сбросить модель и загрузить ее в любое время и в любом месте. Словарь также необходим для векторизации новых документов при прогнозировании метки.

import pickle
# pickling the vectorizer
pickle.dump(vectorizer, open('vectorizer.sav', 'wb'))
# pickling the model
pickle.dump(classifier_linear, open('classifier.sav', 'wb'))

Загрузите словарь и модель и используйте их как приложение-флягу. Проверьте gitcode здесь.

Набор данных, который мы здесь обучили, равен просто1800 movie documents, а точность 91%.. Для большей точности мы можем добавить больше документов в набор данных. Посмотрите эту страницу о очистке обзоров Amazon. Вы также можете искать наборы данных в панели инструментов google.

Спасибо за прочтение! Если вам нравится концепция, не забудьте одобрить мои навыки в Linkedin.

Пожалуйста, хлопайте и делитесь, если вам нравится статья.