Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

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

Вы можете создать свой собственный спам-фильтр, используя NLTK, regex и scikit-learn в качестве основных библиотек. Вам также понадобится набор данных для обучения вашей модели.

Понимание вашего набора данных

«Классификация спама для Основ НЛП» находится в свободном доступе. Набор данных Kaggle. Он содержит смесь спама и необработанных почтовых сообщений. Он имеет 5796 строк и 3 столбца.

КАТЕГОРИЯ столбец указывает, является ли сообщение спамом или ветчиной. Номер один представляет собой спам, а ноль — ветчину.

instagram viewer
СООБЩЕНИЕ столбец содержит фактическую необработанную почту. ИМЯ ФАЙЛА категория — уникальный идентификатор сообщения.

Подготовка вашей среды

Чтобы следовать, вам нужно иметь базовое понимание Python и машинное обучение. Вам также должно быть удобно работать с Google Колаб или блокнот Jupyter.

Для Jupyter Notebook перейдите в папку, в которой вы хотите разместить проект. Создайте новую виртуальную среду и запустите Jupyter Notebook из этой папки. Google Colab не требует этого шага. Создайте новый блокнот в Google Colab или Jupyter Notebook.

Полный исходный код и набор данных доступны в Репозиторий GitHub.

Запустите следующую волшебную команду, чтобы установить необходимые библиотеки.

!pip установить nltk scikit-learn regex numpy pandas

Вы будете использовать:

  • НЛТК для обработка естественного языка (НЛП).
  • scikit-learn для создания модели машинного обучения.
  • regex для работы с регулярными выражениями.
  • NumPy для работы с массивами.
  • Pandas для управления вашим набором данных.

Импорт библиотек

Импортируйте библиотеки, которые вы установили в своей среде. Импортируйте библиотеку регулярных выражений как re и scikit-learn как sklearn.

Импортировать панды как пд
Импортировать пустышка как нп
Импортировать нлтк
от nltk.стебель Импортировать WordNetЛемматизатор
от nltk.corpus Импортировать стоп-слова
Импортировать ре
от sklearn.model_selection Импортировать train_test_split
от sklearn.metrics Импортировать классификационный_отчет
от sklearn.feature_extraction.text Импортировать CountVectorizer
от sklearn.feature_extraction.text Импортировать TfidfVectorizer

Вы будете использовать WordNetLemmatizer и модули стоп-слов из NLTK для предварительной обработки необработанных сообщений в наборе данных. Вы будете использовать импортированные модули sklearn при построении модели.

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

Вызовите функцию pandas read_csv, чтобы загрузить набор данных. Убедитесь, что вы храните набор данных в том же каталоге, что и ваш проект. Отобразите первые пять строк набора данных, чтобы получить представление о наборе данных.

дф = pd.read_csv('/content/Spam Email необработанный текст для NLP.csv')
дф.голова()

Удалите столбец FILE_NAME набора данных. Это бесполезная функция для классификации спама.

дф.дроп('ИМЯ ФАЙЛА', ось =1, на месте =Истинный)

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

дф. КАТЕГОРИЯ.value_counts()

Загрузите стоп-слова корпуса из библиотеки NLTK. Стоп-слова — это набор часто встречающихся слов. Предварительная обработка удаляет их из сообщений. Загрузите английские стоп-слова и сохраните их в переменной стоп-слова.

нлтк.скачать(стоп-слова)
стоп-слово = nltk.corpus.stopwords.words('английский')

Загрузите открытый многоязычный WordNet. Это лексическая база данных английских слов и их семантических значений.

нлтк.скачать('омв-1.4')

Загрузите корпус wordnet. Вы будете использовать его для классификации текста. Создайте экземпляр объекта WordNetLemmatizer(). Вы будете использовать объект во время лемматизации. Лемматизация — это метод, используемый в НЛП для приведения производных форм слов к их словарному значению.

Например: сокращение слова «кошки» даст вам «кот». Слово после лемматизации становится леммой.

нлтк.скачать("ворнет")
лемматизатор = WordNetЛемматизатор()

Создайте пустой список, который вы будете использовать для хранения предварительно обработанных сообщений.

корпус=[]

