Tādi lasītāji kā jūs palīdz atbalstīt MUO. Veicot pirkumu, izmantojot saites mūsu vietnē, mēs varam nopelnīt filiāles komisiju. Lasīt vairāk.

Gandrīz katrā e-pasta vai ziņojumapmaiņas platformā ir surogātpasta filtrs. Filtrs pārbauda katru pastu vai ziņojumu, tiklīdz tas tiek saņemts, un klasificē to kā surogātpastu vai ziņojumu. Jūsu iesūtnē tiek rādīti tie, kas ietilpst zem šķiņķa. Tas noraida vai atsevišķi parāda ziņojumus, kas ietilpst surogātpasta sarakstā.

Varat izveidot pats savu surogātpasta filtru, izmantojot NLTK, regex un scikit-learn kā galvenās bibliotēkas. Jums būs nepieciešama arī datu kopa, lai apmācītu savu modeli.

Jūsu datu kopas izpratne

“Surogātpasta klasifikācija pamata NLP” ir brīvi pieejama Kaggle datu kopa. Tas satur surogātpasta un neapstrādātu pasta ziņojumu sajaukumu. Tajā ir 5796 rindas un 3 kolonnas.

The KATEGORIJA kolonna norāda, vai ziņojums ir surogātpasts vai šķiņķis. Numurs viens apzīmē surogātpastu, bet nulle apzīmē šķiņķi. The ZIŅOJUMS kolonna satur faktisko neapstrādāto pastu. The FAILA NOSAUKUMS kategorija ir unikāls ziņojuma identifikators.

Vides sagatavošana

Lai sekotu līdzi, jums ir jābūt a pamatzināšanas par Python un mašīnmācība. Jums vajadzētu arī justies ērti strādāt ar Google Colab vai Jupyter piezīmju grāmatiņa.

Jupyter piezīmjdatoram dodieties uz mapi, kurā vēlaties atrasties projektam. Izveidojiet jaunu virtuālo vidi un palaidiet Jupyter Notebook no šīs mapes. Google Colab šī darbība nav nepieciešama. Izveidojiet jaunu piezīmju grāmatiņu pakalpojumā Google Colab vai Jupyter Notebook.

Pilns avota kods un datu kopa ir pieejami a GitHub repozitorijs.

Palaidiet šo burvju komandu, lai instalētu nepieciešamās bibliotēkas.

!pip install nltk scikit-learn regex numpy pandas

Jūs izmantosiet:

  • NLTK par dabiskās valodas apstrāde (NLP).
  • scikit-learn izveidot mašīnmācīšanās modeli.
  • regex darbam ar regulārām izteiksmēm.
  • NumPy darbam ar masīviem.
  • Pandas, lai manipulētu ar jūsu datu kopu.

Importēt bibliotēkas

Importējiet savā vidē instalētās bibliotēkas. Importējiet regulārās izteiksmes bibliotēku kā re un scikit-learn kā sklearn.

imports pandas  pd
imports nejutīgs np
imports nltk
no nltk.stem imports WordNetLemmatizer
no nltk.corpus imports stopvārdi
imports re
no sklearn.model_selection imports train_test_split
no sklearn.metrics imports klasifikācijas_pārskats
no sklearn.feature_extraction.text imports CountVektorizer
no sklearn.feature_extraction.text imports TfidfVektorizer

Jūs izmantosiet WordNetLemmatizer un stopvārdu moduļus no NLTK, lai iepriekš apstrādātu neapstrādātos ziņojumus datu kopā. Modeļa veidošanas laikā izmantosit importētos sklearn moduļus.

Datu priekšapstrāde

Lai ielādētu datu kopu, izsauciet funkciju pandas read_csv. Noteikti glabājiet datu kopu tajā pašā direktorijā, kurā atrodas jūsu projekts. Parādiet pirmās piecas datu kopas rindas, lai iegūtu datu kopas vizuālo priekšstatu.

df = pd.read_csv('/content/Spam E-pasta neapstrādāts NLP.csv teksts')
df.head()

Nometiet datu kopas kolonnu FILE_NAME. Tas nav noderīgs līdzeklis surogātpasta klasifikācijai.

