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

Ответить