Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision. Läs mer.

Det finns ett skräppostfilter i nästan alla e-post- eller meddelandeplattformar. Filtret undersöker varje e-post eller meddelande när det kommer och klassificerar det som antingen spam eller skinka. Din inkorg visar de som faller under skinka. Den avvisar, eller visar separat, meddelanden som faller under skräppost.

Du kan skapa ditt eget spamfilter med hjälp av NLTK, regex och scikit-learn som huvudbibliotek. Du behöver också en datauppsättning för att träna din modell.

Förstå din datamängd

"Spam Classification for Basic NLP" är en fritt tillgänglig Kaggle dataset. Den innehåller en blandning av spam och ham raw e-postmeddelanden. Den har 5 796 rader och 3 kolumner.

De KATEGORI kolumnen anger om ett meddelande är skräppost eller skinka. Nummer ett representerar spam medan noll representerar skinka. De MEDDELANDE kolumnen innehåller den faktiska råposten. De FILNAMN kategori är en unik meddelandeidentifierare.

Förbered din miljö

För att följa med måste du ha en grundläggande förståelse för Python och maskininlärning. Du bör också vara bekväm att arbeta med Google Colab eller Jupyter Notebook.

För Jupyter Notebook, navigera till mappen där du vill att projektet ska finnas. Skapa en ny virtuell miljö och kör Jupyter Notebook från den här mappen. Google Colab behöver inte detta steg. Skapa en ny anteckningsbok i antingen Google Colab eller Jupyter Notebook.

Den fullständiga källkoden och datamängden finns tillgängliga i en GitHub-förråd.

Kör följande magiska kommando för att installera de nödvändiga biblioteken.

!pip installera nltk scikit-lär dig regex numpy pandas

Du kommer att använda:

  • NLTK för naturlig språkbehandling (NLP).
  • scikit-learn för att skapa maskininlärningsmodellen.
  • regex för att arbeta med reguljära uttryck.
  • NumPy för att arbeta med arrayer.
  • Pandas för att manipulera din datauppsättning.

Importera bibliotek

Importera biblioteken du installerade i din miljö. Importera regex-biblioteket som re och scikit-learn som sklearn.

importera pandor som pd
importera numpy som np
importera nltk
från nltk.stem importera WordNetLemmatizer
från nltk.corpus importera stoppord
importera re
från sklearn.model_selection importera train_test_split
från sklearn.metrics importera klassificeringsrapport
från sklearn.feature_extraction.text importera CountVectorizer
från sklearn.feature_extraction.text importera TfidfVectorizer

Du kommer att använda WordNetLemmatizer och stoppordsmoduler från NLTK för att förbehandla råmeddelandena i datamängden. Du kommer att använda importerade sklearn-moduler under modellbyggandet.

Förbearbetning av data

Anropa pandas read_csv-funktionen för att ladda datamängden. Se till att du lagrar datauppsättningen i samma katalog som ditt projekt. Visa de första fem raderna i datamängden för att få en bild av datamängden.

df = pd.read_csv('/content/Spam E-postråtext för NLP.csv')
df.head()

Släpp kolumnen FILE_NAME i datamängden. Det är inte en användbar funktion för skräppostklassificering.

df.drop('FILNAMN', axel=1, på plats=Sann)

Kontrollera antalet skinka och skräppost i datamängden. Detta kommer senare att hjälpa dig att avgöra hur du delar upp data för modellträning och testning.

df. CATEGORY.value_counts()

Ladda ner korpusstopporden från NLTK-biblioteket. Stoppord är en uppsättning vanliga ord. Förbearbetning tar bort dem från meddelanden. Ladda de engelska stopporden och lagra dem i en stoppordsvariabel.

nltk.download("stoppord")
stopword = nltk.corpus.stopwords.words('engelsk')

Ladda ner det öppna Multilingual WordNet. Det är en lexikalisk databas med engelska ord och deras semantiska betydelser.

nltk.download('omw-1.4')

Ladda ner wordnet-korpus. Du kommer att använda den för textklassificering. Instantiera ett WordNetLemmatizer()-objekt. Du kommer att använda objektet under lemmatisering. Lemmatisering är en teknik som används i NLP för att reducera avledningsformer av ord till deras ordboksbetydelse.

Till exempel: Om du minskar ordet "katter" får du "katt". Ett ord efter lemmatisering blir ett lemma.

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

Skapa en tom lista som du kommer att använda för att lagra de förbehandlade meddelandena.

korpus=[]

Skapa en for-loop för att bearbeta varje meddelande i MESSAGE-kolumnen i datamängden. Ta bort alla icke-alfanumeriska tecken. Konvertera meddelandet till gemener. Dela upp texten i ord. Ta bort stopporden och lemmatisera orden. Konvertera tillbaka orden till meningar. Lägg till det förbehandlade meddelandet i korpuslistan.