df.drop('FAILA NOSAUKUMS', ass=1, vietā=Taisnība)

Pārbaudiet, vai datu kopā ir šķiņķa un mēstuļu skaits. Tas vēlāk palīdzēs jums noteikt, kā sadalīt datus modeļu apmācībai un testēšanai.

df. KATEGORIJA.vērtību_skaiti()

Lejupielādējiet korpusa stopvārdus no NLTK bibliotēkas. Apturēšanas vārdi ir bieži sastopamu vārdu kopa. Iepriekšēja apstrāde tos noņem no ziņojumiem. Ielādējiet angļu valodas stopvārdus un saglabājiet tos stopvārda mainīgajā.

nltk.download('stopvārdi')
stopword = nltk.corpus.stopwords.words('Angļu')

Lejupielādējiet atvērto daudzvalodu WordNet. Tā ir angļu valodas vārdu un to semantiskās nozīmes leksiskā datubāze.

nltk.download("omw-1.4")

Lejupielādējiet Wordnet korpusu. Jūs to izmantosit teksta klasifikācijai. Izveidojiet WordNetLemmatizer() objektu. Objektu izmantosit lemmatizācijas laikā. Lemmatizācija ir paņēmiens, ko izmanto NLP, lai samazinātu vārdu atvasinājumu formas līdz to vārdnīcas nozīmei.

Piemēram: samazinot vārdu “kaķi”, jūs iegūsit vārdu “kaķis”. Vārds pēc lemmatizācijas kļūst par lemmu.

nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()

Izveidojiet tukšu sarakstu, ko izmantosit iepriekš apstrādāto ziņojumu glabāšanai.

korpuss=[]

Izveidojiet for cilpu, lai apstrādātu katru ziņojumu datu kopas kolonnā MESSAGE. Noņemiet visas rakstzīmes, kas nav burtciparu rakstzīmes. Konvertējiet ziņojumu uz mazajiem burtiem. Sadaliet tekstu vārdos. Noņemiet stopvārdus un lematizējiet vārdus. Pārvērtiet vārdus atpakaļ teikumos. Pievienojiet iepriekš apstrādāto ziņojumu korpusa sarakstam.

priekš i iekšā diapazons (len (df)):
# noņemot visas rakstzīmes, kas nav burtciparu rakstzīmes
ziņojums = re.sub("[^a-zA-Z0-9]", ' ', df['ZIŅOJUMS'][i])

# pārvēršot ziņojumu par mazajiem burtiem
ziņa = message.lower()

# teikuma sadalīšana vārdos lemmatizēšanai
ziņa = message.split()

# aizmetņu noņemšana un lematizācija
ziņa = [lemmatizer.lemmatize (vārds) priekš vārdu iekšā ziņa
ja vārdu iekšā set (stopwords.words('Angļu'))]

# Pārvēršot vārdus atpakaļ teikumos
ziņa = ' '.join (ziņa)

# Iepriekš apstrādātā ziņojuma pievienošana korpusa sarakstam
corpus.append (ziņojums)

Šīs cilpas darbība prasīs apmēram piecas minūtes. Lielāko daļu laika aizņem lematizācijas un pieturvārdu noņemšanas darbība. Tagad esat iepriekš apstrādājis savus datus.

Līdzekļu inženierija, izmantojot modeļu maisa vārdu un TF-IDF tehniku

Līdzekļu inženierija ir process, kurā neapstrādātu datu līdzekļi tiek pārveidoti par jauniem līdzekļiem, kas piemēroti mašīnmācīšanās modeļiem.

Vārdu maisa modelis

Vārdu maisa modelis attēlo teksta datus kā dokumentā esošo vārdu biežuma sadalījumu. Vienkārši šādi ir norādīts, cik reižu vārds parādās dokumentā.

Izmantojiet CountVectorizer klasi no scikit-learn, lai pārvērstu teksta datus skaitliskos vektoros. Ievietojiet iepriekš apstrādāto ziņojumu korpusu un pārveidojiet korpusu retā matricā.

