Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Téměř v každé platformě pro zasílání e-mailů nebo zpráv je spamový filtr. Filtr zkoumá každou poštu nebo zprávu tak, jak dorazí, a klasifikuje ji jako spam nebo ham. Vaše doručená pošta zobrazuje ty, které spadají pod šunku. Odmítá nebo zobrazuje samostatně zprávy, které spadají do spamu.

Můžete si vytvořit svůj vlastní spamový filtr pomocí NLTK, regex a scikit-learn jako hlavních knihoven. K trénování modelu budete také potřebovat datovou sadu.

Porozumění vaší datové sadě

„Klasifikace spamu pro základní NLP“ je volně dostupná Datová sada Kaggle. Obsahuje směs spamu a ham raw mailových zpráv. Má 5 796 řádků a 3 sloupce.

The KATEGORIE sloupec označuje, zda je zpráva spam nebo ham. Číslo jedna představuje spam, zatímco nula představuje šunku. The ZPRÁVA sloupec obsahuje skutečnou nezpracovanou poštu. The NÁZEV SOUBORU kategorie je jedinečný identifikátor zprávy.

instagram viewer

Příprava vašeho prostředí

Chcete-li pokračovat, musíte mít a základní porozumění Pythonu a strojové učení. Také by vám měla být příjemná práce Google Colab nebo Jupyter Notebook.

V případě Jupyter Notebook přejděte do složky, ve které má být projekt umístěn. Vytvořte nové virtuální prostředí a spusťte Jupyter Notebook z této složky. Google Colab tento krok nepotřebuje. Vytvořte nový poznámkový blok v Google Colab nebo Jupyter Notebook.

Úplný zdrojový kód a datová sada jsou k dispozici v a úložiště GitHub.

Spusťte následující magický příkaz k instalaci požadovaných knihoven.

!pip install nltk scikit-learn regex numpy pandy

Budete používat:

  • NLTK pro zpracování přirozeného jazyka (NLP).
  • scikit-learn k vytvoření modelu strojového učení.
  • regulární výraz pro práci s regulárními výrazy.
  • NumPy pro práci s poli.
  • Pandy k manipulaci s vaší datovou sadou.

Import knihoven

Importujte knihovny, které jste nainstalovali do svého prostředí. Importujte knihovnu regulárních výrazů jako re a scikit-learn jako sklearn.

import pandy tak jako pd
import nemotorný tak jako np
import nltk
z nltk.stem import WordNetLemmatizer
z nltk.corpus import stopwords
import re
z sklearn.model_selection import train_test_split
z sklearn.metrics import klasifikační_zpráva
z sklearn.feature_extraction.text import CountVectorizer
z sklearn.feature_extraction.text import TfidfVectorizer

K předzpracování nezpracovaných zpráv v datové sadě použijete moduly WordNetLemmatizer a stopwords z NLTK. Při sestavování modelu použijete importované moduly sklearn.

Předzpracování dat

Zavolejte funkci pandas read_csv k načtení datové sady. Ujistěte se, že datovou sadu ukládáte do stejného adresáře jako váš projekt. Zobrazte prvních pět řádků datové sady, abyste získali vizuál datové sady.

df = pd.read_csv('/content/Spam Email nezpracovaný text pro NLP.csv')
df.head()

Přetáhněte sloupec FILE_NAME datové sady. Není to užitečná funkce pro klasifikaci spamu.

df.drop('NÁZEV SOUBORU', osa=1, na místě=Skutečný)

Zkontrolujte počet ham a spamu v datové sadě. To vám později pomůže určit, jak rozdělit data pro modelování a testování.

df. CATEGORY.value_counts()

Stáhněte si stopwords korpusu z knihovny NLTK. Stopwords jsou soubor běžně se vyskytujících slov. Předběžné zpracování je odstraní ze zpráv. Načtěte anglická ignorovaná slova a uložte je do proměnné ignorovaných slov.

nltk.download('stopwords')
stopword = nltk.corpus.stopwords.words('Angličtina')

Stáhněte si otevřený vícejazyčný WordNet. Jde o lexikální databázi anglických slov a jejich sémantických významů.

nltk.download('omw-1.4')

Stáhněte si korpus wordnet. Využijete ho pro klasifikaci textu. Vytvořte instanci objektu WordNetLemmatizer(). Objekt použijete při lemmatizaci. Lemmatizace je technika používaná v NLP k redukci odvozených forem slov na jejich slovníkový význam.

Například: Zmenšením slova „kočky“ získáte „kočka“. Slovo po lemmatizaci se stává lemmatem.

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

Vytvořte prázdný seznam, který budete používat k ukládání předzpracovaných zpráv.

korpus=[]

Vytvořte smyčku for pro zpracování každé zprávy ve sloupci MESSAGE datové sady. Odstraňte všechny nealfanumerické znaky. Převeďte zprávu na malá písmena. Rozdělte text na slova. Odstraňte stopwords a lemmatizujte slova. Převeďte slova zpět do vět. Přidejte předzpracovanou zprávu do seznamu korpusů.

