Итак, во время учебы у меня была возможность поработать над исследовательской работой, основанной на обзорах, особенно мобильных обзорах, и что в этом особенного, вы говорите?
Что ж, это изменило мой мир, если можно так сказать! Это не просто открыло для меня ворота НЛП и анализа настроений, но это был мой первый проект по машинному обучению, в котором я понял, что мы, все мы, смотрим вокруг, являемся производителями данных. И эти данные сознательно или неосознанно используются аналитиками. Разве это не круто? Ну я так и думал :)
Итак, после этого я начал свое приключение в области машинного обучения, и это привело меня на Medium! Поскольку это мой первый рассказ здесь, я подумал, почему бы не сделать анализ еще одной кучи обзоров. На этот раз данные из ресторанов, ничего особенного, данные можно найти на kaggle, по этой ссылке: Отзывы клиентов ресторана | Каггл. Так что следите за новостями или просто читайте в свое удовольствие! Да, и в качестве справки я также использовал курс машинного обучения от A до Z от Udemy и TensorProjects.
Поэтому для анализа настроений я буду использовать алгоритмы классификации.
Если вы еще не знакомы с ними, я предлагаю вам освежить в памяти типы алгоритмов машинного обучения, многие мои коллеги по Medium написали о них замечательные статьи. Ладно, хватит болтать, перейдем к коду...
#import all the required libraries, there's practically one for #everything import numpy as np import pandas as pd #now lets import all the useful Natural Language Processing #Libraries import nltk import re nltk.download('stopwords') from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer #rest we can import while coding
Теперь, чтобы получить представление о данных, мы сделаем это:
P.S: извините за отсутствие вывода, но вам придется попробовать это на своем собственном ноутбуке, приятель. Не бойтесь, если вы столкнетесь с ошибками, просто погуглите, и кто-нибудь из StackOverflow или какого-нибудь замечательного форума придет вам на помощь xD
df = pd.read_csv('Location of your dataset', delimiter='\t', quoting=3) df.shape df.columns df.head()
Теперь пришло время НЛП — комментарии говорят сами за себя
# Cleaning the reviews corpus = [] for i in range(0,1000): # Cleaning special character from the reviews review = re.sub(pattern='[^a-zA-Z]',repl=' ', string=df['Review'][i]) # Converting the entire review into lower case review = review.lower() # Tokenizing the review by words review_words = review.split() # Removing the stop words review_words = [word for word in review_words if not word in set(stopwords.words('english'))] # Stemming the words ps = PorterStemmer() review = [ps.stem(word) for word in review_words] # Joining the stemmed words review = ' '.join(review) # Creating a corpus corpus.append(review) # Creating the Bag of Words model from sklearn.feature_extraction.text import CountVectorizer cv = CountVectorizer(max_features=1500) X = cv.fit_transform(corpus).toarray() y = df.iloc[:, 1].values
Обучение модели - Использование разделения тестов поезда и реализация наших алгоритмов
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 0)
Теперь ниже приведены различные модели классификации, которые вы можете использовать по своему усмотрению: 1) Наивный байесовский анализ.
# Fitting Naive Bayes to the Training set from sklearn.naive_bayes import MultinomialNB classifier = MultinomialNB() classifier.fit(X_train, y_train)
2) СВМ
from sklearn.svm import SVC classifier = SVC(kernel = 'linear', random_state = 0) classifier.fit(X_train, y_train)
3) Классификатор случайного леса
from sklearn.ensemble import RandomForestClassifier classifier = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0) classifier.fit(X_train, y_train)
Предсказания — эта функция берет обзор образца, преобразует его в нижний регистр, удаляет стоп-слова и использует PorterStemmer, который является предопределенной функцией для поиска корней и преобразования в окончательный чистый обзор.
def predict_sentiment(sample_review): sample_review = re.sub(pattern='[^a-zA-Z]',repl=' ', string = sample_review) sample_review = sample_review.lower() sample_review_words = sample_review.split() sample_review_words = [word for word in sample_review_words if not word in set(stopwords.words('english'))] ps = PorterStemmer() final_review = [ps.stem(word) for word in sample_review_words] final_review = ' '.join(final_review) temp = cv.transform([final_review]).toarray() return classifier.predict(temp)
Теперь предсказание —
# Predicting values sample_review = 'The food is really good here.' if predict_sentiment(sample_review): print('This is a POSITIVE review.') else: print('This is a NEGATIVE review!')
Ну это было долго!! Если вы дочитали до конца, большое вам спасибо и надеюсь, что вы чему-то научились!