Самый простой способ создать классификатор текста с базовой моделью машинного обучения для начинающих.

Мотивация

Когда я знакомлюсь с наукой о данных, я обнаружил, что область обширна. На своем пути к науке о данных я сначала изучил основные алгоритмы машинного обучения и был достаточно уверен, чтобы реализовать алгоритмы машинного обучения в реальных приложениях. Позже я узнал об обработке естественного языка (NLP). Идея, лежащая в основе НЛП, очень крутая, но с самого начала она не казалась мне простой. В какой-то момент мне удалось связать НЛП с базовыми техниками машинного обучения. Я пришел к выводу, что НЛП — это не что иное, как современная техника, состоящая из базового машинного обучения, интегрированного с некоторыми дополнительными методами обработки языка, с помощью которых компьютеры могут реализовать человеческий язык. Руководствуясь базовым пониманием обработки естественного языка, я создал простой текстовый классификатор без использования какой-либо техники глубокого обучения для классификации текстов. Это даст нам четкое представление о классификации текста.

Теперь пришло время перейти к полному руководству по созданию простого текстового классификатора…..

Предпосылки

Прежде чем приступить к проекту, я хотел бы предложить вам иметь базовое представление о —

  • токенизация
  • лемматизация
  • выведение
  • стоп-слово
  • распознавание сущности имени
  • Маркировка POS
  • мешок слов
  • TF-IDF

Если вы не знакомы с методами, пожалуйста, прочитайте статью, приведенную ниже.



Для вашего удобства в этой статье я рассмотрю Bag of words и TF-IDF, потому что это наиболее важная концепция для построения нашего классификатора. Я постараюсь, чтобы это было просто и легко.

И Bag of words, и TF-IDF являются методами встраивания слов. Эти системы встраивания слов важны для обучения моделей машинного обучения классификации.

Набор слов (BoW)

Мешок слов — это простой способ представить текст в виде чисел. С помощью вектора Bag of words мы можем представить комбинацию предложений из строки чисел. В демонстрационных целях рассмотрим следующие два предложения:

  1. Я люблю читать книги.
  2. Мне нравится играть и ходить в школу.

Если я переведу все слова в нижний регистр и размечу предложения, я найду следующие токены'i', 'нравится', 'к', 'читать', 'книги', 'играть', ' и", "пойти", "в школу". В случае токенизации мы отбрасываем знаки препинания. Общее количество токенов равно 9. Мы можем представить токены следующим образом.

На изображении показано, как мы можем представить предложение с помощью векторов Bag of Words. Таким образом, вектор —

Предложение 1 : [1 1 1 1 1 0 0 0 0]

Предложение 2: [1 1 2 0 0 1 1 1 1]

Термин Частота Обратной Частоты Документа (TF-IDF)

Начнем с формального определения из Википедии.

TF-IDF – это числовая статистика, предназначенная для отражения важности слова для документа в коллекции или корпусе [1].

А теперь попробуй копнуть глубже....

Что такое частота терминов (TF)?

Он измеряет, как часто слово/токен/термин появляется в тексте. Следующая формула обозначает это.

TF= (Частота термина в документе) / (Общее количество терминов в документе)

Снова рассмотрим два предыдущих предложения.

  1. Я люблю читать книги.
  2. Мне нравится играть и ходить в школу.

В первом предложении 5 токенов или элементов — «я», «нравится», «кому», «читать», «книги».

Таким образом, TF для слова 'i' =(количество раз, когда 'i' появляется в предложении 1)/(количество терминов в предложении 2)=1 /5.

Сходным образом,

TF(лайк)=1/5

TF(‘to’)=1/5

TF('прочитано')=1/5

TF('книги')=1/5

ТФ для предложений можно представить следующим образом.

Что такое обратная частота документа (IDF)?

Одногоизмерения частоты термина недостаточно, чтобы узнать, является ли слово/термин важным или нет. Термин IDF введен для извлечения наиболее важных слов из набора документов. IDF рассчитывается по следующей формуле.

IDF = log( (количество документов)/ (количество документов с определенным словом или термином))

Мы можем рассчитать IDF для предложения 1 следующим образом:

IDF для слова'i' = log( (количество документов = 2)/( количество документов со словом 'i' = 2)) = log( 2/2)=0

Сходным образом,

IDF («нравится») = логарифм (2/2) = 0

IDF(‘до’) = log(2/2) =0

IDF («прочитано») = log (2/1) = 0,301

IDF («книги») = log (2/1) = 0,301

Если мы будем следовать формуле для расчета IDF для всех токенов, мы получим значения, показанные в таблице.

Таким образом, TF-IDF можно рассчитать по следующей формуле:

TF-IDF = TF x IDF

Если вы рассчитаете TF-IDF для двух предложений, вы получите следующие результаты.

Наконец, мы успешно подсчитали баллы для наших токенов/словаря. Мы можем заключить, что TF-IDF дает высокие значения для менее частых слов и когда значения IDF и TF высоки. В другом смысле TF-IDF является большим, когда слово часто встречается в одном документе, но редко встречается во всех документах.

Сравнительный анализ Bag of Words и TF-IDF

  1. Пакет слов — это набор векторов, представляющих вхождение слов в документ. С другой стороны, TF-IDF находит слова с большей и меньшей информацией.
  2. Векторы Bag of Words очень легко понять и интерпретировать. Однако TF-IDF немного сложен, но очень эффективен для модели машинного обучения.

Поскольку TF-IDF — лучший выбор для модели машинного обучения, в нашем текущем проекте мы будем использовать TF-IDF, а не только Bag of Words.

Давайте начнем создавать нашу простую модель классификации текста…

