Има спам филтър в почти всяка платформа за изпращане на имейли или съобщения. Филтърът проверява всяка поща или съобщение, когато пристигне, и го класифицира като спам или хам. Във входящата ви кутия се показват тези, които попадат в категорията шунка. Той отхвърля или показва отделно съобщенията, които попадат в спам.
Можете да създадете свой собствен спам филтър, като използвате NLTK, regex и scikit-learn като основни библиотеки. Ще ви трябва и набор от данни, за да обучите вашия модел.
Разбиране на вашия набор от данни
„Класификация на нежелана поща за основно НЛП“ е свободно достъпна Набор от данни на Kaggle. Съдържа смесица от спам и хам необработени имейл съобщения. Има 5796 реда и 3 колони.
The КАТЕГОРИЯ колона показва дали съобщението е спам или хам. Номер едно представлява спам, докато нула представлява шунка. The СЪОБЩЕНИЕ колоната съдържа действителната необработена поща. The
ИМЕ НА ФАЙЛ категория е уникален идентификатор на съобщение.Подготовка на вашата среда
За да следвате, ще трябва да имате a основно разбиране на Python и машинно обучение. Трябва също да ви е удобно да работите с Google Colab или тетрадка на Юпитер.
За Jupyter Notebook отидете до папката, в която искате да се намира проектът. Създайте нова виртуална среда и стартирайте Jupyter Notebook от тази папка. Google Colab не се нуждае от тази стъпка. Създайте нов бележник в Google Colab или Jupyter Notebook.
Пълният изходен код и наборът от данни са налични в a GitHub хранилище.
Изпълнете следната магическа команда, за да инсталирате необходимите библиотеки.
!pip инсталирайте nltk scikit-learn regex numpy pandas
Вие ще използвате:
- NLTK за обработка на естествен език (НЛП).
- scikit-learn за създаване на модел за машинно обучение.
- regex за работа с регулярни изрази.
- NumPy за работа с масиви.
- Pandas за манипулиране на вашия набор от данни.
Импортиране на библиотеки
Импортирайте библиотеките, които сте инсталирали във вашата среда. Импортирайте библиотеката с регулярни изрази като re и scikit-learn като sklearn.
импортиране панди като пд
импортиране numpy като np
импортиране nltk
от nltk.stem импортиране WordNetLemmatizer
от nltk.корпус импортиране стоп думи
импортиране повторно
от sklearn.model_selection импортиране train_test_split
от sklearn.metrics импортиране класификационен_доклад
от sklearn.feature_extraction.text импортиране CountVectorizer
от sklearn.feature_extraction.text импортиране TfidfVectorizer
Ще използвате модулите WordNetLemmatizer и stopwords от NLTK за предварителна обработка на необработените съобщения в набора от данни. Ще използвате импортирани sklearn модули по време на изграждане на модел.
Предварителна обработка на данните
Извикайте функцията pandas read_csv, за да заредите набора от данни. Уверете се, че съхранявате набора от данни в същата директория като вашия проект. Покажете първите пет реда от набора от данни, за да получите визуална представа за набора от данни.
df = pd.read_csv('/content/Спам имейл необработен текст за NLP.csv')
df.head()
Премахнете колоната FILE_NAME от набора от данни. Това не е полезна функция за класифициране на спам.
df.drop('ИМЕ НА ФАЙЛ', ос=1, inplace=Вярно)
Проверете за броя на радиолюбителите и спама в набора от данни. Това по-късно ще ви помогне да определите как да разделите данните за обучение и тестване на модела.
df. CATEGORY.value_counts()
Изтеглете спиращите думи на корпуса от библиотеката на NLTK. Стоп думите са набор от често срещани думи. Предварителната обработка ги премахва от съобщенията. Заредете английските стоп думи и ги запазете в променлива за стоп думи.
nltk.изтегляне("стоп думи")
stopword = nltk.corpus.stopwords.words('Английски')
Изтеглете отворения многоезичен WordNet. Това е лексикална база данни от английски думи и техните семантични значения.
nltk.изтегляне('omw-1.4')
Изтеглете wordnet корпуса. Ще го използвате за класификация на текст. Създайте екземпляр на WordNetLemmatizer() обект. Ще използвате обекта по време на лематизацията. Лематизацията е техника, използвана в НЛП за редуциране на деривационните форми на думите до тяхното речниково значение.
Например: Намаляването на думата „котки“ ще ви даде „котка“. Дума след лематизация става лема.
nltk.изтегляне("wordnet")
lemmatizer = WordNetLemmatizer()
Създайте празен списък, който ще използвате за съхраняване на предварително обработените съобщения.
корпус=[]
Създайте for цикъл за обработка на всяко съобщение в колоната MESSAGE на набора от данни. Премахнете всички знаци, които не са буквено-цифрови. Преобразувайте съобщението в малки букви. Разделете текста на думи. Премахнете стоп думите и лематизирайте думите. Преобразувайте думите обратно в изречения. Добавете предварително обработеното съобщение в списъка с корпуси.
за аз в диапазон (len (df)):
# премахване на всички небуквено-цифрови знаци
съобщение = re.sub('[^a-zA-Z0-9]', ' ', df[„СЪОБЩЕНИЕ“][i])# конвертиране на съобщението в малки букви
съобщение = message.lower()# разделяне на изречението на думи за лематизация
съобщение = message.split()# премахване на стоп думи и лематизиране
съобщение = [lemmatizer.lemmatize (дума) за дума в съобщение
ако дума нев набор (stopwords.words('Английски'))]# Превръщане на думите обратно в изречения
съобщение = ' '.join (съобщение)
# Добавяне на предварително обработеното съобщение към списъка с корпуси
corpus.append (съобщение)
Изпълнението на този цикъл ще отнеме около пет минути. Стъпката на лематизиране и премахване на стоп думите отнема по-голямата част от времето. Вече обработихте данните си предварително.
Инженеринг на функции с помощта на модела на чантата с думи срещу техниката TF-IDF
Инженерингът на функции е процесът на преобразуване на характеристиките на необработените данни в нови функции, подходящи за модели на машинно обучение.
Модел на торба с думи
Моделът на чантата с думи представя текстовите данни като честотно разпределение на думите, присъстващи в документа. Това е просто как броят пъти, когато една дума се появява в документ.
Използвайте класа CountVectorizer от scikit-learn, за да конвертирате текстовите данни в числови вектори. Поставете корпуса от предварително обработени съобщения и трансформирайте корпуса в разредена матрица.
# Вземете топ 2500 функции
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df[„КАТЕГОРИЯ“]
Разделете трансформираните данни в набори за обучение и тестове. Използвайте двадесет процента от данните за тестване и осемдесет процента за обучение.
x_train, x_test, y_train, y_test = train_test_split(
X, y, тест_размер=0.20, случайно_състояние=1, стратифициране=y)
Моделът на чантата с думи ще класифицира правилно съобщенията в набора от данни. Но няма да се представи добре при класифицирането на вашите собствени съобщения. Не отчита семантичното значение на съобщенията. За да класифицирате само съобщенията в набора от данни, използвайте тази техника.
Техника TF-IDF
Терминът Frequency-Inverse Document Frequency (TF-IDF) работи, като присвоява тегла на думите в документ въз основа на това колко често се появяват. TF-IDF дава думи, които се появяват често в документ, но са редки в корпуса с по-голяма тежест. Това позволява на алгоритмите за машинно обучение да разбират по-добре значението на текста.
tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (corpus).toarray()
x_train, x_test, y_train, y_test = train_test_split(
X, y, тест_размер=0.20, случайно_състояние=1, стратифициране=y)
За да извлечете семантичен смисъл от съобщенията и да класифицирате собствените си съобщения, използвайте TF-IDF.
Създаване и обучение на вашия модел
Започнете със създаване и инициализиране на Naive Bayes модел с помощта на класа scikit-learn MultinomialNB.
модел = MultinomialNB()
Нагласете данните за обучение, позволявайки на модела да тренира върху набора за обучение:
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. Използвайте модела, за да предвидите дали съобщението е спам или хам, след което покажете това предвиждане на екрана.
печат („Предвижда...“)
съобщение = [„Спечелихте 10 000 долара, моля, предоставете акаунта си
подробности, за да можем да преведем парите"]
message_vector = tf.transform (съобщение)
категория = model.predict (message_vector)
печат ("Съобщението е", "спам"ако категория == 1друго"не е спам")
Заменете съобщението със свое.
Резултатът е както следва:
Моделът може да класифицира нови невидяни съобщения като спам или хам.
Предизвикателството пред класификацията на спама в приложенията
Основното предизвикателство пред класификацията на нежелана поща в приложенията е погрешната класификация на съобщенията. Моделите на машинно обучение не винаги са правилни. Те могат да класифицират спама като хам и обратното. В случай на класифициране на ham като спам, програмата може да премахне имейл от входящата кутия на потребителя, което ги кара да пропуснат важни съобщения.