- Оригинальный адрес:Email Spam Detector in Python
- Оригинальный автор:George Pipis
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:JohnieXu
- Корректор:luochen1992,zenblo
Спам (Spam) и действующая почта (Ham)
Для модели, обнаруживающей спам, наиболее распространенным применением является создание модели, предсказывающей текст. Исходный набор данных исходит из этого -Spam, который содержит следующую строку заголовка с двумя столбцами, первый столбец — это текст, представляющий содержимое сообщения электронной почты, а второй столбец — это целевое значение спама или ветчины, что означает спам и не спам соответственно.
import pandas as pd
import numpy as np
from sklearn.metrics import roc_auc_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
spam_data = pd.read_csv('spam.csv')
spam_data['target'] = np.where(spam_data['target']=='spam',1,0)
spam_data.head(10)
Выходной результат:
Разделите данные на обучающие и тестовые наборы
X_train, X_test, y_train, y_test = train_test_split(spam_data['text'],
spam_data['target'],
random_state=0)
Построение tf-idf на N-граммах
Использование библиотеки sklearnTfidfVectorizer
преобразовывать и обучать данныеX_train
, без учета частоты встречаемости в словаре данных меньше, чем5данные, позволяяn-граммы принимают значения от 1 до 3(одиночные слова, двойные и тройные).
vect = TfidfVectorizer(min_df=5, ngram_range=(1,3)).fit(X_train) X_train_vectorized = vect.transform(X_train)
Добавить специальные символы
В дополнение к основным символам вам нужно добавить такие вещи, как:номер,Знак доллара,длинаи другие символы, кроме букв, цифр и символов подчеркивания. Давайте напишем функцию для этого:
def add_feature(X, feature_to_add):
"""
Returns sparse feature matrix with added feature.
feature_to_add can also be a list of features.
"""
from scipy.sparse import csr_matrix, hstack
return hstack([X, csr_matrix(feature_to_add).T], 'csr')
# 训练数据
add_length=X_train.str.len()
add_digits=X_train.str.count(r'\d')
add_dollars=X_train.str.count(r'\$')
add_characters=X_train.str.count(r'\W')
X_train_transformed = add_feature(X_train_vectorized , [add_length, add_digits, add_dollars, add_characters])
# 测试数据
add_length_t=X_test.str.len()
add_digits_t=X_test.str.count(r'\d')
add_dollars_t=X_test.str.count(r'\$')
add_characters_t=X_test.str.count(r'\W')
X_test_transformed = add_feature(vect.transform(X_test), [add_length_t, add_digits_t, add_dollars_t, add_characters_t])
Обучите модель логистической регрессии
Далее будет построена модель логистической регрессии и подсчитаны значения тестового набора.AUC
Оценка (Примечание переводчика:AUC относится к площади, ограниченной ROC-кривой и осью координат.Значение обычно находится в диапазоне от 0,5 до 1. Чем ближе к 1, тем более реальными и эффективными являются данные.).
clf = LogisticRegression(C=100, solver='lbfgs', max_iter=1000)
clf.fit(X_train_transformed, y_train)
y_predicted = clf.predict(X_test_transformed)
auc = roc_auc_score(y_test, y_predicted)
auc
Выходной результат:
0.9674528462047772
Получите характерные слова, которые оказывают наибольшее влияние на результаты
Следующее позволит получить лучшие результаты рейтинга для предсказания спама или нет.50характерные слова.
feature_names = np.array(vect.get_feature_names() + ['lengthc', 'digit', 'dollars', 'n_char'])
sorted_coef_index = clf.coef_[0].argsort()
smallest = feature_names[sorted_coef_index[:50]]
largest = feature_names[sorted_coef_index[:-51:-1]]
Топ-50 характерных слов, которые влияют на оценку спама
largest
Выходной результат:
array(['text', 'sale', 'free', 'uk', 'content', 'tones', 'sms', 'reply', 'order', 'won', 'ltd', 'girls', 'ringtone', 'to', 'comes', 'darling', 'this message', 'what you', 'new', 'www', 'co uk', 'std', 'co', 'about the', 'strong', 'txt', 'your', 'user', 'all of', 'choose', 'service', 'wap', 'mobile', 'the new', 'with', 'sexy', 'sunshine', 'xxx', 'this', 'hot', 'freemsg', 'ta', 'waiting for your', 'asap', 'stop', 'll have', 'hello', 'http', 'vodafone', 'of the'], dtype='<U31')
50 самых популярных слов, которые влияют на суждение, как обычные электронные письма
smallest
Выходной результат:
array(['ì_ wan', 'for 1st', 'park', '1st', 'ah', 'wan', 'got', 'say', 'tomorrow', 'if', 'my', 'ì_', 'call', 'opinion', 'days', 'gt', 'its', 'lt', 'lovable', 'sorry', 'all', 'when', 'can', 'hope', 'face', 'she', 'pls', 'lt gt', 'hav', 'he', 'smile', 'wife', 'for my', 'trouble', 'me', 'went', 'about me', 'hey', '30', 'sir', 'lovely', 'small', 'sun', 'silent', 'me if', 'happy', 'only', 'them', 'my dad', 'dad'], dtype='<U31')
Суммировать
Вот практичный и воспроизводимый пример алгоритма обнаружения спама.Алгоритмы прогнозирования, подобные этому, являются одной из основных задач в области обработки естественного языка (NLP). Модель, которую мы разработали выше, имеет показатель AUC 0,97, что довольно хорошо. Эта модель также может продолжать добавлять тестовые характерные слова для более точного определения часто встречающихся характерных слов в спаме и наоборот.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.