Шаги для создания текстового классификатора

  • Чтение текстовых данных или корпуса
  • Некоторая начальная предварительная обработка
  • Разделение данных для обучения и тестирования
  • Создайте конвейер для векторизации данных и модели машинного обучения.
  • Обучите модель
  • Протестируйте модель на новых данных
  • Оценить модель

Чтение текстовых данных или корпуса

Чтение или загрузка набора данных — это первый шаг для каждой модели машинного обучения. Мы будем использовать язык программирования python для всего нашего проекта, и мы использовали набор данных moviereviews для нашего проекта. Итак, для загрузки данных мы будем использовать pandas library, а текст был предварительно обработан как файл с разделителями табуляции.

import pandas as pd
df = pd.read_csv('moviereviews.tsv', sep='\t')

Если мы хотим получить первые несколько экземпляров набора данных, мы можем сделать это с помощью команды df.head(), и это даст следующий результат.

Начальная предварительная обработка

На этом этапе мы попытаемся найти отзывы, которые ничего не содержат. Мы должны отказаться от таких обзоров. Может быть два случая,

i) это может быть значение NaN (NaN означает не число, эквивалентное None)

ii) не содержит ничего, кроме пробелов. Давайте попробуем разобраться в наборе данных.

df.info()

Кусок кода дает следующий результат.

Он показывает, что всего существует 2000 экземпляров, а некоторые отзывы пусты. Мы должны отбросить строки, которые не имеют обзора. Давай сделаем это.

df.dropna(inplace=True)

Теперь проверьте информацию о фрейме данных.

df.info()

Кажется, теперь все в порядке. Все строки, содержащие нулевые значения, были удалены.

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

Если мы передадим фрейм данных df в функцию, она вернет список индексов для пустых строковых строк.

blank_data_index=detect_blank(df)

len(blank_data_index) возвращает 27. Это означает, что есть 27 строк, содержащих пустую строку. Теперь мы удалим его, следуя фрагменту кода.

df.drop(blank_data_index, inplace=True)

В нашем наборе данных нет пустых отзывов, а всего отзывов 1938.

df.label.value_counts()

Частота для столбца ярлыков.

neg    969
pos    969

Это показывает, что частота отрицательных и положительных отзывов одинакова, и это сбалансированный набор данных.

Разделение данных для обучения и тестирования

Для каждой модели машинного обучения нам нужно огромное количество данных для обучения модели и некоторые невидимые данные для оценки модели, известные как тестовые данные. В этом проекте мы взяли 67% данных для обучения и 33% данных для тестирования (это не фиксированный параметр. Вы можете настроить его по своему выбору).

from sklearn.model_selection import train_test_split
X = df['review']
y = df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Создание конвейера для векторизации данных и модели машинного обучения

Конвейер машинного обучения — это способ систематизировать последовательность работ для автоматизации рабочего процесса. В нашей модели мы будем выполнять две задачи с конвейером. Во-первых, векторизуйте словарь/токены с помощью TF-IDF. Во-вторых, создайте модель машинного обучения. В Scikit-learn есть множество модулей, облегчающих нашу жизнь. Итак, мы будем использовать библиотеку scikit-learn для векторизации TF-IDF и других моделей машинного обучения.

Для этого случая мы создали пайплайны для наивного байесовского и линейного классификатора SVC.

Обучение модели на текстовых данных

Мы создали два конвейера для наивного байесовского классификатора и линейной модели SVC.

Обучение с помощью наивного байесовского конвейера

text_clf_nb.fit(X_train, y_train)

Сведения о конвейере

Прогнозируйте выходные данные тестовых данных

# Form a prediction set
predictions = text_clf_nb.predict(X_test)

Нарисуйте матрицу путаницы для нашей модели

Это дает следующий результат.

Отчет о классификации конвейера (точность, отзыв, оценка F1, поддержка)

# Print a classification report
print(metrics.classification_report(y_test,predictions))

Выход

Точность

# Print the overall accuracy
print(metrics.accuracy_score(y_test,predictions))

Общая точность

0.7640625

Обучение с конвейером LinearSVC

text_clf_lsvc.fit(X_train, y_train)

Сведения о конвейере

Прогнозируйте выходные данные тестовых данных

# Form a prediction set
predictions_2 = text_clf_lsvc.predict(X_test)

Матрица путаницы

# Report the confusion matrix
from sklearn import metrics
print(metrics.confusion_matrix(y_test,predictions_2))

Вывод матрицы путаницы

[[259  49]
 [ 49 283]]

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

Отчет о классификации для второго конвейера (точность, отзыв, оценка F1, поддержка)

# Print a classification report
print(metrics.classification_report(y_test,predictions_2))

Вывод

Точность для второго конвейера

# Print the overall accuracy
print(metrics.accuracy_score(y_test,predictions))

Общая точность

0.846875

Результаты конвейеров показывают, что второй конвейер (линейный SVC) превосходит по показателям оценки. Итак, мы будем использовать второй конвейер в качестве нашей предпочтительной модели. Вы можете использовать другие алгоритмы классификации и выбрать лучший из них для своей окончательной модели, если хотите.

Прогнозирование класса нового отзыва

myreview = "A movie I really wanted to love was terrible. \
I'm sure the producers had the best intentions, but the execution was lacking."
print(text_clf_lsvc.predict([myreview]))

Выход

['neg']

Заключение

Обработка естественного языка (NLP) — захватывающая техника. В этой статье показан самый простой способ создания простого классификатора текста с использованием базового алгоритма машинного обучения. Хотя этот тип модели работает не очень хорошо, это может быть интересной статьей для новичков в НЛП.

Справочник

  1. tf–idf — Википедия

Следующие статьи могут быть вам интересны……