Создайте цикл for для обработки каждого сообщения в столбце MESSAGE набора данных. Удалите все не буквенно-цифровые символы. Преобразуйте сообщение в нижний регистр. Разделите текст на слова. Удалите стоп-слова и лемматизируйте слова. Превратите слова обратно в предложения. Добавить предварительно обработанное сообщение в список корпуса.

для я в диапазон (длина (df)):
# удаление всех не буквенно-цифровых символов
сообщение = re.sub('[^a-zA-Z0-9]', ' ', дф['СООБЩЕНИЕ'][я])

# преобразование сообщения в нижний регистр
сообщение = сообщение.нижний()

# разбиваем предложение на слова для лемматизации
сообщение = сообщение.split()

# удаление стоп-слов и лемматизация
сообщение = [lemmatizer.lemmatize (слово) для слово в сообщение
если слово нетв установить (стоп-слова.слова('английский'))]

# Преобразование слов обратно в предложения
сообщение = ' '.присоединиться (сообщение)

# Добавление препроцессированного сообщения в список корпусов
corpus.append (сообщение)

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

Разработка функций с использованием модели Bag-of-Words и метода TF-IDF

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

Модель мешка слов

Модель мешка слов представляет текстовые данные как частотное распределение слов, присутствующих в документе. Это просто то, сколько раз слово встречается в документе.

Используйте класс CountVectorizer из scikit-learn для преобразования текстовых данных в числовые векторы. Соответствуйте корпусу предварительно обработанных сообщений и преобразуйте корпус в разреженную матрицу.

# Возьмите лучшие 2500 функций 
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (корпус).toarray()
у = дф['КАТЕГОРИЯ']

Разделите преобразованные данные на обучающие и тестовые наборы. Используйте двадцать процентов данных для тестирования и восемьдесят процентов для обучения.

x_train, x_test, y_train, y_test = train_test_split(
Х, у, test_size=0.20, случайное_состояние =1, стратифицировать = у)

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

Техника TF-IDF

Термин «частотно-обратная частота документа» (TF-IDF) работает путем присвоения веса словам в документе в зависимости от того, как часто они появляются. TF-IDF придает словам, которые часто встречаются в документе, но редко встречаются в корпусе, более высокий вес. Это позволяет алгоритмам машинного обучения лучше понимать смысл текста.

tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (корпус).toarray()

x_train, x_test, y_train, y_test = train_test_split(
Х, у, test_size=0.20, случайное_состояние =1, стратифицировать = у)

Для извлечения семантического значения из сообщений и классификации ваших собственных сообщений используйте TF-IDF.

Создание и обучение вашей модели

Начните с создания и инициализации наивной байесовской модели с использованием класса MultinomialNB scikit-learn.

модель = МногочленNB()

Соответствуйте обучающим данным, позволяя модели обучаться на обучающем наборе:

model.fit(x_train, y_train)

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

train_pred = model.predict (x_train)
test_pred = model.predict (x_test)

Эти прогнозы помогут вам оценить вашу модель.

Оценка модели

Оцените производительность вашей модели с помощью функцииclassification_report из scikit-learn. Передайте прогнозы тренировочного набора и фактические метки тренировочного набора в качестве входных данных. Сделайте то же самое для тестового набора.

печать (classification_report (train_pred, y_train))
печать (classification_report (test_pred, y_test))

Чем выше точность, полнота и точность для обоих классов, тем лучше модель.

Результаты классификации ваших собственных сообщений

Преобразуйте сообщение в вектор с помощью метода TF-IDF. Используйте модель, чтобы предсказать, является ли сообщение спамом или ветчиной, а затем отобразите этот прогноз на экране.

Распечатать(«Предсказание...»)

сообщение = ["Вы выиграли 10000 долларов, пожалуйста, укажите свой счет
детали, чтобы мы могли перевести деньги"]

message_vector = tf.transform (сообщение)
категория = model.predict (message_vector)
Распечатать(«Сообщение есть», "спам"если категория == 1еще"не спам")

Замените сообщение своим.

Результат выглядит следующим образом:

Модель может классифицировать новые непросмотренные сообщения как спам или ветчину.

Проблема классификации спама в приложениях

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