för i i intervall (len (df)):
# tar bort alla icke-alfanumeriska tecken
meddelande = re.sub('[^a-zA-Z0-9]', ' ', df['MEDDELANDE'][i])

# konverterar meddelandet till gemener
meddelande = message.lower()

# dela upp meningen i ord för lemmatisering
meddelande = meddelande.split()

# ta bort stoppord och lemmatisera
meddelande = [lemmatizer.lemmatize (ord) för ord i meddelande
om ord intei set (stoppord.ord('engelsk'))]

# Konvertera tillbaka orden till meningar
meddelande = ' '.join (meddelande)

# Lägger till det förbehandlade meddelandet till korpuslistan
corpus.append (meddelande)

Denna loop kommer att ta cirka fem minuter att köra. Steget att lemmatisera och ta bort stoppord tar det mesta av tiden. Du har nu förbehandlat din data.

Funktionsteknik med hjälp av Bag-of-Words-modellen vs TF-IDF-teknik

Funktionsteknik är processen att konvertera rådatafunktioner till nya funktioner lämpade för maskininlärningsmodeller.

Bag-of-Words modell

Bag-of-words-modellen representerar textdata som en frekvensfördelning av ord som finns i dokumentet. Detta är helt enkelt hur antalet gånger ett ord förekommer i ett dokument.

Använd klassen CountVectorizer från scikit-learn för att konvertera textdata till numeriska vektorer. Anpassa korpusen av förbearbetade meddelanden och omvandla korpusen till en gles matris.

# Ta topp 2500 funktioner 
cv = CountVectorizer (max_features=2500, ngram_range=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORI']

Dela upp de omvandlade data till tränings- och testset. Använd tjugo procent av data för testning och åttio procent för träning.

x_train, x_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=1, stratifiera=y)

Bag-of-words-modellen kommer att klassificera meddelandena i datamängden korrekt. Men kommer inte att prestera bra när det gäller att klassificera dina egna meddelanden. Den tar inte hänsyn till meddelandenas semantiska betydelse. Använd den här tekniken för att endast klassificera meddelanden i datamängden.

TF-IDF-teknik

Termen Frequency-Inverse Document Frequency (TF-IDF) fungerar genom att tilldela vikter till ord i ett dokument baserat på hur ofta de förekommer. TF-IDF ger ord som förekommer ofta i ett dokument men som är sällsynta i korpusen högre vikt. Detta gör det möjligt för maskininlärningsalgoritmer att bättre förstå innebörden av texten.

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, random_state=1, stratifiera=y)

För att extrahera semantisk betydelse från meddelandena och klassificera dina egna meddelanden använd TF-IDF.

Skapa och träna din modell

Börja med att skapa och initiera en Naiv Bayes-modell med hjälp av scikit-learn MultinomialNB-klassen.

modell = MultinomialNB()

Passa in träningsdata, så att modellen kan träna på träningssetet:

model.fit (x_train, y_train)

Gör sedan förutsägelser om tränings- och testseten med hjälp av förutsägningsmetoden.

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

Dessa förutsägelser hjälper dig att utvärdera din modell.

Modellutvärdering

Utvärdera prestandan för din modell med hjälp av funktionen classification_report från scikit-learn. Passera träningsuppsättningens förutsägelser och de faktiska träningssetetiketterna som input. Gör samma sak för testsetet.

print (classification_report (train_pred, y_train))
print (klassificeringsrapport (test_pred, y_test))

Ju högre precision, återkallelse och noggrannhet för båda klasserna desto bättre modell.

Resultat av att klassificera dina egna meddelanden

Förvandla meddelandet till en vektor med hjälp av TF-IDF-tekniken. Använd modellen för att förutsäga om meddelandet är spam eller skinka och visa sedan den förutsägelsen på skärmen.

skriva ut("Förutsäga...")

meddelande = ["Du vann 10 000 dollar, ange ditt konto
detaljer, så att vi kan överföra pengarna"]

meddelandevektor = tf.transform (meddelande)
kategori = model.predict (meddelandevektor)
skriva ut("Meddelandet är", "spam"om kategori == 1annan"ej spam")

Ersätt meddelandet med ditt eget.

Utgången är som följer:

Modellen kan klassificera nya osynliga meddelanden som spam eller skinka.

Utmaningen mot skräppostklassificering i applikationer

Den största utmaningen för spamklassificering i applikationer är felklassificeringen av meddelanden. Maskininlärningsmodeller är inte alltid korrekta. De kan klassificera spam som skinka och vice versa. I fallet med att klassificera skinka som skräppost kan ett program ta bort e-post från användarens inkorg, vilket gör att de missar viktiga meddelanden.