Există un filtru de spam în aproape fiecare platformă de e-mail sau mesagerie. Filtrul examinează fiecare e-mail sau mesaj pe măsură ce sosește și îl clasifică fie ca spam, fie ca ham. Mesaje primite le afișează pe cele care se încadrează sub șuncă. Respinge sau afișează separat mesajele care se încadrează în spam.
Vă puteți crea propriul filtru de spam folosind NLTK, regex și scikit-learn ca biblioteci principale. Veți avea nevoie și de un set de date pentru a vă antrena modelul.
Înțelegerea setului dvs. de date
„Clasificarea spamului pentru NLP de bază” este disponibil gratuit Setul de date Kaggle. Conține un amestec de mesaje spam și ham. Are 5.796 de rânduri și 3 coloane.
The CATEGORIE coloana indică dacă un mesaj este spam sau ham. Numărul unu reprezintă spam, în timp ce zero reprezintă șuncă. The MESAJ coloana conține e-mailul brut real. The NUME DE FIȘIER categorie este un identificator unic de mesaj.
Pregătiți-vă mediul
Pentru a urma, va trebui să aveți un înțelegerea de bază a Python și învățarea automată. De asemenea, ar trebui să vă simțiți confortabil să lucrați cu Google Colab sau Jupyter Notebook.
Pentru Jupyter Notebook, navigați la folderul în care doriți să locuiască proiectul. Creați un nou mediu virtual și rulați Jupyter Notebook din acest folder. Google Colab nu are nevoie de acest pas. Creați un blocnotes nou în Google Colab sau Jupyter Notebook.
Codul sursă complet și setul de date sunt disponibile în a Depozitul GitHub.
Rulați următoarea comandă magică pentru a instala bibliotecile necesare.
!pip instalează nltk scikit-learn regex numpy panda
Vei folosi:
- NLTK pentru procesarea limbajului natural (NLP).
- scikit-learn pentru a crea modelul de învățare automată.
- regex pentru lucrul cu expresii regulate.
- NumPy pentru lucrul cu matrice.
- Pandas pentru a vă manipula setul de date.
Import biblioteci
Importați bibliotecile pe care le-ați instalat în mediul dvs. Importați biblioteca regex ca re și scikit-learn ca sklearn.
import panda la fel de pd
import numpy la fel de np
import nltk
din nltk.stem import WordNetLemmatizer
din nltk.corpus import cuvinte oprite
import re
din sklearn.model_selection import train_test_split
din sklearn.metrics import raport_clasificare
din sklearn.feature_extraction.text import CountVectorizer
din sklearn.feature_extraction.text import TfidfVectorizer
Veți folosi modulele WordNetLemmatizer și stopwords de la NLTK pentru a preprocesa mesajele brute din setul de date. Veți folosi module sklearn importate în timpul construirii modelului.
Preprocesarea datelor
Apelați funcția pandas read_csv pentru a încărca setul de date. Asigurați-vă că stocați setul de date în același director ca și proiectul dvs. Afișați primele cinci rânduri ale setului de date pentru a obține o imagine vizuală a setului de date.
df = pd.read_csv(„/content/Spam E-mail text brut pentru NLP.csv”)
df.head()
Aruncă coloana FILE_NAME a setului de date. Nu este o caracteristică utilă pentru clasificarea spam-ului.
df.drop('NUME DE FIȘIER', axa=1, inplace=Adevărat)
Verificați numărul de mesaje ham și spam în setul de date. Acest lucru vă va ajuta ulterior să determinați cum să împărțiți datele pentru antrenamentul și testarea modelului.
df. CATEGORY.value_counts()
Descărcați cuvintele oprite din corpus din biblioteca NLTK. Cuvintele oprite sunt un set de cuvinte care apar frecvent. Preprocesarea le elimină din mesaje. Încărcați cuvintele oprite în limba engleză și stocați-le într-o variabilă de cuvinte oprite.
nltk.download(„cuvinte oprite”)
stopword = nltk.corpus.stopwords.words('Engleză')
Descărcați WordNet multilingv deschis. Este o bază de date lexicală a cuvintelor engleze și a semnificațiilor lor semantice.
nltk.download(„omw-1.4”)
Descărcați corpus wordnet. Îl vei folosi pentru clasificarea textului. Instanțiați un obiect WordNetLemmatizer(). Veți folosi obiectul în timpul lematizării. Lematizarea este o tehnică folosită în NLP pentru a reduce formele derivate ale cuvintelor la sensul lor de dicționar.
De exemplu: reducerea cuvântului „pisici” vă va da „pisică”. Un cuvânt după lematizare devine o lemă.
nltk.download(„wordnet”)
lematizer = WordNetLemmatizer()
Creați o listă goală pe care o veți folosi pentru a stoca mesajele preprocesate.
corpus=[]
Creați o buclă for pentru a procesa fiecare mesaj din coloana MESAJ a setului de date. Eliminați toate caracterele non-alfanumerice. Convertiți mesajul în minuscule. Împărțiți textul în cuvinte. Eliminați cuvintele oprite și lematizați cuvintele. Convertiți cuvintele înapoi în propoziții. Adăugați mesajul preprocesat în lista de corpus.
pentru i în interval (len (df)):
# eliminarea tuturor caracterelor non-alfanumerice
mesaj = re.sub(„[^a-zA-Z0-9]”, ' ', df['MESAJ'][i])# convertirea mesajului în minuscule
mesaj = message.lower()# împărțirea propoziției în cuvinte pentru lematizare
mesaj = message.split()# eliminarea cuvintelor oprite și lematizarea
mesaj = [lemmatizer.lematize (cuvânt) pentru cuvânt în mesaj
dacă cuvânt nuîn set (stopwords.words('Engleză'))]# Convertirea cuvintelor înapoi în propoziții
mesaj = ' '.join (mesaj)
# Adăugarea mesajului preprocesat la lista de corpus
corpus.append (mesaj)
Această buclă va dura aproximativ cinci minute. Pasul de lematizare și eliminare a cuvintelor oprite durează cea mai mare parte a timpului. Acum ați preprocesat datele dvs.
Ingineria caracteristicilor folosind modelul Bag-of-Words vs Tehnica TF-IDF
Ingineria caracteristicilor este procesul de conversie a caracteristicilor de date brute în caracteristici noi potrivite pentru modelele de învățare automată.
Modelul sacului de cuvinte
Modelul sac de cuvinte reprezintă datele text ca o distribuție de frecvență a cuvintelor prezente în document. Acesta este, pur și simplu, de câte ori apare un cuvânt într-un document.
Utilizați clasa CountVectorizer de la scikit-learn pentru a converti datele text în vectori numerici. Potriviți corpus de mesaje preprocesate și transformați corpusul într-o matrice rară.
# Luați primele 2500 de funcții
cv = CountVectorizer (max_features=2500, interval_ngram=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['CATEGORIE']
Împărțiți datele transformate în seturi de instruire și de testare. Folosiți douăzeci la sută din date pentru testare și optzeci la sută pentru antrenament.
x_train, x_test, y_train, y_test = tren_test_split(
X, y, test_size=0.20, stare_aleatorie=1, stratificare=y)
Modelul sac de cuvinte va clasifica corect mesajele din setul de date. Dar nu va funcționa bine în clasificarea propriilor mesaje. Nu ține cont de sensul semantic al mesajelor. Pentru a clasifica numai mesajele din setul de date, utilizați această tehnică.
Tehnica TF-IDF
Frecvența termenului - Frecvența inversă a documentului (TF-IDF) funcționează prin atribuirea de ponderi cuvintelor dintr-un document în funcție de frecvența cu care apar. TF-IDF oferă cuvinte care apar frecvent într-un document, dar sunt rare în corpus cu greutate mai mare. Acest lucru permite algoritmilor de învățare automată să înțeleagă mai bine sensul textului.
tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (corpus).toarray()
x_train, x_test, y_train, y_test = tren_test_split(
X, y, test_size=0.20, stare_aleatorie=1, stratificare=y)
Pentru a extrage semnificația semantică din mesaje și pentru a vă clasifica propriile mesaje, utilizați TF-IDF.
Crearea și antrenamentul modelului dvs
Începeți prin a crea și inițializa un model Naive Bayes folosind clasa scikit-learn MultinomialNB.
model = MultinomialNB()
Potriviți datele de antrenament, permițând modelului să se antreneze pe setul de antrenament:
model.fit (x_train, y_train)
Apoi faceți predicții cu privire la seturile de antrenament și testare folosind metoda predicției.
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
Aceste predicții vă vor ajuta să vă evaluați modelul.
Evaluarea modelului
Evaluați performanța modelului dvs. folosind funcția classification_report de la scikit-learn. Transmiteți predicțiile setului de antrenament și etichetele setului de antrenament real ca intrare. Faceți același lucru pentru setul de testare.
imprimare (raport_clasificare (train_pred, y_train))
imprimare (raport_clasificare (test_pred, y_test))
Cu cât este mai mare precizia, reamintirea și acuratețea pentru ambele clase, cu atât modelul este mai bun.
Rezultatele clasificării propriilor mesaje
Transformați mesajul într-un vector folosind tehnica TF-IDF. Folosiți modelul pentru a estima dacă mesajul este spam sau ham, apoi afișați acea predicție pe ecran.
imprimare(„Previziunea...”)
mesaj = [„Ați câștigat 10000 de dolari, vă rugăm să furnizați contul
detalii, ca să putem transfera banii"]
mesaj_vector = tf.transform (mesaj)
categorie = model.predict (vector_mesaj)
imprimare("Mesajul este", "spam"dacă categorie == 1altfel"nu spam")
Înlocuiește mesajul cu al tău.
Ieșirea este după cum urmează:
Modelul poate clasifica mesajele noi nevăzute ca spam sau ham.
Provocarea cu care se confruntă Clasificarea spamului în aplicații
Principala provocare cu care se confruntă clasificarea spam-ului în aplicații este clasificarea greșită a mesajelor. Modelele de învățare automată nu sunt întotdeauna corecte. Ei pot clasifica spam-ul ca ham și invers. În cazul clasificării ham ca spam, un program poate elimina e-mailul din căsuța de e-mail a utilizatorului, făcându-i să piardă mesaje importante.