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

Часть 1. Интуиция и как мы работаем с документами?

Часть 2: Часть 2: Обработка текста (модель N-Gram и модель TF-IDF)

Часть 3. Алгоритм обнаружения (машины опорных векторов и градиентный спуск)

Часть 4. Варианты этого подхода (обнаружение вредоносных программ с помощью классификации документов)

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

Итак, с какими данными мы работаем при классификации текста? Существуют более продвинутые подходы, использующие семантику и эвристику, но все они в основном основаны на анализе слов (хотя это зависит от того, как вы это определяете), из которых состоят документы.

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

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

def isItSpam(document):
  if document.contains(“prince”) OR document.contains(“sex”):
    return True;
  else:
    return False;

Не может быть так просто. В тексте гораздо больше нюансов, чем этот.

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

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

x = [1,6,8] //inputs
w = [0.2,0.7,0.6] //weights
The weighting process could be like: x*w = [0.2, 4.2, 4.8]

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

Например:

Sum of x*w = 0.2+4.2+4.8 = 9.2, which is positive, and therefore a certain category.

Но если мы попробуем это с текстом:

x = [“this”, ”is”, “text”]
W = [0.2, 0.7, 0.6]
x*W =

Что такое «это», умноженное на 0,2?

Когда я только начинал, это было источником путаницы с классификацией документов.

Машинное обучение требует работы с числовыми данными, но текст не является числовым. Нам требуется числовое представление для вычисления алгоритмов машинного обучения.

Векторизация текста

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

Допустим, у нас есть следующие предложения как часть нашего корпуса документов:

Sentence 1 (S1): “vectorize this text to have numbers!”
Sentence 2 (S2): "what does it mean to vectorize?"
Sentence 3 (S3): "document classification is cool"

Затем мы создаем набор словаря:

V = ['classification', 'cool', 'document', 'does', 'have', 'is', 'it', 'mean', 'numbers', 'text', 'this', 'to', 'vectorize', 'what']

Если вы еще не угадали, набор словаря содержит все слова, встречающиеся во всем корпусе.

И теперь мы можем представить каждое предложение как вектор, состоящий из того, сколько раз определенные слова из набора V встречаются в каждом предложении, где каждый компонент соответствует индексу этого слово из словарного набора:

S1 = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0]
S2 = [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]
S3 = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

Теперь у нас есть числовое представление предложений! Теперь мы можем делать с этим представлением всевозможные классные вещи, например, обучать на нем модель машинного обучения. Эта модель называется моделью векторного пространства.

Значение векторизованного текста

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

Математика с текстом (?!)

Чтобы дать вам представление о том, насколько крута эта модель, вот способ вычислить сходство документов для тех, кто знаком с математикой в ​​средней школе в векторах:

Угол между двумя векторами равен скалярному произведению двух векторов, деленному на их величину (в приведенной выше формулировке i представляет каждый компонент, каждое число в вектор). Для тех, кто интересуется, но еще не знаком с точечными продуктами, вы можете узнать о них здесь.

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

Возвращаясь к нашим предложениям, с которыми мы работали:

Sentence 1 (S1): “vectorize this text to have numbers!”
Sentence 2 (S2): "what does it mean to vectorize?"
Sentence 3 (S3): "document classification is cool"

Думаю, большинство согласится с тем, что предложения 1 и 2 больше похожи друг на друга, чем на предложение 3. Позвольте мне доказать это математически с помощью того, что я только что представил выше.

Учитывая векторные представления, представленные выше:

S1 = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0]
S2 = [0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]
S3 = [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0

Давайте посчитаем сходство:

Точечное произведение S1 и S2:

Величина S1:

Величина S2: 2.4494897428.

Итак, угол между S1 и S2 равен:

Это большой угол, но если вы вычислите угол между S1 и S3 (для этого я сэкономлю скалярное произведение и расчет величины):

Он даже больше 70 градусов. Мы можем согласиться с тем, что 90 градусов больше 70 градусов, и, таким образом, мы докажем, что S1 более похожа на S2, чем на S3.

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

Некоторые задачи классификации документов действительно включают эту идею. Но в этой серии статей мы рассмотрим другой алгоритм, который называется «Машины опорных векторов».

Реализация Python

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