Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Има спам филтър в почти всяка платформа за изпращане на имейли или съобщения. Филтърът проверява всяка поща или съобщение, когато пристигне, и го класифицира като спам или хам. Във входящата ви кутия се показват тези, които попадат в категорията шунка. Той отхвърля или показва отделно съобщенията, които попадат в спам.

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

Разбиране на вашия набор от данни

„Класификация на нежелана поща за основно НЛП“ е свободно достъпна Набор от данни на Kaggle. Съдържа смесица от спам и хам необработени имейл съобщения. Има 5796 реда и 3 колони.

The КАТЕГОРИЯ колона показва дали съобщението е спам или хам. Номер едно представлява спам, докато нула представлява шунка. The СЪОБЩЕНИЕ колоната съдържа действителната необработена поща. The

instagram viewer
ИМЕ НА ФАЙЛ категория е уникален идентификатор на съобщение.

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

За да следвате, ще трябва да имате 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 като спам, програмата може да премахне имейл от входящата кутия на потребителя, което ги кара да пропуснат важни съобщения.