Python | Nlp-анализ отзывов о ресторанах
Обработка естественного языка (NLP) — это область информатики и искусственного интеллекта, связанная с взаимодействием между компьютерами и человеческими (естественными) языками, в частности, с программированием компьютеров для обработки и анализа больших объемов данных на естественном языке. Это область машинного обучения, которая занимается анализом любого текста и прогностическим анализом.
Scikit-learn — это библиотека машинного обучения для языка программирования Python. Scikit-learn в основном написан на Python, а некоторые основные алгоритмы написаны на Cython для достижения производительности. Давайте разберемся с различными шагами, связанными с обработкой текста и потоком НЛП.
Этот алгоритм можно легко применить к любому другому типу текста, например, классифицировать книгу на Романтику или Грусть, но пока давайте воспользуемся набором данных отзывов о ресторанах для просмотра отрицательных или положительных отзывов.
Шаги:
Шаг 1: Импортируйте набор данных с установкой разделителя «\t», поскольку столбцы разделены пространством табуляции.
# 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)
Примеры: до и после применения вышеуказанного кода
Теперь рассмотрим функцию CountVectorizer из sklearn.feature_extraction.text.
Мы можем установить максимальное количество функций (с помощью атрибута «max_features»). Попробуем обучение на датасете, а затем применим преобразование к корпусу «.fit_transform(corpus)», а затем преобразуем его в массив.
# 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: Теперь Чтобы узнать точность, построим матрица ошибок.
Мматрица ошибок — это матрица размером 2X2.
# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm