Peaaegu igas meili- või sõnumiplatvormis on rämpspostifilter. Filter uurib iga kirja või kirja saabumisel ja liigitab selle rämpspostiks või singiks. Teie postkastis kuvatakse need, mis jäävad singi alla. See lükkab rämpsposti alla kuuluvad kirjad tagasi või kuvab need eraldi.
Saate luua oma rämpspostifiltri, kasutades peamiste teekidena NLTK-d, regexi ja scikit-learni. Mudeli koolitamiseks vajate ka andmestikku.
Teie andmestiku mõistmine
"Rämpsposti klassifikatsioon põhi-NLP jaoks" on vabalt saadaval Kaggle'i andmestik. See sisaldab segu rämpspostist ja toorpostitustest. Sellel on 5796 rida ja 3 veergu.
The KATEGOORIA veerg näitab, kas kiri on rämpspost või sink. Number üks tähistab rämpsposti, null aga sinki. The SÕNUM veerg sisaldab tegelikku toorposti. The FAILI NIMI kategooria on kordumatu sõnumi identifikaator.
Teie keskkonna ettevalmistamine
Järgimiseks peab teil olema a põhiteadmised Pythonist ja masinõpe. Samuti peaks teil olema mugav töötada Google Colab või Jupyteri märkmik.
Jupyteri sülearvuti jaoks liikuge kausta, kuhu soovite projekti paigutada. Looge uus virtuaalne keskkond ja käivitage sellest kaustast Jupyteri märkmik. Google Colab ei vaja seda sammu. Looge uus märkmik kas Google Colabis või Jupyteri märkmikus.
Täielik lähtekood ja andmekogum on saadaval a GitHubi hoidla.
Käivitage vajalike teekide installimiseks järgmine võlukäsk.
!pip install nltk scikit-learn regex numpy pandas
Kasutate:
- NLTK jaoks loomuliku keele töötlemine (NLP).
- scikit-learn masinõppe mudeli loomiseks.
- regex regulaaravaldistega töötamiseks.
- NumPy massiividega töötamiseks.
- Pandad teie andmekogumiga manipuleerimiseks.
Impordi raamatukogud
Importige oma keskkonda installitud teegid. Importige regexi teek re ja scikit-learn kui sklearn.
importida pandad nagu pd
importida tuim nagu np
importida nltk
alates nltk.stem importida WordNetLemmatizer
alates nltk.corpus importida stoppsõnad
importida re
alates sklearn.model_selection importida train_test_split
alates sklearn.metrics importida klassifikatsiooni_aruanne
alates sklearn.feature_extraction.text importida CountVektorizer
alates sklearn.feature_extraction.text importida TfidfVektorizer
Andmestiku töötlemata sõnumite eeltöötlemiseks kasutate NLTK WordNetLemmatizerit ja stopwords mooduleid. Mudeli ehitamisel kasutate imporditud sklearni mooduleid.
Andmete eeltöötlemine
Andmestiku laadimiseks helistage funktsioonile pandas read_csv. Veenduge, et salvestate andmestiku oma projektiga samasse kataloogi. Andmestiku visuaalse ülevaate saamiseks kuvage andmestiku esimesed viis rida.
df = pd.read_csv(„/content/Spam Meili toortekst NLP.csv jaoks”)
df.head()
Lohistage andmestiku veerg FILE_NAME. See ei ole rämpsposti klassifitseerimisel kasulik funktsioon.
df.drop('FAILI NIMI', telg=1, inplace=Tõsi)
Kontrollige andmestikust singi ja rämpsposti arvu. See aitab teil hiljem kindlaks teha, kuidas jagada andmeid mudeli koolituse ja testimise jaoks.
df. KATEGOORIA.value_counts()
Laadige korpuse stopsõnad alla NLTK teegist. Stoppsõnad on tavaliselt esinevate sõnade kogum. Eeltöötlus eemaldab need sõnumitest. Laadige ingliskeelsed stoppsõnad ja salvestage need stoppsõna muutujasse.
nltk.download("peasõnad")
stopword = nltk.corpus.stopwords.words('Inglise')
Laadige alla avatud mitmekeelne WordNet. See on ingliskeelsete sõnade ja nende semantiliste tähenduste leksikaalne andmebaas.
nltk.download("omw-1.4")
Laadige Wordneti korpus alla. Kasutate seda teksti klassifitseerimiseks. Looge WordNetLemmatizer() objekt. Kasutate objekti lemmatiseerimise ajal. Lemmatiseerimine on NLP-s kasutatav tehnika sõnade tuletusvormide taandamiseks nende sõnastikutähendusele.
Näiteks: sõna "kassid" vähendamine annab teile "kassi". Sõna pärast lemmatiseerimist muutub lemmaks.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Looge tühi loend, mida kasutate eeltöödeldud sõnumite salvestamiseks.
korpus=[]
Looge silmus, et töödelda kõiki andmestiku veerus MESSAGE olevaid sõnumeid. Eemaldage kõik mittetähtnumbrilised märgid. Teisendage sõnum väiketähtedeks. Jagage tekst sõnadeks. Eemaldage stoppsõnad ja lemmatiseerige sõnad. Teisendage sõnad tagasi lauseteks. Lisage eeltöödeldud sõnum korpuse loendisse.
jaoks i sisse ulatus (len (df)):
# eemaldab kõik mittetähtnumbrilised märgid
sõnum = re.sub(„[^a-zA-Z0-9]”, ' ', df['SÕNUM'][i])# sõnumi muutmine väiketähtedeks
sõnum = sõnum.alumine()# lause jagamine sõnadeks lemmatiseerimiseks
sõnum = sõnum.split()# stopsõnade eemaldamine ja lemmatiseerimine
sõnum = [lemmatizer.lemmatize (sõna) jaoks sõna sisse sõnum
kui sõna mittesisse set (stopwords.words('Inglise'))]# Sõnade teisendamine lauseteks
sõnum = ' '.join (sõnum)
# Eeltöödeldud sõnumi lisamine korpuse loendisse
corpus.append (sõnum)
Selle ringi jooksmiseks kulub umbes viis minutit. Lemmatiseerimise ja stoppsõnade eemaldamise samm võtab suurema osa ajast. Olete nüüd oma andmed eeltöödeldud.
Funktsioonide projekteerimine, kasutades sõnapakimudelit vs TF-IDF tehnikat
Funktsioonide projekteerimine on töötlemata andmete funktsioonide teisendamine uuteks masinõppemudelite jaoks sobivateks funktsioonideks.
Kotti-sõnamudel
Sõnakoti mudel kujutab tekstiandmeid dokumendis esinevate sõnade sagedusjaotusena. See on lihtsalt see, mitu korda sõna dokumendis esineb.
Kasutage scikit-learni klassi CountVectorizer, et teisendada tekstiandmed arvvektoriteks. Sobitage eeltöödeldud sõnumite korpus ja muutke korpus hõredaks maatriksiks.
# Võtke 2500 parimat funktsiooni
cv = CountVectorizer (max_funktsioonid=2500, ngram_range=(1,3))
X = cv.fit_transform (korpus).toarray()
y = df['CATEGORY']
Jagage teisendatud andmed treening- ja testikomplektideks. Kasutage kakskümmend protsenti andmetest testimiseks ja kaheksakümmend protsenti koolituseks.
x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, juhuslik_olek=1, stratify=y)
Sõnakoti mudel klassifitseerib andmekogus olevad sõnumid õigesti. Kuid see ei toimi hästi teie enda sõnumite klassifitseerimisel. See ei võta arvesse sõnumite semantilist tähendust. Kasutage seda tehnikat ainult andmekogumis olevate sõnumite klassifitseerimiseks.
TF-IDF tehnika
Termini sagedus-pöördvõrdeline dokumendisagedus (TF-IDF) toimib, määrates dokumendis sõnadele kaalu nende esinemise sageduse alusel. TF-IDF annab sõnad, mis esinevad sageli dokumendis, kuid on korpuses haruldased, suurema kaaluga. See võimaldab masinõppe algoritmidel teksti tähendust paremini mõista.
tf = TfidfVektorizer (ngram_range=(1,3), max_funktsioonid=2500)
X = tf.fit_transform (korpus).toarray()
x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, juhuslik_olek=1, stratify=y)
Sõnumitest semantilise tähenduse eraldamiseks ja oma sõnumite klassifitseerimiseks kasutage TF-IDF-i.
Oma mudeli loomine ja väljaõpe
Alustage Naive Bayesi mudeli loomisest ja initsialiseerimisest, kasutades klassi scikit-learn MultinomialNB.
mudel = MultinomialNB()
Sobitage treeningandmed, võimaldades mudelil treenida treeningkomplektil:
model.fit (x_train, y_train)
Seejärel tehke ennustusmeetodil ennustusi treening- ja testimiskomplektide kohta.
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
Need ennustused aitavad teil oma mudelit hinnata.
Mudeli hindamine
Hinnake oma mudeli toimivust, kasutades scikit-learni funktsiooni classification_report. Edastage treeningkomplekti ennustused ja tegelikud treeningkomplekti sildid sisendina. Tehke sama testikomplekti jaoks.
print (classification_report (train_pred, y_train))
print (classification_report (test_pred, y_test))
Mida suurem on mõlema klassi täpsus, meeldejäävus ja täpsus, seda parem on mudel.
Enda sõnumite klassifitseerimise tulemused
Teisendage sõnum TF-IDF tehnikat kasutades vektoriks. Kasutage mudelit, et ennustada, kas sõnum on rämpspost või sink, ja seejärel kuvage see ennustus ekraanil.
print("Ennustan...")
sõnum = ["Võitsite 10 000 dollarit, palun esitage oma konto
üksikasjad, et saaksime raha üle kanda"]
message_vector = tf.transform (sõnum)
kategooria = mudel.prognoos (message_vector)
print("Sõnum on", "spämm"kui kategooria == 1muidu"ei ole rämpspost")
Asenda sõnum enda omaga.
Väljund on järgmine:
Mudel võib klassifitseerida uued nähtamatud kirjad rämpspostiks või singiks.
Rakenduste rämpsposti klassifikatsiooni väljakutse
Rakendustes rämpsposti klassifitseerimise peamine väljakutse on kirjade vale klassifitseerimine. Masinõppe mudelid ei ole alati õiged. Nad võivad liigitada rämpsposti singiks ja vastupidi. Kui sink liigitatakse rämpspostiks, võib programm eemaldada e-kirjad kasutaja postkastist, mistõttu nad jäävad olulistest kirjadest ilma.