Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

Filtar neželjene pošte postoji u gotovo svakoj platformi za slanje e-pošte ili poruka. Filtar pregledava svaku poštu ili poruku kako pristigne i klasificira ih kao spam ili kao neželjenu poštu. U vašoj pristigloj pošti prikazani su oni koji potpadaju pod šunku. Odbacuje ili zasebno prikazuje poruke koje spadaju u spam.

Možete izraditi vlastiti filter neželjene pošte koristeći NLTK, regex i scikit-learn kao glavne biblioteke. Također će vam trebati skup podataka za obuku vašeg modela.

Razumijevanje vašeg skupa podataka

“Klasifikacija neželjene pošte za osnovni NLP” je besplatno dostupna Kaggle skup podataka. Sadrži mješavinu neželjene pošte i šunke sirove e-pošte. Ima 5796 redaka i 3 stupca.

The KATEGORIJA stupac označava je li poruka spam ili ham. Broj jedan predstavlja spam dok nula predstavlja šunku. The PORUKA stupac sadrži stvarnu neobrađenu poštu. The NAZIV DATOTEKE kategorija je jedinstveni identifikator poruke.

Priprema vaše okoline

Da biste ga pratili, morat ćete imati osnovno razumijevanje Pythona i strojno učenje. Također bi vam trebalo biti ugodno raditi s Google Colab ili Jupyter Notebook.

Za Jupyter Notebook idite do mape u kojoj želite da se nalazi projekt. Stvorite novo virtualno okruženje i pokrenite Jupyter Notebook iz ove mape. Google Colab ne treba ovaj korak. Stvorite novu bilježnicu u Google Colabu ili Jupyter Notebooku.

Puni izvorni kod i skup podataka dostupni su u a GitHub spremište.

Pokrenite sljedeću čarobnu naredbu da instalirate potrebne biblioteke.

!pip instaliraj nltk scikit-learn regex numpy pandas

Koristit ćete:

  • NLTK za obrada prirodnog jezika (NLP).
  • scikit-learn za stvaranje modela strojnog učenja.
  • regex za rad s regularnim izrazima.
  • NumPy za rad s nizovima.
  • Pande za manipuliranje vašim skupom podataka.

Uvoz knjižnica

Uvezite biblioteke koje ste instalirali u svoje okruženje. Uvezite regex biblioteku kao re i scikit-learn kao sklearn.

uvoz pande kao pd
uvoz numpy kao np
uvoz nltk
iz nltk.stabljika uvoz WordNetLemmatizer
iz nltk.korpus uvoz zaustavne riječi
uvoz ponovno
iz sklearn.model_selection uvoz train_test_split
iz sklearn.metrika uvoz klasifikacijski_izvješće
iz sklearn.feature_extraction.text uvoz CountVectorizer
iz sklearn.feature_extraction.text uvoz TfidfVektorizator

Koristit ćete module WordNetLemmatizer i stopwords iz NLTK-a za prethodnu obradu neobrađenih poruka u skupu podataka. Tijekom izgradnje modela koristit ćete uvezene sklearn module.

Predobrada podataka

Pozovite funkciju pandas read_csv za učitavanje skupa podataka. Provjerite jeste li pohranili skup podataka u isti direktorij kao i vaš projekt. Prikažite prvih pet redaka skupa podataka da biste dobili vizualni prikaz skupa podataka.

df = pd.read_csv('/content/Spam Email neobrađeni tekst za NLP.csv')
df.head()

Ispustite stupac FILE_NAME skupa podataka. To nije korisna značajka za klasifikaciju neželjene pošte.

df.drop('NAZIV DATOTEKE', os=1, na mjestu=Pravi)

Provjerite broj ham i neželjene pošte u skupu podataka. To će vam kasnije pomoći da odredite kako podijeliti podatke za obuku modela i testiranje.

df. CATEGORY.value_counts()

Preuzmite stopwords korpusa iz NLTK biblioteke. Zaustavne riječi su skup riječi koje se često pojavljuju. Predprocesiranje ih uklanja iz poruka. Učitajte engleske zaustavne riječi i pohranite ih u varijablu zaustavne riječi.

nltk.preuzmi('stopwords')
stopword = nltk.corpus.stopwords.words('Engleski')

Preuzmite otvoreni višejezični WordNet. To je leksička baza podataka engleskih riječi i njihovih semantičkih značenja.

nltk.preuzmi('omw-1.4')

Preuzmite wordnet korpus. Koristit ćete ga za klasifikaciju teksta. Instancirajte objekt WordNetLemmatizer(). Objekt ćete koristiti tijekom lematizacije. Lematizacija je tehnika koja se koristi u NLP-u za reduciranje derivacijskih oblika riječi na njihovo značenje iz rječnika.

Na primjer: smanjenjem riječi "mačke" dobit ćete "mačka". Riječ nakon lematizacije postaje lema.

nltk.preuzmi('wordnet')
lematizator = WordNetLemmatizer()

Napravite prazan popis koji ćete koristiti za pohranjivanje prethodno obrađenih poruka.

korpus=[]

Stvorite for petlju za obradu svake poruke u stupcu MESSAGE skupa podataka. Uklonite sve znakove koji nisu alfanumerički. Pretvorite poruku u mala slova. Podijeli tekst na riječi. Uklonite zaustavne riječi i lematizirajte riječi. Pretvorite riječi natrag u rečenice. Dodajte prethodno obrađenu poruku u popis korpusa.