# Izmantojiet 2500 populārākās funkcijas 
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (korpuss).toarray()
y = df['CATEGORY']

Sadaliet pārveidotos datus apmācības un testa komplektos. Izmantojiet divdesmit procentus datu testēšanai un astoņdesmit procentus apmācībai.

x_train, x_test, y_train, y_test = train_test_split(
X, y, testa_izmērs=0.20, random_state=1, stratificēt=y)

Vārdu maisa modelis pareizi klasificēs ziņojumus datu kopā. Taču tas nedarbosies labi, klasificējot savus ziņojumus. Tajā nav ņemta vērā ziņojumu semantiskā nozīme. Lai klasificētu tikai ziņojumus datu kopā, izmantojiet šo paņēmienu.

TF-IDF tehnika

Termina biežuma apgrieztā dokumenta biežums (TF-IDF) darbojas, piešķirot vārdiem dokumentā svaru, pamatojoties uz to, cik bieži tie parādās. TF-IDF piešķir vārdiem, kas bieži parādās dokumentā, bet ir reti korpusā, lielāku nozīmi. Tas ļauj mašīnmācīšanās algoritmiem labāk izprast teksta nozīmi.

tf = TfidfVectorizer (ngram_range=(1,3), max_funkcijas=2500)
X = tf.fit_transform (korpuss).toarray()

x_train, x_test, y_train, y_test = train_test_split(
X, y, testa_izmērs=0.20, random_state=1, stratificēt=y)

Lai iegūtu semantisko nozīmi no ziņojumiem un klasificētu savus ziņojumus, izmantojiet TF-IDF.

Jūsu modeļa izveide un apmācība

Sāciet ar Naive Bayes modeļa izveidi un inicializēšanu, izmantojot scikit-learn MultinomialNB klasi.

modelis = MultinomialNB()

Ievietojiet treniņu datus, ļaujot modelim trenēties treniņu komplektā:

model.fit (x_train, y_train)

Pēc tam veiciet prognozes par apmācību un testēšanas komplektiem, izmantojot prognozēšanas metodi.

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

Šīs prognozes palīdzēs novērtēt jūsu modeli.

Modeļa novērtējums

Novērtējiet sava modeļa veiktspēju, izmantojot scikit-learn funkciju classification_report. Nododiet apmācības komplekta prognozes un faktisko treniņu komplektu etiķetes kā ievadi. Dariet to pašu ar testa komplektu.

drukāt (classification_report (train_pred, y_train))
drukāt (classification_report (test_pred, y_test))

Jo augstāka precizitāte, atmiņa un precizitāte abām klasēm, jo ​​labāks modelis.

Savu ziņojumu klasificēšanas rezultāti

Pārveidojiet ziņojumu vektorā, izmantojot TF-IDF paņēmienu. Izmantojiet modeli, lai paredzētu, vai ziņojums ir surogātpasts vai šķiņķis, un pēc tam parādiet šo prognozi ekrānā.

drukāt ('Prognozējot...')

ziņa = ["Jūs laimējāt 10 000 dolāru, lūdzu, norādiet savu kontu
detaļas, Lai varam pārskaitīt naudu"]

message_vector = tf.transform (ziņojums)
kategorija = model.predict (ziņojuma_vektors)
drukāt ("Ziņa ir", "spams"ja kategorija == 1cits"nav surogātpasts")

Nomainiet ziņojumu ar savu.

Izvade ir šāda:

Modelis var klasificēt jaunus neredzētus ziņojumus kā surogātpastu vai šķiņķi.

Izaicinājums, ar kuru saskaras surogātpasta klasifikācija lietojumprogrammās

Galvenā problēma, ar kuru saskaras surogātpasta klasifikācija lietojumprogrammās, ir nepareiza ziņojumu klasifikācija. Mašīnmācīšanās modeļi ne vienmēr ir pareizi. Viņi var klasificēt surogātpastu kā šķiņķi un otrādi. Ja šķiņķis tiek klasificēts kā surogātpasts, programma var noņemt e-pastu no lietotāja iesūtnes, liekot viņam palaist garām svarīgus ziņojumus.