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

Эта статья изначально была опубликована в блоге neurotech Africa.

Когда вы слышите «динь», вы чуть не падаете и бежите к телефону в надежде увидеть долгожданное SMS, а потом с грустью обнаруживаете, что это рекламное сообщение от XYZ бренд. Это действительно может раздражать, многие из этих рекламных и спам-СМС продолжают засорять наши почтовые ящики и со временем становятся все хуже, крадя наше драгоценное время и внимание.

Чему мы можем научиться у Gmail?

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

Можем ли мы воспроизвести подход Gmail к SMS? Если да Как?

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

Сбор данных и аннотации

Первым шагом был поиск, сбор и аннотирование данных SMS, которые затем будут использоваться для обучения нашей модели машинного обучения. Сбор данных был выполнен с использованием приложения Резервное копирование SMS от нескольких отдельных участников, и вывод данных приложения был хорошо организованные JSON-данные SMS и их детали, как показано в приведенном ниже примере фрагмента.

Затем мы разбили наши данные на отдельные категории в зависимости от контекста и намерения текстовых сообщений, это были категории, с которыми мы пришли;

  1. Рекламный
  2. Уведомление
  3. Сделка
  4. Ставки на спорт
  5. Michezo ya Bahati Nasibu (общие СМС об азартных играх)
  6. Опрос
  7. Проверка
  8. Информационный
  9. Личный
  10. СПАМ

Затем мы экспортировали данные в формат CSV, готовый к обработке. Где данные? Что ж, пока мы не сможем поделиться, потому что некоторые из SMS содержат идентифицируемую личную информацию t, поэтому в настоящее время мы работаем над очисткой и обеспечением хорошего качества данных, а затем поделимся ими через нашу Гитхаб-репозиторий.

Вот так

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

Предварительная обработка данных

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

Как мы видим, у нас есть несколько столбцов в нашем наборе данных, давайте начнем с изучения messageDirection наших данных;

Теперь, когда мы знаем, что собранные данные состоят как из ИСХОДЯЩИХ, так и из ВХОДЯЩИХ SMS, но из-за самой природы нашей задачи , нас в первую очередь интересуют только входящие сообщения, поэтому нам нужно фильтровать только те данные, для которых messageDirection имеет значение INCOMING.

Изучение распространения ярлыков

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

Как видите, большинство наших сообщений имеют пометку «УВЕДОМЛЕНИЕ». Сообщений «СПАМ» меньше всего, что означает, что наш набор данных несбалансирован.

Давайте также удалим дубликаты в наших наборах данных.

Наши данные были сокращены с 3384 до 1920, что означает, что почти 43% наших наборов данных были дубликатами, но это «нормальный» объем данных. для обучения нашей модели.

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

cleaned_incoming_sms.loc[4:9]

Приведенный выше результат нашего чистого-входящего-sms не особенно чистый. Нам нужно приложить дополнительные усилия.

  1. Сделайте все строчными.
  2. Удалите все небуквенно-цифровые символы, такие как «,», «+», «%», «!», «:».
  3. Удалите все номера в текстовых сообщениях.

Теперь наши тексты чисты, поэтому мы можем начать обучение нашей модели.

Обучающая модель машинного обучения

Мы собираемся использовать библиотеку Scikit-learn, чтобы предоставить нам все полезные инструменты для обучения нашей модели. Давайте импортируем необходимые инструменты и обучим нашу модель.

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

pipeline.score(x_test, y_test)
# Output: 0.9380530973451328

Как видите, наша модель имеет оценку 94 % при оценке с использованием тестовых данных, что весьма неплохо.

Тестируем нашу модель

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

import joblib
joblib.dump(pipeline, './pipeline.pkl')

ПРИМЕЧАНИЕ. Прежде чем мы проверим нашу модель с некоторыми сообщениями, мы должны не забыть передать их в функцию clean_text для предварительной обработки нашего текста (удалить небуквенно-цифровые символы, удалить числа и т. д. в тексте, который мы собирается ввести в нашу модель).

Результаты

Мы протестировали нашу модель с 14 сообщениями, которых она никогда раньше не видела. Как видно из приведенного выше результата, большинство сообщений в тестовых данных были сообщениями «СПАМ». Но модель не смогла подобрать большинство из них, так как для обучения нашей модели было мало спам-сообщений.

Кроме того, модель не очень хорошо работала с меткой «ПРОМО», потому что после удаления повторяющихся сообщений в наших наборах данных распределение меток сильно изменилось.

Заключение

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

Спасибо.