You are currently viewing Python | NLP анализ отзывов о ресторанах

Python | NLP анализ отзывов о ресторанах

Обработка естественного языка (НЛП) — это область компьютерных наук и искусственного интеллекта, связанная с взаимодействием между компьютерами и человеческими (естественными) языками, в частности, с тем, как программировать компьютеры для обработки и анализа больших объемов данных на естественном языке. Это отрасль машинного обучения, которая занимается анализом любого текста и обработкой прогнозирующего анализа.Scikit-учись
это бесплатная библиотека машинного обучения программного обеспечения для языка программирования Python. Scikit-learn в основном написан на Python, а некоторые основные алгоритмы написаны на Cython для достижения производительности. Cython-это надмножество языка программирования Python, предназначенное для обеспечения производительности, подобной C, с кодом, написанным в основном на Python.
Давайте разберемся в различных шагах, связанных с обработкой текста и потоком НЛП.
Этот алгоритм можно легко применить к любому другому виду текста, например, классифицировать книгу на романтические, трения, но сейчас давайте воспользуемся обзором ресторана набор данных для просмотра отрицательных или положительных отзывов.

Необходимые шаги:

Шаг 1: Импортируйте набор данных, установив разделитель в виде «\t», так как столбцы разделены пробелом. Отзывы и их категория(0 или 1) не разделены каким-либо другим символом, но с пробелом, как и большинство других символов, это обзор (например, $ за цену,….! и т. д.), И алгоритм может использовать их в качестве разделителя, что приведет к странному поведению (например, ошибки, странный вывод) в выводе.

# Importing Libraries
import numpy as np
import pandas as pd

# Import dataset
dataset = pd.read_csv('Restaurant_Reviews.tsv', delimiter = '\t')

Чтобы загрузить используемый набор данных Restaurant_Reviews.tsv, нажмите здесь.
Шаг 2: Очистка текста или предварительная обработка

  • Удалите знаки препинания, цифры: Знаки препинания, цифры не очень помогают в обработке данного текста, если они будут включены, они просто увеличат размер пакета слов, который мы создадим в качестве последнего шага, и снизят эффективность алгоритма.
  • Происхождение: Пустите корни в слове
  • Преобразуйте каждое слово в нижний регистр: например, бесполезно иметь несколько слов в разных падежах (например, «хорошо» и «ХОРОШО»).
# library to clean data
import re

# Natural Language Tool Kit
import nltk

nltk.download('stopwords')

# to remove stopword
from nltk.corpus import stopwords

# for Stemming propose
from nltk.stem.porter import PorterStemmer

# Initialize empty array
# to append clean text
corpus = []

# 1000 (reviews) rows to clean
for i in range(0, 1000):
	
	# column : "Review", row ith
	review = re.sub('[^a-zA-Z]', ' ', dataset['Review'][i])
	
	# convert all cases to lower cases
	review = review.lower()
	
	# split to array(default delimiter is " ")
	review = review.split()
	
	# creating PorterStemmer object to
	# take main stem of each word
	ps = PorterStemmer()
	
	# loop for stemming each word
	# in string array at ith row
	review = [ps.stem(word) for word in review
				if not word in set(stopwords.words('english'))]
				
	# rejoin all string array elements
	# to create back into a string
	review = ' '.join(review)
	
	# append each string to create
	# array of clean text
	corpus.append(review)

Примеры: До и после применения вышеуказанного кода (отзывы = > до, корпус =>> после)

Шаг 3: Маркировка, включает в себя разделение предложений и слов из основной части текста.
Шаг 4: Создание пакета слов с помощью разреженной матрицы

  • Возьмите все разные слова отзывов в наборе данных, не повторяя слов.
  • По одному столбцу для каждого слова, следовательно, столбцов будет много.
  • Строки-это отзывы
  • Если слово есть в строке набора данных отзывов, то количество слов будет в строке набора слов под столбцом слова.

Примеры: Давайте возьмем набор данных отзывов только из двух отзывов

Input : "dam good steak", "good food good service"
Output :

Для этой цели нам нужен класс CountVectorizer из sklearn.feature_extraction.text.
Мы также можем установить максимальное количество функций (максимальное количество функций, которые больше всего помогают с помощью атрибута “max_features”). Выполните обучение на корпусе, а затем примените то же преобразование к корпусу “.fit_transform(корпус)”, а затем преобразуйте его в массив. Если отзыв положительный или отрицательный, этот ответ находится во втором столбце набора данных [:, 1]: все строки и 1-й столбец (индексирование с нуля).

# Creating the Bag of Words model
from sklearn.feature_extraction.text import CountVectorizer

# To extract max 1500 feature.
# "max_features" is attribute to
# experiment with to get better results
cv = CountVectorizer(max_features = 1500)

# X contains corpus (dependent variable)
X = cv.fit_transform(corpus).toarray()

# y contains answers if review
# is positive or negative
y = dataset.iloc[:, 1].values
Описание используемого набора данных:

Столбцы, разделенные символом \t (пробел на вкладке)
Первая колонка посвящена отзывам людей
Во второй колонке 0 означает отрицательный отзыв, а 1-положительный отзыв

Шаг 5: Разделение корпуса на обучающий и тестовый набор. Для этого нам нужен класс train_test_split из sklearn.cross_validation. Разделение может быть выполнено 70/30 или 80/20, или 85/15, или 75/25, здесь я выбираю 75/25 с помощью “test_size”.
X-это набор слов, y-0 или 1 (положительный или отрицательный).

# Splitting the dataset into
# the Training set and Test set
from sklearn.cross_validation import train_test_split

# experiment with "test_size"
# to get better results
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

Шаг 6: Подгонка прогностической модели (здесь случайный лес)

  • Поскольку случайный лес-это модель ансамбля (состоящая из множества деревьев) из sklearn.ensemble, импортируйте класс RandomForestClassifier
  • С 501 деревом или “n_estimators” и критерием ‘энтропия’
  • Подгонка модели с помощью метода .fit() с атрибутами X_train и y_train
# Fitting Random Forest Classification
# to the Training set
from sklearn.ensemble import RandomForestClassifier

# n_estimators can be said as number of
# trees, experiment with n_estimators
# to get better results
model = RandomForestClassifier(n_estimators = 501,
							criterion = 'entropy')
							
model.fit(X_train, y_train)

Шаг 7: Прогнозирование конечных результатов с помощью метода .predict() с атрибутом X_test

# Predicting the Test set results
y_pred = model.predict(X_test)

y_pred

Примечание: Точность со случайным лесом составила 72%.(Это может быть по-другому, когда выполняется эксперимент с разными размерами теста, здесь = 0,25).
Шаг 8: Чтобы узнать точность, необходима матрица путаницы.
Матрица путаницы-это матрица 2Х2.

ИСТИННЫЙ ПОЗИТИВ : измеряет долю фактических положительных результатов, которые правильно определены.
ИСТИННЫЙ НЕГАТИВ : измеряет долю фактических положительных результатов, которые неправильно определены.
ЛОЖНОПОЛОЖИТЕЛЬНЫЙ РЕЗУЛЬТАТ : измеряет долю фактических негативов, которые правильно идентифицированы.
ЛОЖНЫЙ НЕГАТИВ : измеряет долю фактических негативов, которые неправильно идентифицированы.

Примечание. Значение True или False указывает на правильность или неправильность присвоенной классификации, в то время как Положительное или Отрицательное относится к присвоению Положительной или Отрицательной категории

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

cm