Руководство для начинающих по созданию простой модели детектора спама с использованием библиотеки обработки естественного языка Scikit-Learn.

Автор: Эдвард Крюгер и Дуглас Франклин.

Посмотрите код в нашем репозитории GitHub!

Эта проблема

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

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

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

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

Данные

Прежде чем мы начнем, давайте взглянем на наши данные.

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

Звучит достаточно просто, но компьютеры не умеют читать и учиться так, как мы! Однако машины - отличные калькуляторы. Итак, давайте превратим наш текст в структуру, с которой наши машины могут выполнять математические вычисления, векторы.

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

Токенизация

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

Токен не обязательно является термином или словом. токен - это экземпляр последовательности символов в некоторых конкретных документах, сгруппированных как полезная семантическая единица для обработки. Другими словами, токен - это значимая часть языка, на котором мы хотим, чтобы наша модель училась.

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

IN: “moon river wider than a mile i am crossing you in style”
OUT: [moon, river, wider, than, a, mile, i, am, cross, you, in, style]

Путем токенизации мы перешли от строки, содержащей слова длиной более пяти символов и пробелов, к массиву слов или токенов, состоящих из пяти или менее символов и без пробелов.

Итак, теперь у нас есть массив строк, как нам преобразовать эти массивы в векторы?

Векторизация: отображение слов в числовые значения

CountVectorizer Scikit-learn предоставляет простой способ как токенизировать коллекцию текстовых документов, так и создать словарь известных слов.

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

Предложения к векторам с CountVectorizer

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

Это подводит нас к следующей идее: как можно уменьшить корпус, не теряя особого смысла?

После преобразования корпуса в массив целых чисел с помощью CountVectorizer мы переходим к игнорируемым словам.

Стоп-слова: какой словарь включить в модель?

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

Добавление игнорируемых слов в стоп-лист может быть ручным или автоматическим. В Scikit-learn's CountVectorizer есть опция для конкретных стоп-слов для всего корпуса. Вы можете передать массив стоп-слов или автоматизировать процесс с помощью аргументов минимальной и максимальной частоты документа.

Эта уменьшенная матрица будет обучаться быстрее и даже может повысить точность вашей модели.

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

CountVectorizer

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

Строительные модели трубопроводов

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

Например, взгляните на наш наивный байесовский конвейер.

nb = make_pipeline(
    CountVectorizer(binary=True),
    MultinomialNB()
)

Мы просто вызываем make_pipline, добавляем CountVectorizer и нашу модель, затем вызываемnb.fit для обучения модели с помощью конвейера!

Алгоритмы машинного обучения часто включают в себя последовательность задач, включая предварительную обработку, извлечение признаков, подгонку модели и этапы проверки. Конвейеры помогают нам объединить эти задачи.

Метрики модели: точность и отзыв

Как определить, какая модель наиболее эффективна для решения этой проблемы? Во-первых, давайте посмотрим на некоторые из наших оценок модели, точности и запоминаемости.

Точность пытается ответить на следующий вопрос:

Какая доля положительных идентификаций была правильной?

Точность измеряет процент сообщений электронной почты, помеченных как спам, которые были правильно классифицированы.

Вспомните пытается ответить на следующий вопрос:

Какая доля реальных положительных результатов была определена правильно?

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

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

Итак, вам нужно знать, что важнее для вашей проблемы, точность или отзыв?

Давайте посмотрим на две наши модели. Здесь у нас есть оценки модели Наивного Байеса.

И здесь у нас есть оценки модели логистической регрессии.

Обратите внимание, что модель NB лучше, чем модель LR, во всех категориях, кроме одной - точность спама. Мы не можем сказать, что одна модель всегда лучше другой, но мы можем чаще выбирать ту, которая подходит.

Сохраните вашу модель

После того, как вы выбрали модель, сохраните ее как .joblib, как мы сделали ниже с нашей Наивной байесовской моделью.

dump(nb, "clf.joblib")

Теперь у вас есть модель обнаружения спама, сохраненная в виде библиотеки вакансий!

Заключение

Здесь мы рассмотрели основные концепции NPL, токенизацию, векторизацию и стоп-слова. Затем мы использовали эти концепции с CountVectorizer в конвейере модели для сравнения показателей по моделям. Выбрав наивный байесовский классификатор, мы сохранили его как joblib для дальнейшего использования в нашем приложении.

Ознакомьтесь с кодом в нашем GitHub Repositor, чтобы получить шаблон, чтобы начать работу!

Чтобы использовать вашу модель с приложением и развернуть ее, ознакомьтесь с дополнительными материалами, приведенными ниже!

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