za ja u raspon (len (df)):
# uklanjanje svih znakova koji nisu alfanumerički
poruka = ​​re.sub('[^a-zA-Z0-9]', ' ', df['PORUKA'][i])

# pretvaranje poruke u mala slova
poruka = ​​message.lower()

# rastavljanje rečenice na riječi radi lematizacije
poruka = ​​poruka.split()

# uklanjanje zaustavnih riječi i lematiziranje
poruka = ​​[lematizator.lematizirati (riječ) za riječ u poruka
ako riječ neu set (stopwords.words('Engleski'))]

# Pretvaranje riječi natrag u rečenice
poruka = ' '.join (poruka)

# Dodavanje unaprijed obrađene poruke popisu korpusa
corpus.append (poruka)

Ova će petlja trajati oko pet minuta. Korak lematiziranja i uklanjanja zaustavnih riječi oduzima većinu vremena. Sada ste prethodno obradili svoje podatke.

Inženjerstvo značajki korištenjem modela vrećice riječi nasuprot TF-IDF tehnike

Inženjering značajki proces je pretvaranja značajki neobrađenih podataka u nove značajke prikladne za modele strojnog učenja.

Model vrećice riječi

Model bag-of-words predstavlja tekstualne podatke kao frekvencijsku distribuciju riječi prisutnih u dokumentu. To je jednostavno koliko se puta riječ pojavljuje u dokumentu.

Koristite klasu CountVectorizer iz scikit-learn za pretvaranje tekstualnih podataka u numeričke vektore. Uklopiti korpus prethodno obrađenih poruka i transformirati korpus u rijetku matricu.

# Uzmite 2500 najboljih značajki 
cv = CountVectorizer (max_features=2500, ngram_raspon=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORIJA']

Podijelite transformirane podatke u skupove za obuku i testiranje. Koristite dvadeset posto podataka za testiranje i osamdeset posto za obuku.

x_train, x_test, y_train, y_test = train_test_split(
X, y, veličina_testiranja=0.20, slučajno_stanje=1, stratify=y)

Model bag-of-words ispravno će klasificirati poruke u skupu podataka. Ali neće biti dobar u klasificiranju vlastitih poruka. Ne uzima u obzir semantičko značenje poruka. Da biste samo klasificirali poruke u skupu podataka, koristite ovu tehniku.

TF-IDF tehnika

Termin Frequency-Inverse Document Frequency (TF-IDF) funkcionira dodjeljivanjem težine riječima u dokumentu na temelju toga koliko se često pojavljuju. TF-IDF daje riječi koje se često pojavljuju u dokumentu, ali su rijetke u korpusu veće težine. To omogućuje algoritmima strojnog učenja da bolje razumiju značenje teksta.

tf = TfidfVectorizer (ngram_range=(1,3), max_značajke=2500)
X = tf.fit_transform (corpus).toarray()

x_train, x_test, y_train, y_test = train_test_split(
X, y, veličina_testiranja=0.20, slučajno_stanje=1, stratify=y)

Za izdvajanje semantičkog značenja iz poruka i klasificiranje vlastitih poruka koristite TF-IDF.

Izrada i obuka vašeg modela

Započnite stvaranjem i inicijalizacijom Naive Bayesovog modela pomoću klase scikit-learn MultinomialNB.

model = MultinomalNB()

Prilagodite podatke o vježbanju, omogućujući modelu da vježba na setu za vježbanje:

model.fit (x_train, y_train)

Zatim napravite predviđanja na skupovima za obuku i testiranje pomoću metode predviđanja.

train_pred = model.predict (x_train)
test_pred = model.predict (x_test)

Ova predviđanja će vam pomoći da procijenite svoj model.

Evaluacija modela

Ocijenite izvedbu svog modela pomoću funkcije classification_report tvrtke scikit-learn. Proslijedite predviđanja skupa za vježbanje i stvarne oznake skupa za vježbanje kao ulaz. Učinite isto za testni set.

ispis (classification_report (train_pred, y_train))
ispis (classification_report (test_pred, y_test))

Što su veća preciznost, prisjećanje i točnost za obje klase, to je model bolji.

Rezultati klasificiranja vlastitih poruka

Pretvorite poruku u vektor koristeći TF-IDF tehniku. Upotrijebite model da predvidite je li poruka spam ili ham, a zatim prikažite to predviđanje na zaslonu.

ispis("Predviđanje...")

poruka = ​​["Osvojili ste 10 000 dolara, molimo navedite svoj račun
pojedinosti, kako bismo mogli prenijeti novac"]

message_vector = tf.transform (poruka)
kategorija = model.predict (message_vector)
ispis("Poruka je", "spam"ako kategorija == 1drugo"nije spam")

Zamijenite poruku svojom.

Izlaz je sljedeći:

Model može klasificirati nove nepregledane poruke kao spam ili ham.

Izazov s klasifikacijom neželjene pošte u aplikacijama

Glavni izazov s kojim se suočava klasifikacija neželjene pošte u aplikacijama je pogrešna klasifikacija poruka. Modeli strojnog učenja nisu uvijek točni. Spam mogu klasificirati kao ham i obrnuto. U slučaju klasificiranja ham-a kao neželjene pošte, program može ukloniti e-poštu iz korisnikove pristigle pošte, uzrokujući da propusti važne poruke.