Анализ настроений на основе болтовни в сети уже некоторое время является одним из главных в списках всех брендов. На рынке доступно множество инструментов, которые могут сделать это за вас. Настолько, что к 2023 году ожидается, что объем рынка Global Sentiment Analytics составит около 6 миллиардов долларов ».

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

Чтобы сосредоточить внимание на части нашей проблемы # Машинное обучение, я не буду вдаваться в предварительную обработку текста, детали очистки текста и т. Д. Извлечение текста и манипуляции с ним с использованием #NLP - огромная тема, и я планирую осветить это в другой статье позже. Здесь я использую некоторые замечательные инструменты из супер-классной библиотеки scikit-learn. Я использую набор данных, предоставленный Team AV, и его можно найти на #Kaggle, ссылка на набор данных ниже.



Хорошо, давайте начнем с настройки нашей среды кодирования и загрузки нашего набора данных.

import pandas as pd
import warnings
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import make_pipeline
from sklearn import metrics
warnings.filterwarnings("ignore")

df = pd.read_csv("/kaggle/input/twitter-sentiment-analysis-analytics-vidya/train_E6oV3lV.csv")
dfr = df[['tweet','label']]
print(len(df))
print(df)

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

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

train_test_split (): Нам нужно учиться на наших данных, эта функция разбивает набор данных на поезд и тестовый набор с указанными критериями разделения, мы начинаем с дробной настройки 0,2, что означает, что мы будем использовать 80% нашего набора данных для обучения нашей модели и 20% для тестирования и оценки нашей модели.

TfidfVectorizer (): Tf-idf - один из наиболее эффективных способов обработки текстовых данных для целей машинного обучения, он означает частота термина - обратная частота документа и представлен приведенная ниже формула, с помощью этой функции мы конвертируем все слова в оценки tf-idf.

TF - IDF = TF (частота обращения) * IDF (частота обратного документа)

Частота использования термина - сколько раз термин встречается в данном документе.

IDF - количество документов, в которых встречается данный термин.

make_pipeline (): Эта функция используется для определения нашего конвейера данных, мы можем применить список преобразований, за которым следует окончательная оценка, в нашем случае это MultinomialNB.

MultinomialNB (): в инструментарии каждого начинающего специалиста по данным должна быть эта версия знаменитого алгоритма Наивного Байя, которая учитывает частоту термина и вычисляет вероятность каждой метки с учетом входного текста.

Теперь, когда мы знаем, для чего используется каждая из этих функций, давайте приступим к обучению нашей модели с данными поезда. Приведенный ниже фрагмент кода разбивает наш набор данных на данные поезда и тестовые данные. Мы определяем словарь из 50 000 слов с помощью TfidVectorizer (), который наша модель будет использовать для обучения.

# split the data such that we have 80% of the data as train size
train,test = train_test_split(dfr, test_size=0.2, shuffle=False)
#Define our model with 50 k Vocabulary and training our model
model = make_pipeline(TfidfVectorizer(max_features = 50000,smooth_idf=True), MultinomialNB())
model.fit(train.tweet, train.label)
labels = model.predict(test.tweet)
print(labels)
#Check the accuracy of our MultinomialNB classifier
score = metrics.accuracy_score(test.label,labels,normalize=True)
print("accuracy: %0.3f" % score)
print(metrics.classification_report(test.label,labels,target_names=['label 0','label 1']))
print(metrics.confusion_matrix(test.label, labels))

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

Верно, наша модель имеет показатель точности 0,939, что означает, что она дает точные прогнозы в 93,9% раз. Чтобы понять, что означает каждый из этих терминов, нам нужно понять матрицу путаницы с метриками. Для этого доступно множество научных источников, я цитирую один ниже.

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

Улучшение нашей модели. Давайте попробуем улучшить нашу модель, точно настроив параметры, которые мы используем для ее обучения, например, давайте изменим размер словарного запаса на 10 КБ с 50 КБ, повторное обучение модели дает вывод ниже.

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

Теперь давайте перейдем к последней части нашей постановки задачи, нам нужно предсказать класс твитов, найденных в файле «test_tweets_anuFYb8.csv», и экспортировать файл csv в указанном формате.

#import the csv file with tweets to be labelled
test_df = pd.read_csv("/kaggle/input/twitter-sentiment-analysis-analytics-vidya/test_tweets_anuFYb8.csv")
print(len(test_df))
test2=test_df[['tweet',"id"]]
test2["label"] = ""
model.fit(train.tweet, train.label)
labels = model.predict(test2.tweet)
test2["label"] = labels
test2 = test2[['id',"label"]]
print(test2)
test2.to_csv('test_predictions.csv', header=True)

Блокнот загружен на Kaggle и может быть загружен по ссылке ниже.