Beveik kiekvienoje el. pašto ar pranešimų platformoje yra šiukšlių filtras. Filtras išnagrinėja kiekvieną laišką ar pranešimą, kai jis gaunamas, ir klasifikuoja juos kaip šlamštą arba „ham. Gautuosiuose rodomi tie, kurie patenka po kumpiu. Jis atmeta arba atskirai rodomi pranešimai, kurie patenka į šiukšlių sąrašą.
Galite sukurti savo šlamšto filtrą naudodami NLTK, regex ir scikit-learn kaip pagrindines bibliotekas. Jums taip pat reikės duomenų rinkinio, kad galėtumėte išmokyti savo modelį.
Jūsų duomenų rinkinio supratimas
„Spam Classification for Basic NLP“ yra laisvai prieinama Kaggle duomenų rinkinys. Jame yra šlamšto ir neapdoroto pašto pranešimų mišinys. Jame yra 5 796 eilutės ir 3 stulpeliai.
The KATEGORIJA stulpelyje nurodoma, ar pranešimas yra šlamštas, ar ne. Skaičius vienas reiškia šlamštą, o nulis – kumpį. The PRANEŠIMAS stulpelyje yra faktinis neapdorotas paštas. The
FAILO PAVADINIMAS kategorija yra unikalus pranešimo identifikatorius.Aplinkos paruošimas
Norėdami sekti, turėsite turėti a Pagrindinis Python supratimas ir mašininis mokymasis. Jums taip pat turėtų būti patogu dirbti Google Colab arba Jupyter užrašų knygelė.
Jei naudojate Jupyter Notebook, eikite į aplanką, kuriame norite, kad projektas būtų. Sukurkite naują virtualią aplinką ir paleiskite Jupyter Notebook iš šio aplanko. „Google Colab“ šio veiksmo nereikia. Sukurkite naują bloknotą naudodami „Google Colab“ arba „Jupyter“ užrašų knygelę.
Visą šaltinio kodą ir duomenų rinkinį rasite a GitHub saugykla.
Vykdykite šią magišką komandą, kad įdiegtumėte reikiamas bibliotekas.
!pip install nltk scikit-learn regex numpy pandas
Jūs naudosite:
- NLTK už natūralios kalbos apdorojimas (NLP).
- scikit-learn sukurti mašininio mokymosi modelį.
- reguliarioji išraiška, skirta darbui su reguliariosiomis išraiškomis.
- NumPy darbui su masyvais.
- Pandos, kad galėtų manipuliuoti jūsų duomenų rinkiniu.
Importuoti bibliotekas
Importuokite bibliotekas, kurias įdiegėte savo aplinkoje. Importuokite regex biblioteką kaip re ir scikit-learn kaip sklearn.
importuoti pandos kaip pd
importuoti nelygus kaip np
importuoti nltk
iš nltk.stiebas importuoti WordNetLemmatizer
iš nltk.corpus importuoti stabdymo žodžiai
importuoti re
iš sklearn.model_selection importuoti Train_test_split
iš sklearn.metrics importuoti klasifikavimo_ataskaita
iš sklearn.feature_extraction.text importuoti CountVektorizer
iš sklearn.feature_extraction.text importuoti TfidfVektorizer
Norėdami iš anksto apdoroti neapdorotus pranešimus duomenų rinkinyje, naudosite NLTK WordNetLemmatizer ir stabdymo žodžių modulius. Kurdami modelį naudosite importuotus sklearn modulius.
Išankstinis duomenų apdorojimas
Norėdami įkelti duomenų rinkinį, iškvieskite funkciją pandas read_csv. Įsitikinkite, kad duomenų rinkinį saugote tame pačiame kataloge kaip ir jūsų projektas. Rodyti pirmąsias penkias duomenų rinkinio eilutes, kad gautumėte duomenų rinkinio vaizdą.
df = pd.read_csv(„/content/Spam El. pašto neapdorotas NLP.csv tekstas“)
df.head()
Nuleiskite duomenų rinkinio stulpelį FILE_NAME. Tai nėra naudinga šlamšto klasifikavimo funkcija.
df.drop('FAILO PAVADINIMAS', ašis=1, vietoje =Tiesa)
Patikrinkite, ar duomenų rinkinyje yra kumpio ir šlamšto laiškų. Vėliau tai padės nustatyti, kaip padalinti duomenis modelio mokymui ir testavimui.
df. CATEGORY.value_counts()
Atsisiųskite korpuso stabdymo žodžius iš NLTK bibliotekos. Stopwords yra dažniausiai pasitaikančių žodžių rinkinys. Išankstinis apdorojimas pašalina juos iš pranešimų. Įkelkite angliškus stabdymo žodžius ir išsaugokite juos stabdymo žodžio kintamajame.
nltk.download('stop žodžiai')
stopword = nltk.corpus.stopwords.words('Anglų')
Atsisiųskite atvirą daugiakalbį „WordNet“. Tai leksinė anglų kalbos žodžių ir jų semantinių reikšmių duomenų bazė.
nltk.download("omw-1.4")
Atsisiųskite wordnet korpusą. Jį naudosite teksto klasifikavimui. Sukurkite WordNetLemmatizer() objektą. Objektą naudosite lemmatizacijos metu. Lemmatizacija yra metodas, naudojamas NLP, siekiant sumažinti išvestines žodžių formas iki jų žodyno reikšmės.
Pavyzdžiui: sumažinus žodį „katės“, gausite „katę“. Žodis po lemmatizacijos tampa lema.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Sukurkite tuščią sąrašą, kurį naudosite iš anksto apdorotiems pranešimams saugoti.
korpusas=[]
Sukurkite for ciklą, kad apdorotumėte kiekvieną pranešimą duomenų rinkinio stulpelyje MESSAGE. Pašalinkite visus ne raidinius ir skaitinius simbolius. Konvertuokite pranešimą į mažąsias raides. Padalinkite tekstą į žodžius. Pašalinkite stabdančius žodžius ir lematizuokite žodžius. Paverskite žodžius atgal į sakinius. Pridėkite iš anksto apdorotą pranešimą į korpuso sąrašą.
dėl i in diapazonas (len (df)):
# pašalinami visi ne raidiniai ir skaitiniai simboliai
pranešimas = re.sub(„[^a-zA-Z0-9]“, ' ', df[„PRANEŠIMAS“][i])# konvertuoti pranešimą į mažąsias raides
pranešimas = pranešimas.žemesnis()# sakinio padalijimas į žodžius, kad būtų galima lemtizuoti
pranešimas = pranešimas.split()# stabdžių žodžių pašalinimas ir lematizavimas
pranešimas = [lemmatizer.lemmatize (žodis) dėl žodį in žinutę
jeigu žodį nein set (stopwords.words('Anglų'))]# Žodžių konvertavimas atgal į sakinius
žinutė = ' '.join (pranešimas)
# Iš anksto apdoroto pranešimo įtraukimas į korpuso sąrašą
corpus.append (pranešimas)
Ši kilpa užtruks maždaug penkias minutes. Didžiąją laiko dalį užima lematizavimo ir stabdymo žodžių pašalinimo veiksmas. Dabar iš anksto apdorojote savo duomenis.
Funkcijų inžinerija naudojant maišo žodžių modelį ir TF-IDF techniką
Funkcijų inžinerija yra neapdorotų duomenų funkcijų konvertavimo į naujas funkcijas, tinkamas mašininio mokymosi modeliams, procesas.
„Žodžių maišo“ modelis
Žodžių maišo modelis vaizduoja teksto duomenis kaip dokumente esančių žodžių pasiskirstymą. Paprasčiausiai tai nurodo, kiek kartų žodis pasitaiko dokumente.
Norėdami konvertuoti tekstinius duomenis į skaitinius vektorius, naudokite klasę CountVectorizer iš scikit-learn. Sutalpinkite iš anksto apdorotų pranešimų korpusą ir paverskite korpusą reta matrica.
# Pasinaudokite 2500 geriausių funkcijų
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (korpusas).toarray()
y = df['KATEGORIJA']
Padalinkite transformuotus duomenis į mokymo ir testų rinkinius. Dvidešimt procentų duomenų naudokite bandymams ir aštuoniasdešimt procentų mokymui.
x_train, x_test, y_train, y_test = train_test_split(
X, y, testo_dydis=0.20, atsitiktinė_būsena=1, stratifikuoti = y)
Žodžių maišo modelis teisingai klasifikuos pranešimus duomenų rinkinyje. Tačiau netinkamai skirsite savo žinutes. Jame neatsižvelgiama į semantinę pranešimų reikšmę. Jei norite klasifikuoti tik pranešimus duomenų rinkinyje, naudokite šį metodą.
TF-IDF technika
Termino dažnio ir atvirkštinio dokumento dažnis (TF-IDF) veikia priskirdamas žodžiams svorį dokumente pagal tai, kaip dažnai jie pasirodo. TF-IDF suteikia žodžių, kurie dažnai pasirodo dokumente, bet yra reti korpuse, didesnį svorį. Tai leidžia mašininio mokymosi algoritmams geriau suprasti teksto prasmę.
tf = TfidfVectorizer (ngram_range=(1,3), max_features=2500)
X = tf.fit_transform (korpusas).toarray()
x_train, x_test, y_train, y_test = train_test_split(
X, y, testo_dydis=0.20, atsitiktinė_būsena=1, stratifikuoti = y)
Norėdami išgauti semantinę prasmę iš pranešimų ir klasifikuoti savo pranešimus, naudokite TF-IDF.
Modelio kūrimas ir mokymas
Pradėkite kurdami ir inicijuodami Naive Bayes modelį naudodami scikit-learn MultinomialNB klasę.
modelis = MultinomialNB()
Pritaikykite treniruočių duomenis, kad modelis galėtų treniruotis treniruočių rinkinyje:
modelis.fit (x_train, y_train)
Tada numatykite mokymo ir testavimo rinkinius naudodami numatymo metodą.
train_pred = modelis.prognozuoti (x_train)
test_pred = model.predict (x_test)
Šios prognozės padės įvertinti jūsų modelį.
Modelio įvertinimas
Įvertinkite savo modelio našumą naudodami scikit-learn funkciją classification_report. Perduokite treniruočių rinkinio prognozes ir faktines treniruočių rinkinio etiketes kaip įvestį. Atlikite tą patį su bandymo rinkiniu.
spausdinti (classification_report (train_pred, y_train))
spausdinti (classification_report (test_pred, y_test))
Kuo didesnis abiejų klasių tikslumas, atšaukimas ir tikslumas, tuo geresnis modelis.
Savo žinučių klasifikavimo rezultatai
Paverskite pranešimą į vektorių naudodami TF-IDF techniką. Naudokite modelį, kad nuspėtumėte, ar pranešimas yra šlamštas, ar kumpis, tada parodykite numatymą ekrane.
spausdinti ('Prognozuoti...')
žinutė = [„Jūs laimėjote 10 000 dolerių, pateikite savo sąskaitą
detales, kad galėtume pervesti pinigus"]
message_vector = tf.transform (pranešimas)
kategorija = modelis.prognozuoti (pranešimo_vektorius)
spausdinti ("Žinutė yra", "šlamštas"jeigu kategorija == 1Kitas"ne šlamštas")
Pakeiskite pranešimą savo.
Išvestis yra tokia:
Modelis gali klasifikuoti naujus nematytus pranešimus kaip šlamštą arba kumpį.
Šlamšto klasifikavimo programose iššūkis
Pagrindinis iššūkis, su kuriuo susiduriama klasifikuojant programose nepageidaujamą el. laišką, yra klaidingas pranešimų klasifikavimas. Mašininio mokymosi modeliai ne visada teisingi. Jie gali klasifikuoti šlamštą kaip kumpį ir atvirkščiai. Jei kumpis priskiriamas el. pašto šiukšlėms, programa gali pašalinti el. laiškus iš vartotojo gautųjų, todėl jie gali praleisti svarbius pranešimus.