Почти на каждой платформе для электронной почты или обмена сообщениями есть спам-фильтр. Фильтр проверяет каждую почту или сообщение по мере их поступления и классифицирует их как спам или нежелательную почту. В вашем почтовом ящике отображаются те, которые попадают под ветчину. Он отклоняет или отображает отдельно сообщения, попадающие в спам.
Вы можете создать свой собственный спам-фильтр, используя NLTK, regex и scikit-learn в качестве основных библиотек. Вам также понадобится набор данных для обучения вашей модели.
Понимание вашего набора данных
«Классификация спама для Основ НЛП» находится в свободном доступе. Набор данных Kaggle. Он содержит смесь спама и необработанных почтовых сообщений. Он имеет 5796 строк и 3 столбца.
КАТЕГОРИЯ столбец указывает, является ли сообщение спамом или ветчиной. Номер один представляет собой спам, а ноль — ветчину.
СООБЩЕНИЕ столбец содержит фактическую необработанную почту. ИМЯ ФАЙЛА категория — уникальный идентификатор сообщения.Подготовка вашей среды
Чтобы следовать, вам нужно иметь базовое понимание 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еще"не спам")
Замените сообщение своим.
Результат выглядит следующим образом:
Модель может классифицировать новые непросмотренные сообщения как спам или ветчину.
Проблема классификации спама в приложениях
Основной проблемой классификации спама в приложениях является неправильная классификация сообщений. Модели машинного обучения не всегда корректны. Они могут классифицировать спам как ветчину и наоборот. В случае классификации ветчины как спама программа может удалить электронную почту из почтового ящика пользователя, из-за чего он пропустит важные сообщения.