Обработка естественного языка (НЛП) — это область компьютерных наук и искусственного интеллекта, связанная с взаимодействием между компьютерами и человеческими (естественными) языками, в частности, с тем, как программировать компьютеры для обработки и анализа больших объемов данных на естественном языке. Это отрасль машинного обучения, которая занимается анализом любого текста и обработкой прогнозирующего анализа.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