Введение

В этом посте мы собираемся обсудить, как классифицировать текст с помощью наивного байесовского классификатора. Наивные байесовские классификаторы в совокупности представляют собой группу классификационных алгоритмов. Это основано на теореме Байеса. Это не просто один алгоритм, а семейство алгоритмов. Все алгоритмы взаимно разделяют общий принцип. Например, каждая пара классифицируемых методов свободна друг от друга.
Наивный байесовский классификатор — это простой классификатор. Он классифицирует на основе вероятностей событий. Реализуется обычно для текстовой классификации. Следовательно, это простой алгоритм, поскольку он хорошо работает во многих задачах классификации текста. Он может давать точные результаты без большого количества обучающих данных.

Текстовая классификация

Классификация текста — это метод классификации текста на организованные группы. Классификаторы текста могут автоматически анализировать текст. После этого они назначают набор предопределенных тегов или четко определенных категорий. Это основано на его содержании с использованием Обработки естественного языка (NLP).

Модель классификации текста

  • Машинное обучение требует от нас формирования классификаций, основанных на прошлых наблюдениях.
  • Мы даем машине группу знаний, имеющую тексты с помеченными к ним метками.
  • Затем мы позволяем модели выяснить эти данные, которые позже могут дать нам полезную информацию о категориях ввода текста, который мы подаем.

Общий рабочий процесс

Описание

Теперь мы получаем список предложений и классифицируем их в соответствии с настроением пользователя. Мы хотели бы сообщить, несет ли предложение положительное или отрицательное отношение.
Загрузка данных

  • Мы можем просто открыть браузер, загрузить файлы CSV в папку области.
  • Загрузите файлы в фреймы данных с помощью pandas.
  • Питон — это то, что лучше всего скачивать файлы, а не браузер.
  • Найдите ссылку на сжатый файл и следуйте инструкциям, чтобы запросить информацию .
  • Сначала создайте папку для хранения загруженных данных.
  • Последующий код проверяет, существует ли указанная папка или нет.
  • Если его там нет, он создает его в текущем рабочем каталоге:
import os
data_dir = f'{os.getcwd()}/data'
if not os.path.exists(data_dir):
os.mkdir(data_dir)
  • Затем мы хотели бы добавить библиотеку запросов с помощью pip, так как мы будем использовать ее для загрузки данных:
pip install requests
  • Затем загрузите сжатые данные, например:
import requests
url =
'https://archive.ics.uci.edu/ml/machine-learning-databases/00331/se
ntiment labelled sentences.zip'
response = requests.get(url)
  • Теперь мы распакуем данные и сохраним их в только что созданной информационной папке.
  • Мы будем использовать модуль zipfile для распаковки наших данных.
  • Метод ZipFile используется для чтения файлового объекта.
  • Таким образом, мы будем использовать BytesIO для преобразования содержимого ответа в файлоподобный объект.
  • Затем извлеките содержимое zip-файла в нашу папку следующим образом:
import zipfile
from io import BytesIO
with zipfile.ZipFile(file=BytesIO(response.content), mode='r') as
compressed_file:
compressed_file.extractall(data_dir)
  • Теперь данные записываются в три отдельных файла в папке данных.
  • Мы загрузим каждый из трех файлов в отдельный фрейм данных.
  • Затем мы объединим три фрейма данных в один фрейм данных следующим образом:
df_list = []
for csv_file in ['imdb_labelled.txt', 'yelp_labelled.txt',
'amazon_cells_labelled.txt']:
csv_file_with_path = f'{data_dir}/sentiment labelled
sentences/{csv_file}'
temp_df = pd.read_csv(
csv_file_with_path,
sep="\t", header=0,
names=['text', 'sentiment']
)
df_list.append(temp_df)
df = pd.concat(df_list)
  • Мы будем отображать распределение меток тональности, используя следующий код:
explode = [0.05, 0.05]
colors = ['#777777', '#111111']
df['sentiment'].value_counts().plot(
kind='pie', colors=colors, explode=explode
  • Мы также можем отобразить пару примеров предложений, используя следующий код, после настройки параметров pandas для отображения большего количества символов в ячейке:
pd.options.display.max_colwidth = 90
df[['text', 'sentiment']].sample(5, random_state=42)

Подготовка данных

Теперь мы хотели бы организовать данные для нашего классификатора, чтобы использовать их:

  • Начнем с разделения фрейма данных на наборы для обучения и тестирования.
  • Мы сохранили 40% набора данных для тестирования:
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, test_size=0.4,
random_state=42)
  • Затем получите метки из столбца настроений следующим образом:
y_train = df_train['sentiment']
y_test = df_test['sentiment']
  • Из-за текстовых особенностей давайте конвертируем их с помощью CountVectorizer.
  • Мы будем включать униграммы также как биграммы и триграммы.
  • Аналогичным образом мы будем игнорировать редкие слова, установив для min_df значение три, чтобы исключить слова, встречающиеся менее чем в трех документах.
  • Часто это полезная практика для удаления орфографических ошибок и зашумленных токенов.
  • Наконец, мы удалим акценты из букв и преобразуем их в ASCII:
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(ngram_range=(1,3), min_df=3,
strip_accents='ascii')
x_train = vec.fit_transform(df_train['text'])
x_test = vec.transform(df_test['text'])
  • В конце мы будем использовать наивный байесовский классификатор для классификации наших данных.
  • Мы устанавливаем fit_prior=True, чтобы модель использовала распределение меток категорий в обучающих данных в качестве априорного:
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB(fit_prior=True)
clf.fit(x_train, y_train)
y_test_pred = clf.predict(x_test)

На этот раз наша старая хорошая оценка точности может оказаться недостаточно информативной. мы хотели бы понять, насколько мы точны в каждом классе. Кроме того, в зависимости от нашего варианта использования нам, возможно, придется сообщить, была ли модель готова идентифицировать все отрицательные твиты, хотя она сделала это за счет неправильной классификации некоторых положительных твитов. Чтобы быть готовыми к получению этой информации, мы хотели бы использовать показатели точности и полноты.

Точность, отзыв и оценка F1

Из отсчетов, которые были отнесены к положительному классу, доля действительно положительных составляет точность этого класса. Для положительных твитов доля их, которые классификатор правильно предсказал как положительные, составляет отзыв для этого класса. Как мы увидим, точность и полнота рассчитываются для каждого класса. Вот как мы формально выражаем оценку точности с точки зрения истинных срабатываний и ложных срабатываний:

Оценка отзыва выражается в терминах истинно положительных и ложноотрицательных результатов.

Чтобы суммировать 2 предыдущие оценки в одно число, часто используется оценка F1. Он объединяет оценки точности и отзыва с использованием следующей формулы:

Здесь мы вычисляем три вышеупомянутые метрики для нашего классификатора:

p, r, f, s = precision_recall_fscore_support(y_test, y_test_pred)
Для ясности мы поместили полученные показатели в следующую таблицу. Всегда помните, что поддержка — это просто количество образцов в каждом классе:

У нас есть эквивалентные оценки, пока размеры 2 классов почти равны. В случаях, когда классы несбалансированы, чаще всего выясняется, что один класс достигает большей точности или лучшего отзыва по сравнению с противоположным.

Для получения более подробной информации посетите: https://www.technologiesinindustry4.com/2021/09/text-classification-with-naive-bayes-classifier.html