pro i v rozsah (len (df)):
# odstranění všech nealfanumerických znaků
zpráva = re.sub('[^a-zA-Z0-9]', ' ', df['ZPRÁVA'][i])

# převod zprávy na malá písmena
message = message.lower()

# rozdělení věty na slova pro lemmatizaci
message = message.split()

# odstranění stopwords a lemmatizace
message = [lemmatizer.lematize (slovo) pro slovo v zpráva
-li slovo nev set (stopwords.words('Angličtina'))]

# Převod slov zpět na věty
zpráva = ' '.připojit se (zpráva)

# Přidání předzpracované zprávy do seznamu korpusů
corpus.append (zpráva)

Spuštění této smyčky bude trvat asi pět minut. Většinu času zabere krok lemmatizace a odstranění ignorovaných slov. Nyní jste předzpracovali svá data.

Inženýrství funkcí pomocí modelu pytle slov vs. technika TF-IDF

Inženýrství funkcí je proces převodu prvků nezpracovaných dat na nové funkce vhodné pro modely strojového učení.

Model pytle slov

Model pytle slov představuje textová data jako rozdělení četnosti slov přítomných v dokumentu. Jednoduše řečeno, kolikrát se slovo vyskytuje v dokumentu.

Pomocí třídy CountVectorizer ze scikit-learn převeďte textová data na číselné vektory. Přizpůsobte korpus předzpracovaných zpráv a přeměňte korpus na řídkou matici.

# Vezměte top 2500 funkcí 
cv = CountVectorizer (max_features=2500, rozsah_ngram=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['KATEGORIE']

Rozdělte transformovaná data do tréninkových a testovacích sad. Použijte dvacet procent dat pro testování a osmdesát procent pro trénink.

x_train, x_test, y_train, y_test = train_test_split(
X, y, test_velikost=0.20, náhodný_stav=1, stratifikace=y)

Model pytle slov správně klasifikuje zprávy v datové sadě. Nebude však fungovat dobře při klasifikaci vašich vlastních zpráv. Nebere v úvahu sémantický význam zpráv. Chcete-li klasifikovat pouze zprávy v datové sadě, použijte tuto techniku.

Technika TF-IDF

Pojem frekvence-inverzní frekvence dokumentu (TF-IDF) funguje tak, že slovům v dokumentu přiřazuje váhu na základě toho, jak často se objevují. TF-IDF poskytuje slova, která se v dokumentu objevují často, ale v korpusu jsou vzácná. To umožňuje algoritmům strojového učení lépe porozumět významu textu.

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_velikost=0.20, náhodný_stav=1, stratifikace=y)

Chcete-li extrahovat sémantický význam ze zpráv a klasifikovat své vlastní zprávy, použijte TF-IDF.

Vytvoření a školení vašeho modelu

Začněte vytvořením a inicializací modelu Naive Bayes pomocí třídy scikit-learn MultinomialNB.

model = MultinomialNB()

Přizpůsobte tréninková data a umožníte modelu trénovat na tréninkové sadě:

model.fit (x_train, y_train)

Poté proveďte předpovědi na trénovacích a testovacích sadách pomocí metody predikce.

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

Tyto předpovědi vám pomohou vyhodnotit váš model.

Hodnocení modelu

Vyhodnoťte výkon svého modelu pomocí funkceklasifikace_report ze scikit-learn. Předejte předpovědi tréninkové sady a skutečné popisky tréninkové sady jako vstup. Proveďte totéž pro testovací sadu.

tisknout (klasifikační_přehled (vlak_před, y_vlak))
tisknout (classification_report (test_pred, y_test))

Čím vyšší je přesnost, zapamatovatelnost a přesnost pro obě třídy, tím lepší je model.

Výsledky klasifikace vašich vlastních zpráv

Transformujte zprávu do vektoru pomocí techniky TF-IDF. Pomocí modelu odhadněte, zda je zpráva spam nebo ham, a poté tuto předpověď zobrazte na obrazovce.

tisk("Předpovídám...")

zpráva = [„Vyhráli jste 10 000 dolarů, uveďte prosím svůj účet
podrobnosti, abychom mohli převést peníze"]

message_vector = tf.transform (zpráva)
kategorie = model.predict (message_vector)
tisk("Zpráva je", "spam"-li kategorie == 1jiný"není spam")

Nahraďte zprávu svou vlastní.

Výstup je následující:

Model může klasifikovat nové neviditelné zprávy jako spam nebo ham.

Klasifikace nevyžádané pošty v aplikacích

Hlavním problémem, kterému čelí klasifikace spamu v aplikacích, je chybná klasifikace zpráv. Modely strojového učení nejsou vždy správné. Mohou klasifikovat spam jako ham a naopak. V případě klasifikace hamu jako spamu může program odstranit e-maily z doručené pošty uživatele, což způsobí, že zmeškají důležité zprávy.