Lähes jokaisessa sähköposti- tai viestiympäristössä on roskapostisuodatin. Suodatin tutkii jokaisen postin tai viestin saapuessaan ja luokittelee sen joko roskapostiksi tai kinkuksi. Saapuneet-kansiossasi näkyvät ne, jotka kuuluvat kinkun alle. Se hylkää tai näyttää erikseen roskapostin alle kuuluvat viestit.
Voit luoda oman roskapostisuodattimen käyttämällä NLTK: ta, regexiä ja scikit-learnia pääkirjastoina. Tarvitset myös tietojoukon mallin kouluttamiseen.
Tietojoukkosi ymmärtäminen
"Spam Classification for Basic NLP" on vapaasti saatavilla Kaggle-tietojoukko. Se sisältää sekoituksen roskapostia ja raakapostiviestejä. Siinä on 5 796 riviä ja 3 saraketta.
The KATEGORIA sarake osoittaa, onko viesti roskapostia vai kinkkua. Numero yksi edustaa roskapostia ja nolla kinkkua. The VIESTI sarake sisältää todellisen raakapostin. The TIEDOSTON NIMI luokka on yksilöllinen viestin tunniste.
Ympäristösi valmistelu
Jotta voit seurata mukana, sinulla on oltava a Pythonin perustiedot ja koneoppimista. Sinun tulee myös olla mukava työskennellä Google Colab tai Jupyter-muistikirja.
Jos kyseessä on Jupyter Notebook, siirry kansioon, johon haluat projektin sijoittavan. Luo uusi virtuaaliympäristö ja suorita Jupyter-muistikirja tästä kansiosta. Google Colab ei tarvitse tätä vaihetta. Luo uusi muistikirja joko Google Colabissa tai Jupyter-muistikirjassa.
Täysi lähdekoodi ja tietojoukko ovat saatavilla a GitHub-arkisto.
Asenna tarvittavat kirjastot suorittamalla seuraava taikakomento.
!pip install nltk scikit-learn regex numpy pandas
Käytät:
- NLTK varten luonnollisen kielen käsittely (NLP).
- scikit-learn luoda koneoppimismalli.
- säännöllinen lauseke säännöllisten lausekkeiden kanssa työskentelemiseen.
- NumPy taulukoiden kanssa työskentelemiseen.
- Pandat käsittelemään tietojoukkoasi.
Tuo kirjastot
Tuo ympäristöösi asentamasi kirjastot. Tuo regex-kirjasto uudelleen ja scikit-learn nimellä sklearn.
tuonti pandat kuten pd
tuonti nuhjuinen kuten np
tuonti nltk
alkaen nltk.stem tuonti WordNetLemmatizer
alkaen nltk.corpus tuonti pysäytyssanat
tuonti re
alkaen sklearn.model_selection tuonti train_test_split
alkaen sklearn.metrics tuonti luokitus_raportti
alkaen sklearn.feature_extraction.text tuonti CountVektorizer
alkaen sklearn.feature_extraction.text tuonti TfidfVektorizer
Käytät NLTK: n WordNetLemmatizer- ja stopwords-moduuleja datajoukon raakaviestien esikäsittelyyn. Käytät tuotuja sklearn-moduuleja mallin rakentamisen aikana.
Tietojen esikäsittely
Lataa tietojoukko kutsumalla pandas read_csv-funktiota. Varmista, että tallennat tietojoukon samaan hakemistoon kuin projektisi. Näytä tietojoukon viisi ensimmäistä riviä saadaksesi kuvan tietojoukosta.
df = pd.read_csv("/content/Spam Sähköpostin raakateksti NLP.csv: lle")
df.head()
Pudota tietojoukon sarake FILE_NAME. Se ei ole hyödyllinen ominaisuus roskapostin luokittelussa.
df.drop('TIEDOSTON NIMI', akseli =1, paikalla =Totta)
Tarkista tietojoukosta kinkun ja roskapostin määrä. Tämä auttaa sinua myöhemmin määrittämään, kuinka tiedot jaetaan mallin koulutusta ja testausta varten.
df. CATEGORY.value_counts()
Lataa corpus stopwords NLTK-kirjastosta. Stopwords ovat joukko yleisesti esiintyviä sanoja. Esikäsittely poistaa ne viesteistä. Lataa englanninkieliset pysäytyssanat ja tallenna ne stopword-muuttujaan.
nltk.download("seissanat")
stopword = nltk.corpus.stopwords.words('Englanti')
Lataa avoin monikielinen WordNet. Se on leksikaalinen tietokanta englannin sanoista ja niiden semanttisista merkityksistä.
nltk.download("omw-1.4")
Lataa wordnet-korpus. Käytät sitä tekstin luokitteluun. Toteuta WordNetLemmatizer()-objekti. Käytät esinettä lemmatisoinnin aikana. Lemmatisointi on tekniikka, jota käytetään NLP: ssä sanojen johdannaismuotojen pelkistämiseksi niiden sanakirjamerkitykseksi.
Esimerkiksi: Sanan "kissat" supistaminen antaa sinulle sanan "kissa". Sanasta lemmatisoinnin jälkeen tulee lemma.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Luo tyhjä luettelo, jota käytät esikäsiteltyjen viestien tallentamiseen.
corpus=[]
Luo for-silmukka käsitelläksesi kaikki tietojoukon MESSAGE-sarakkeen viestit. Poista kaikki muut kuin aakkosnumeeriset merkit. Muunna viesti pienillä kirjaimilla. Jaa teksti sanoiksi. Poista pysäytyssanat ja lemmatisoi sanat. Muunna sanat takaisin lauseiksi. Liitä esikäsitelty viesti korpusluetteloon.
varten i sisään kantama (len (df)):
# poistaa kaikki muut kuin aakkosnumeeriset merkit
viesti = re.sub('[^a-zA-Z0-9]', ' ', df['VIESTI'][i])# muuntaa viestin pieniksi kirjaimiksi
viesti = viesti.alempi()# lauseen jakaminen sanoiksi lemmatisointia varten
viesti = viesti.split()# lopetussanojen poistaminen ja lemmatisointi
viesti = [lemmatizer.lemmatize (sana) varten sana sisään viesti
jos sana eisisään set (stopwords.words('Englanti'))]# Sanojen muuntaminen takaisin lauseiksi
viesti = ' '.join (viesti)
# Esikäsitellyn viestin lisääminen korpusluetteloon
corpus.append (viesti)
Tämä silmukka kestää noin viisi minuuttia. Lemmatisointi ja pysäytyssanojen poistaminen vie suurimman osan ajasta. Olet nyt esikäsitellyt tietosi.
Ominaisuussuunnittelu käyttäen Bag-of-Words-mallia vs TF-IDF-tekniikka
Ominaisuussuunnittelu on prosessi, jossa raakadataominaisuudet muunnetaan uusiksi koneoppimismalleihin sopiviksi ominaisuuksiksi.
Bag of Words -malli
Sanapussimalli edustaa tekstidataa asiakirjassa olevien sanojen tiheysjakaumana. Tämä on yksinkertaisesti kuinka monta kertaa sana esiintyy asiakirjassa.
Käytä scikit-learnin CountVectorizer-luokkaa muuntaaksesi tekstidatan numeerisiksi vektoreiksi. Sovita esikäsiteltyjen viestien korpus ja muunna korpus harvaksi matriisiksi.
# Ota 2500 parasta ominaisuutta
cv = CountVektorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORIA']
Jaa muunnetut tiedot harjoitus- ja testisarjoiksi. Käytä 20 prosenttia tiedoista testaukseen ja 80 prosenttia harjoitteluun.
x_train, x_test, y_train, y_test = train_test_split(
X, y, testin_koko=0.20, satunnainen_tila=1, kerrosta=y)
Sanapussimalli luokittelee tietojoukon viestit oikein. Mutta se ei toimi hyvin omien viestien luokittelussa. Se ei ota huomioon viestien semanttista merkitystä. Käytä tätä tekniikkaa, jos haluat luokitella vain tietojoukon viestit.
TF-IDF-tekniikka
Termi Frequency-Inverse Document Frequency (TF-IDF) toimii määrittämällä painotuksia asiakirjan sanoille sen mukaan, kuinka usein ne esiintyvät. TF-IDF antaa sanat, jotka esiintyvät usein dokumentissa, mutta ovat harvinaisia korpuksessa, suuremman painoarvon. Tämä antaa koneoppimisalgoritmille mahdollisuuden ymmärtää paremmin tekstin merkitystä.
tf = TfidfVektorizer (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, testin_koko=0.20, satunnainen_tila=1, kerrosta=y)
TF-IDF: n avulla voit poimia viesteistä semanttisen merkityksen ja luokitella omia viestejäsi.
Mallin luominen ja kouluttaminen
Aloita luomalla ja alustamalla Naive Bayes -malli käyttämällä scikit-learn MultinomialNB -luokkaa.
malli = MultinomialNB()
Sovita harjoitustiedot, jotta malli voi harjoitella harjoitussarjassa:
malli.fit (x_train, y_train)
Tee sitten ennusteita harjoitus- ja testaussarjoista ennustusmenetelmällä.
train_pred = malli.ennustus (x_train)
testi_pred = malli.ennustus (x_testi)
Nämä ennusteet auttavat sinua arvioimaan mallisi.
Mallin arviointi
Arvioi mallisi suorituskyky käyttämällä scikit-learnin classification_report-funktiota. Välitä harjoitussarjan ennusteet ja todelliset harjoitussarjan tarrat syötteenä. Tee sama testisarjalle.
tulosta (classification_report (train_pred, y_train))
tulosta (classification_report (test_pred, y_test))
Mitä suurempi tarkkuus, muistaminen ja tarkkuus molemmissa luokissa, sitä parempi malli.
Omien viestien luokittelun tulokset
Muunna viesti vektoriksi TF-IDF-tekniikalla. Käytä mallia ennustamaan, onko viesti roskapostia vai kinkkua, ja näytä sitten ennuste näytöllä.
Tulosta("Ennustetaan...")
viesti = ["Voitit 10 000 dollaria, anna tilisi
yksityiskohdat, jotta voimme siirtää rahat"]
viestin_vektori = tf.transform (viesti)
luokka = malli.ennustus (viestivektori)
Tulosta("Viesti on", "roskaposti"jos luokka == 1muu"ei roskapostia")
Korvaa viesti omallasi.
Tulos on seuraava:
Malli voi luokitella uudet näkymätön viestit roskapostiksi tai kinkuksi.
Haasteena oleva roskapostiluokitus sovelluksissa
Suurin haaste roskapostin luokittelulle sovelluksissa on viestien väärä luokittelu. Koneoppimismallit eivät aina ole oikeita. He voivat luokitella roskapostin kinkuksi ja päinvastoin. Jos kinkku luokitellaan roskapostiksi, ohjelma voi poistaa sähköpostin käyttäjän postilaatikosta, jolloin hän jää huomaamatta tärkeitä viestejä.