Skoraj vsaka platforma za pošiljanje e-pošte ali sporočil je filter za neželeno pošto. Filter pregleda vsako pošto ali sporočilo, ko prispe, in ga razvrsti med neželeno ali neželeno pošto. V vaši mapi »Prejeto« so prikazani tisti, ki spadajo med šunko. Zavrne ali ločeno prikaže sporočila, ki spadajo med vsiljeno pošto.
Ustvarite lahko lasten filter neželene pošte z uporabo NLTK, regex in scikit-learn kot glavnih knjižnic. Za usposabljanje modela boste potrebovali tudi nabor podatkov.
Razumevanje vašega nabora podatkov
»Klasifikacija neželene pošte za osnovni NLP« je prosto dostopna Nabor podatkov Kaggle. Vsebuje mešanico neželene pošte in neobdelanih poštnih sporočil. Ima 5796 vrstic in 3 stolpce.
The KATEGORIJA stolpec označuje, ali je sporočilo neželena pošta ali ham. Številka ena predstavlja neželeno pošto, ničla pa šunko. The SPOROČILO vsebuje dejansko neobdelano pošto. The
IME DATOTEKE kategorija je edinstven identifikator sporočila.Priprava vašega okolja
Če želite slediti, boste morali imeti osnovno razumevanje Pythona in strojno učenje. Prav tako bi vam moralo biti udobno delati Google Colab ali Jupyter Notebook.
Za Jupyter Notebook se pomaknite do mape, v kateri želite, da se nahaja projekt. Ustvarite novo virtualno okolje in zaženite Jupyter Notebook iz te mape. Google Colab ne potrebuje tega koraka. Ustvarite nov zvezek v Google Colab ali Jupyter Notebook.
Celotna izvorna koda in nabor podatkov sta na voljo v a Repozitorij GitHub.
Zaženite naslednji čarobni ukaz, da namestite zahtevane knjižnice.
!pip namestite nltk scikit-learn regex numpy pandas
Uporabili boste:
- NLTK za obdelava naravnega jezika (NLP).
- scikit-learn za ustvarjanje modela strojnega učenja.
- regex za delo z regularnimi izrazi.
- NumPy za delo z nizi.
- Pande za manipulacijo vašega nabora podatkov.
Uvozi knjižnice
Uvozite knjižnice, ki ste jih namestili v svoje okolje. Uvozite knjižnico regularnih izrazov kot re in scikit-learn kot sklearn.
uvoz pande kot pd
uvoz numpy kot np
uvoz nltk
od nltk.steblo uvoz WordNetLemmatizer
od nltk.corpus uvoz zaustavitvene besede
uvoz re
od sklearn.model_selection uvoz train_test_split
od sklearn.metrics uvoz klasifikacijsko_poročilo
od sklearn.feature_extraction.text uvoz CountVectorizer
od sklearn.feature_extraction.text uvoz TfidfVectorizer
Za predhodno obdelavo neobdelanih sporočil v naboru podatkov boste uporabili module WordNetLemmatizer in stopwords iz NLTK. Med izdelavo modela boste uporabili uvožene module sklearn.
Predhodna obdelava podatkov
Pokličite funkcijo pandas read_csv, da naložite nabor podatkov. Poskrbite, da boste nabor podatkov shranili v isti imenik kot vaš projekt. Prikažite prvih pet vrstic nabora podatkov, da si ogledate nabor podatkov.
df = pd.read_csv('/content/Neželena e-pošta neobdelano besedilo za NLP.csv')
df.head()
Spustite stolpec FILE_NAME nabora podatkov. To ni uporabna funkcija za razvrščanje vsiljene pošte.
df.drop('IME DATOTEKE', os=1, na mestu=Prav)
Preverite število amaterskih in vsiljenih sporočil v naboru podatkov. To vam bo pozneje pomagalo določiti, kako razdeliti podatke za usposabljanje in testiranje modela.
df. CATEGORY.value_counts()
Prenesite zaustavitvene besede korpusa iz knjižnice NLTK. Stopwords so nabor besed, ki se pogosto pojavljajo. Predhodna obdelava jih odstrani iz sporočil. Naložite angleške zaustavitvene besede in jih shranite v spremenljivko zaustavitvene besede.
nltk.download('stopwords')
stopword = nltk.corpus.stopwords.words('angleščina')
Prenesite odprti večjezični WordNet. Je leksikalna baza angleških besed in njihovih pomenskih pomenov.
nltk.download('omw-1.4')
Prenesite wordnet korpus. Uporabili ga boste za razvrščanje besedil. Instanciirajte objekt WordNetLemmatizer(). Predmet boste uporabili med lematizacijo. Lematizacija je tehnika, ki se uporablja v NLP za redukcijo izpeljanih oblik besed na njihov slovarski pomen.
Na primer: Če zmanjšate besedo "mačke", boste dobili "mačka". Beseda po lematizaciji postane lema.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Ustvarite prazen seznam, ki ga boste uporabili za shranjevanje predhodno obdelanih sporočil.
korpus=[]
Ustvarite zanko for za obdelavo vsakega sporočila v stolpcu MESSAGE nabora podatkov. Odstranite vse znake, ki niso alfanumerični. Pretvori sporočilo v male črke. Razdeli besedilo na besede. Odstranite ustavitvene besede in lematizirajte besede. Pretvorite besede nazaj v stavke. Pripni predhodno obdelano sporočilo na seznam korpusa.
za jaz v obseg (len (df)):
# odstranitev vseh nealfanumeričnih znakov
sporočilo = re.sub('[^a-zA-Z0-9]', ' ', df['SPOROČILO'][jaz])# pretvorba sporočila v male črke
sporočilo = sporočilo.lower()# razdeljevanje stavka na besede za lematizacijo
sporočilo = sporočilo.split()# odstranjevanje besed in lematizacija
sporočilo = [lemmatizer.lemmatize (beseda) za beseda v sporočilo
če beseda nev niz (stopwords.words('angleščina'))]# Pretvarjanje besed nazaj v stavke
sporočilo = ' '.join (sporočilo)
# Dodajanje vnaprej obdelanega sporočila na seznam korpusa
corpus.append (sporočilo)
Ta zanka bo trajala približno pet minut. Korak lematiziranja in odstranjevanja zaustavitvenih besed vzame večino časa. Zdaj ste predhodno obdelali svoje podatke.
Inženiring funkcij z uporabo modela vrečke besed v primerjavi s tehniko TF-IDF
Inženiring funkcij je proces pretvorbe funkcij neobdelanih podatkov v nove funkcije, primerne za modele strojnega učenja.
Model vrečke z besedami
Model vrečke besed predstavlja besedilne podatke kot frekvenčno porazdelitev besed, prisotnih v dokumentu. To je preprosto način, kolikokrat se beseda pojavi v dokumentu.
Za pretvorbo besedilnih podatkov v numerične vektorje uporabite razred CountVectorizer iz scikit-learn. Prilagodite korpus vnaprej obdelanih sporočil in transformirajte korpus v redko matriko.
# Vzemite 2500 najboljših funkcij
cv = CountVectorizer (max_features=2500, ngram_razpon=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORIJA']
Razdelite transformirane podatke v nabore za usposabljanje in teste. Dvajset odstotkov podatkov uporabite za testiranje in osemdeset odstotkov za usposabljanje.
x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, naključno_stanje=1, stratify=y)
Model vrečke besed bo pravilno razvrstil sporočila v naboru podatkov. Vendar ne bo deloval dobro pri razvrščanju lastnih sporočil. Ne upošteva pomenskega pomena sporočil. Če želite le razvrstiti sporočila v naboru podatkov, uporabite to tehniko.
Tehnika TF-IDF
Term Frequency-Inverse Document Frequency (TF-IDF) deluje tako, da besedam v dokumentu dodeli uteži glede na to, kako pogosto se pojavljajo. TF-IDF daje besedam, ki se pogosto pojavljajo v dokumentu, a so v korpusu redke, večjo težo. To omogoča algoritmom strojnega učenja, da bolje razumejo pomen besedila.
tf = TfidfVectorizer (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, test_size=0.20, naključno_stanje=1, stratify=y)
Za pridobivanje semantičnega pomena iz sporočil in razvrščanje lastnih sporočil uporabite TF-IDF.
Ustvarjanje in usposabljanje vašega modela
Začnite z ustvarjanjem in inicializacijo Naive Bayesovega modela z uporabo razreda scikit-learn MultinomialNB.
model = MultinomalNB()
Prilagodite podatke o vadbi, da omogočite modelu vadbo na kompletu za vadbo:
model.fit (x_train, y_train)
Nato naredite napovedi za nize za usposabljanje in testiranje z uporabo metode predvidevanja.
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
Te napovedi vam bodo pomagale oceniti vaš model.
Vrednotenje modela
Ocenite delovanje svojega modela s funkcijo classification_report iz scikit-learn. Kot vhod posredujte napovedi vadbenih nizov in dejanske oznake vadbenih nizov. Enako storite s testnim nizom.
natisni (razvrstitveno_poročilo (train_pred, y_train))
natisni (poročilo_razvrstitve (test_pred, y_test))
Večja ko je natančnost, priklic in točnost za oba razreda, boljši je model.
Rezultati razvrščanja lastnih sporočil
Pretvorite sporočilo v vektor s tehniko TF-IDF. Uporabite model, da predvidite, ali je sporočilo neželena pošta ali šunka, nato pa to napoved prikažite na zaslonu.
natisni('Napovedovanje ...')
sporočilo = [»Zadel si 10.000 dolarjev, prosim navedi svoj račun
podrobnosti, Da lahko nakažemo denar"]
message_vector = tf.transform (sporočilo)
kategorija = model.predict (message_vector)
natisni("Sporočilo je", "nezaželena pošta"če kategorija == 1drugače"ni spam")
Zamenjajte sporočilo s svojim.
Rezultat je naslednji:
Model lahko nova nepregledana sporočila razvrsti kot neželeno pošto ali ham.
Izziv pri razvrščanju neželene pošte v aplikacijah
Glavni izziv pri razvrščanju vsiljene pošte v aplikacijah je napačna klasifikacija sporočil. Modeli strojnega učenja niso vedno pravilni. Neželeno pošto lahko razvrstijo kot ham in obratno. V primeru, da ham razvrsti kot vsiljeno pošto, lahko program odstrani e-pošto iz uporabnikove mape »Prejeto«, kar povzroči, da zamudi pomembna sporočila.