Takmer v každej platforme na odosielanie e-mailov alebo správ je filter nevyžiadanej pošty. Filter skontroluje každú poštu alebo správu pri jej doručení a klasifikuje ju ako spam alebo ham. Vaša doručená pošta zobrazuje tie, ktoré spadajú pod šunku. Odmieta alebo zobrazuje samostatne správy, ktoré patria do spamu.
Môžete si vytvoriť svoj vlastný spamový filter pomocou NLTK, regex a scikit-learn ako hlavných knižníc. Na trénovanie modelu budete potrebovať aj súbor údajov.
Pochopenie vašej množiny údajov
„Klasifikácia spamu pre základné NLP“ je voľne dostupná Súbor údajov Kaggle. Obsahuje zmes spamu a ham raw mailových správ. Má 5 796 riadkov a 3 stĺpce.
The KATEGÓRIA stĺpec označuje, či je správa spam alebo ham. Číslo jedna predstavuje spam, zatiaľ čo nula predstavuje šunku. The MESSAGE obsahuje skutočnú surovú poštu. The NÁZOV SÚBORU kategória je jedinečný identifikátor správy.
Príprava vášho prostredia
Ak chcete pokračovať, musíte mať a základné pochopenie Pythonu a strojové učenie. Tiež by sa vám malo pohodlne pracovať Google Colab alebo Jupyter Notebook.
Pre Jupyter Notebook prejdite do priečinka, v ktorom chcete, aby sa projekt nachádzal. Vytvorte nové virtuálne prostredie a spustite Jupyter Notebook z tohto priečinka. Google Colab tento krok nepotrebuje. Vytvorte si nový zápisník v službe Google Colab alebo Jupyter Notebook.
Úplný zdrojový kód a súbor údajov sú dostupné v a úložisko GitHub.
Spustite nasledujúci magický príkaz na inštaláciu požadovaných knižníc.
!pip install nltk scikit-learn regex numpy pandy
Budete používať:
- NLTK pre spracovanie prirodzeného jazyka (NLP).
- scikit-learn na vytvorenie modelu strojového učenia.
- regulárny výraz pre prácu s regulárnymi výrazmi.
- NumPy pre prácu s poliami.
- Pandy na manipuláciu s vaším súborom údajov.
Importovať knižnice
Importujte knižnice, ktoré ste nainštalovali vo svojom prostredí. Importujte knižnicu regulárnych výrazov ako re a scikit-learn ako sklearn.
importovať pandy ako pd
importovať numpy ako np
importovať nltk
od nltk.stem importovať WordNetLemmatizer
od nltk.corpus importovať stopwords
importovať re
od sklearn.model_selection importovať train_test_split
od sklearn.metrics importovať klasifikačná_správa
od sklearn.feature_extraction.text importovať CountVectorizer
od sklearn.feature_extraction.text importovať TfidfVectorizer
Na predspracovanie nespracovaných správ v množine údajov použijete moduly WordNetLemmatizer a stopwords z NLTK. Importované moduly sklearn použijete pri zostavovaní modelu.
Predspracovanie údajov
Zavolaním funkcie pandas read_csv načítajte množinu údajov. Uistite sa, že súbor údajov ukladáte do rovnakého adresára ako váš projekt. Zobrazte prvých päť riadkov množiny údajov, aby ste získali vizuál množiny údajov.
df = pd.read_csv('/content/Spam Email nespracovaný text pre NLP.csv')
df.head()
Presuňte stĺpec FILE_NAME množiny údajov. Nie je to užitočná funkcia na klasifikáciu spamu.
df.drop('NÁZOV SÚBORU', os=1, na mieste=Pravda)
Skontrolujte počet ham a spamovej pošty v súbore údajov. To vám neskôr pomôže určiť, ako rozdeliť údaje na trénovanie a testovanie modelu.
df. CATEGORY.value_counts()
Stiahnite si stopwords korpusu z knižnice NLTK. Stopwords sú súbor bežne sa vyskytujúcich slov. Predspracovanie ich odstráni zo správ. Načítajte anglické ignorované slová a uložte ich do premennej ignorovaných slov.
nltk.download('stopwords')
stopword = nltk.corpus.stopwords.words('Angličtina')
Stiahnite si otvorený viacjazyčný WordNet. Ide o lexikálnu databázu anglických slov a ich sémantických významov.
nltk.download('omw-1.4')
Stiahnite si korpus wordnet. Využijete ho na klasifikáciu textu. Vytvorte inštanciu objektu WordNetLemmatizer(). Objekt použijete pri lemmatizácii. Lemmatizácia je technika používaná v NLP na redukciu odvodených foriem slov na ich slovníkový význam.
Napríklad: Znížením slova „mačky“ získate „mačka“. Slovo po lemmatizácii sa stáva lemou.
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
Vytvorte prázdny zoznam, ktorý budete používať na ukladanie predspracovaných správ.
korpus=[]
Vytvorte cyklus for na spracovanie každej správy v stĺpci MESSAGE množiny údajov. Odstráňte všetky nealfanumerické znaky. Preveďte správu na malé písmená. Rozdeľte text na slová. Odstráňte ignorované slová a lemmatizujte slová. Premeňte slová späť na vety. Pripojte predspracovanú správu do zoznamu korpusov.
pre i v rozsah (len (df)):
# odstránenie všetkých nealfanumerických znakov
správa = re.sub('[^a-zA-Z0-9]', ' ', df['MESSAGE'][i])# prevod správy na malé písmená
message = message.lower()# rozdelenie vety na slová na lemmatizáciu
message = message.split()# odstránenie ignorovaných slov a lemmatizácia
message = [lemmatizer.lematize (slovo) pre slovo v správu
ak slovo niev set (stopwords.words('Angličtina'))]# Premena slov späť na vety
správa = ' '.pripojiť sa (správa)
# Pridanie predspracovanej správy do zoznamu korpusov
corpus.append (správa)
Spustenie tejto slučky bude trvať asi päť minút. Väčšinu času zaberie krok lemmatizácie a odstraňovania ignorovaných slov. Teraz ste predspracovali svoje údaje.
Funkcionalita využívajúca model vrecúška slov vs. technika TF-IDF
Inžinierstvo funkcií je proces konverzie funkcií nespracovaných údajov na nové funkcie vhodné pre modely strojového učenia.
Model vreca slov
Model vreca slov predstavuje textové údaje ako frekvenčné rozdelenie slov prítomných v dokumente. Toto je jednoducho počet výskytov slova v dokumente.
Použite triedu CountVectorizer zo scikit-learn na konverziu textových údajov na číselné vektory. Prispôsobte korpus predspracovaných správ a premeňte korpus na riedku maticu.
# Vezmite 2500 najlepších funkcií
cv = CountVectorizer (max_features=2500, rozsah_ngramu=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df['CATEGORY']
Rozdeľte transformované údaje do tréningových a testovacích sád. Využite dvadsať percent údajov na testovanie a osemdesiat percent na tréning.
x_train, x_test, y_train, y_test = train_test_split(
X, y, test_veľkosť=0.20, náhodný_stav=1, stratifikácia=y)
Model vreca slov správne klasifikuje správy v súbore údajov. Nebude však fungovať dobre pri klasifikácii vašich vlastných správ. Neberie do úvahy sémantický význam správ. Ak chcete klasifikovať iba správy v množine údajov, použite túto techniku.
Technika TF-IDF
Pojem frekvencia-inverzná frekvencia dokumentu (TF-IDF) funguje tak, že slovám v dokumente sa priraďujú váhy na základe toho, ako často sa objavujú. TF-IDF poskytuje slová, ktoré sa v dokumente vyskytujú často, ale v korpuse majú vyššiu váhu. To umožňuje algoritmom strojového učenia lepšie pochopiť význam 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_veľkosť=0.20, náhodný_stav=1, stratifikácia=y)
Na extrahovanie sémantického významu zo správ a klasifikáciu vlastných správ použite TF-IDF.
Vytvorenie a školenie vášho modelu
Začnite vytvorením a inicializáciou modelu Naive Bayes pomocou triedy scikit-learn MultinomialNB.
model = MultinomialNB()
Prispôsobte tréningové údaje, čo umožní modelu trénovať na tréningovej súprave:
model.fit (x_train, y_train)
Potom urobte predpovede na tréningových a testovacích súboroch pomocou metódy predpovedania.
train_pred = model.predict (x_train)
test_pred = model.predict (x_test)
Tieto predpovede vám pomôžu vyhodnotiť váš model.
Hodnotenie modelu
Vyhodnoťte výkon svojho modelu pomocou funkcieklasifikačný_report zo scikit-learn. Ako vstup odovzdajte predpovede tréningovej sady a skutočné označenia tréningovej sady. Urobte to isté pre testovaciu súpravu.
vytlačiť (správa o klasifikácii (vlak_pred, y_vlak))
print (classification_report (test_pred, y_test))
Čím vyššia je presnosť, vyvolanie a presnosť pre obe triedy, tým lepší je model.
Výsledky klasifikácie vašich vlastných správ
Transformujte správu na vektor pomocou techniky TF-IDF. Pomocou modelu predpovedajte, či je správa spam alebo ham, a potom túto predpoveď zobrazte na obrazovke.
vytlačiť ('Predpovedanie...')
správa = [„Vyhrali ste 10 000 dolárov, uveďte svoj účet
podrobnosti, aby sme mohli previesť peniaze"]
message_vector = tf.transform (správa)
category = model.predict (message_vector)
vytlačiť ("Správa je", "nevyžiadaná pošta"ak kategória == 1inak"nieje spam")
Nahraďte správu svojou vlastnou.
Výstup je nasledovný:
Model môže klasifikovať nové neviditeľné správy ako spam alebo ham.
Klasifikácia spamu v aplikáciách výzvam
Hlavnou výzvou, ktorej čelí klasifikácia spamu v aplikáciách, je nesprávna klasifikácia správ. Modely strojového učenia nie sú vždy správne. Môžu klasifikovať spam ako šunku a naopak. V prípade klasifikácie šunky ako spamu môže program odstrániť e-maily z doručenej pošty používateľa, čo spôsobí, že používateľ vynechá dôležité správy.