Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

Na prawie każdej platformie do wysyłania wiadomości e-mail lub przesyłania wiadomości znajduje się filtr spamu. Filtr sprawdza każdą przychodzącą pocztę lub wiadomość i klasyfikuje ją jako spam lub ham. Twoja skrzynka odbiorcza wyświetla te, które należą do szynki. Odrzuca lub wyświetla osobno wiadomości, które wchodzą w zakres spamu.

Możesz stworzyć własny filtr antyspamowy, używając NLTK, regex i scikit-learn jako głównych bibliotek. Będziesz także potrzebować zestawu danych do trenowania modelu.

Zrozumienie swojego zbioru danych

„Klasyfikacja spamu dla podstawowego NLP” jest ogólnodostępna Zestaw danych Kaggle. Zawiera mieszankę spamu i wiadomości typu ham raw. Ma 5796 wierszy i 3 kolumny.

The KATEGORIA kolumna wskazuje, czy wiadomość jest spamem, czy hamem. Numer jeden oznacza spam, a zero oznacza szynkę. The WIADOMOŚĆ kolumna zawiera rzeczywistą surową pocztę. The

NAZWA PLIKU kategoria jest unikalnym identyfikatorem wiadomości.

Przygotowanie środowiska

Aby śledzić, musisz mieć podstawowa znajomość Pythona i uczenia maszynowego. Powinieneś także czuć się komfortowo we współpracy Współpraca Google lub Notatnik Jupytera.

W przypadku Jupyter Notebook przejdź do folderu, w którym ma się znajdować projekt. Utwórz nowe środowisko wirtualne i uruchom Jupyter Notebook z tego folderu. Google Colab nie potrzebuje tego kroku. Utwórz nowy notatnik w Google Colab lub Jupyter Notebook.

Pełny kod źródłowy i zestaw danych są dostępne w formacie Repozytorium GitHub.

Uruchom następujące magiczne polecenie, aby zainstalować wymagane biblioteki.

!pip install nltk scikit-learn regex numpy pandy

Będziesz używać:

  • NLTK dla przetwarzanie języka naturalnego (NLP).
  • scikit-learn, aby utworzyć model uczenia maszynowego.
  • regex do pracy z wyrażeniami regularnymi.
  • NumPy do pracy z tablicami.
  • Pandy do manipulowania twoim zbiorem danych.

Importuj biblioteki

Zaimportuj biblioteki zainstalowane w swoim środowisku. Zaimportuj bibliotekę wyrażeń regularnych jako re i scikit-learn jako sklearn.

import pandy Jak pd
import liczba Jak np
import nltk
z nltk.stem import WordNetLemmatyzator
z nltk.korpus import słowa kluczowe
import Odnośnie
z sklearn.model_selection import Train_test_split
z sklearn.metrics import klasyfikacja_raportu
z sklearn.feature_extraction.text import CountVectorizer
z sklearn.feature_extraction.text import TfidfVectorizer

Będziesz używać modułów WordNetLemmatizer i stopwords z NLTK do wstępnego przetwarzania nieprzetworzonych komunikatów w zbiorze danych. Podczas budowania modelu będziesz używać importowanych modułów sklearn.

Wstępne przetwarzanie danych

Wywołaj funkcję pandas read_csv, aby załadować zestaw danych. Upewnij się, że przechowujesz zestaw danych w tym samym katalogu co projekt. Wyświetl pierwsze pięć wierszy zestawu danych, aby uzyskać wizualizację zestawu danych.

df = pd.odczyt_csv(„/content/Spam E-mail nieprzetworzony tekst dla pliku NLP.csv”)
df.head()

Usuń kolumnę FILE_NAME zestawu danych. Nie jest to przydatna funkcja do klasyfikacji spamu.

df.drop('NAZWA PLIKU', oś=1, wstaw =PRAWDA)

Sprawdź liczbę wiadomości typu ham i spam w zbiorze danych. Pomoże to później określić, jak podzielić dane na potrzeby uczenia i testowania modelu.

df. CATEGORY.value_counts()

Pobierz stopwords korpusu z biblioteki NLTK. Stopwords to zestaw powszechnie występujących słów. Wstępne przetwarzanie usuwa je z wiadomości. Załaduj angielskie stopwords i zapisz je w zmiennej stopword.

nltk.pobierz(„wykluczone słowa”)
stopword = nltk.corpus.stopwords.words('język angielski')

Pobierz otwartą wielojęzyczną sieć WordNet. Jest to leksykalna baza danych angielskich słów i ich semantycznych znaczeń.

nltk.pobierz(„omw-1.4”)

Pobierz korpus wordneta. Użyjesz go do klasyfikacji tekstu. Utwórz instancję obiektu WordNetLemmatizer(). Obiekt wykorzystasz podczas lematyzacji. Lematyzacja to technika stosowana w NLP w celu sprowadzenia derywacyjnych form słów do ich słownikowych znaczeń.

Na przykład: skrócenie słowa „koty” da ci słowo „kot”. Słowo po lematyzacji staje się lematem.

nltk.pobierz('wordnet')
lemmatyzator = WordNetLemmatizer()

Utwórz pustą listę, której będziesz używać do przechowywania wstępnie przetworzonych wiadomości.

korpus=[]

Utwórz pętlę for, aby przetworzyć każdy komunikat w kolumnie MESSAGE zestawu danych. Usuń wszystkie znaki inne niż alfanumeryczne. Zamień wiadomość na małe litery. Podziel tekst na słowa. Usuń stopwords i zlematyzuj słowa. Przekształć słowa z powrotem w zdania. Dołącz wstępnie przetworzoną wiadomość do listy korpusu.

Do I W zasięg (dł. (df)):
# usunięcie wszystkich znaków niealfanumerycznych
wiadomość = re.sub('[^a-zA-Z0-9]', ' ', df['WIADOMOŚĆ'][I])

# konwertowanie wiadomości na małe litery
wiadomość = wiadomość.lower()

# dzielenie zdania na słowa w celu lematyzacji
wiadomość = wiadomość.split()

# usuwanie przestanków i lematyzacja
wiadomość = [lemmatizer.lemmatize (słowo) Do słowo W wiadomość
Jeśli słowo nieW set (stopwords.words('język angielski'))]

# Konwersja słów z powrotem do zdań
wiadomość = ' '.dołącz (wiadomość)

# Dodanie wstępnie przetworzonej wiadomości do listy korpusu
corpus.append (wiadomość)

Wykonanie tej pętli zajmie około pięciu minut. Etap lematyzowania i usuwania przechwytywanych słów zajmuje większość czasu. Przetworzyłeś teraz swoje dane.

Inżynieria funkcji przy użyciu modelu worka słów a technika TF-IDF

Inżynieria funkcji to proces przekształcania funkcji surowych danych w nowe funkcje odpowiednie dla modeli uczenia maszynowego.

Model worka słów

Model worka słów przedstawia dane tekstowe jako rozkład częstości słów występujących w dokumencie. Jest to po prostu liczba wystąpień słowa w dokumencie.

Użyj klasy CountVectorizer z scikit-learn, aby przekonwertować dane tekstowe na wektory liczbowe. Dopasuj korpus wstępnie przetworzonych komunikatów i przekształć korpus w rzadką macierz.

# Weź najlepsze 2500 funkcji 
cv = CountVectorizer (max_features=2500, ngram_zakres=(1,3))
X = cv.fit_transform (corpus).toarray()
y = df ['KATEGORIA']

Podziel przekształcone dane na zestawy treningowe i testowe. Wykorzystaj dwadzieścia procent danych do testowania i osiemdziesiąt procent do szkolenia.

x_pociąg, x_test, y_pociąg, y_test = pociąg_test_podział(
X, y, rozmiar_testu=0.20, stan_losowy=1, stratyfikacja=y)

Model worka słów poprawnie sklasyfikuje komunikaty w zbiorze danych. Ale nie sprawdzi się dobrze w klasyfikowaniu własnych wiadomości. Nie bierze pod uwagę semantycznego znaczenia wiadomości. Aby sklasyfikować tylko komunikaty w zbiorze danych, użyj tej techniki.

Technika TF-IDF

Funkcja Term Frequency-Inverse Document Frequency (TF-IDF) polega na przypisywaniu wag słowom w dokumencie na podstawie częstotliwości ich występowania. TF-IDF nadaje słowom, które często pojawiają się w dokumencie, ale są rzadkie w korpusie, wyższą wagę. Dzięki temu algorytmy uczenia maszynowego lepiej rozumieją znaczenie tekstu.

tf = TfidfVectorizer (ngram_range=(1,3), maks_cechy=2500)
X = tf.fit_transform (corpus).toarray()

x_pociąg, x_test, y_pociąg, y_test = pociąg_test_podział(
X, y, rozmiar_testu=0.20, stan_losowy=1, stratyfikacja=y)

Aby wyodrębnić znaczenie semantyczne z wiadomości i sklasyfikować własne wiadomości, użyj TF-IDF.

Tworzenie i trenowanie swojego modelu

Zacznij od utworzenia i zainicjowania modelu Naive Bayes przy użyciu klasy scikit-learn MultinomialNB.

model = Wielomian NB()

Dopasuj dane treningowe, umożliwiając trenowanie modelu na zbiorze treningowym:

model.fit (x_pociąg, y_pociąg)

Następnie wykonaj prognozy na zbiorach uczącym i testowym, używając metody przewidywania.

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

Te przewidywania pomogą Ci ocenić model.

Ocena modelu

Oceń wydajność swojego modelu za pomocą funkcji klasyfikacji_report z scikit-learn. Przekaż prognozy zestawu szkoleniowego i rzeczywiste etykiety zestawu szkoleniowego jako dane wejściowe. Zrób to samo dla zestawu testowego.

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

Im wyższa precyzja, pamięć i dokładność dla obu klas, tym lepszy model.

Wyniki klasyfikowania własnych wiadomości

Przekształć wiadomość w wektor za pomocą techniki TF-IDF. Użyj modelu, aby przewidzieć, czy wiadomość jest spamem, czy hamem, a następnie wyświetl tę prognozę na ekranie.

wydrukować(„Przewidywanie…”)

wiadomość = [„Wygrałeś 10 000 dolarów, podaj swoje konto
szczegóły, abyśmy mogli przelać pieniądze"]

wektor_wiadomości = tf.transform (wiadomość)
kategoria = model.przewidywanie (wektor wiadomości)
wydrukować(„Przesłanie jest”, "spam"Jeśli kategoria == 1w przeciwnym razie„nie spamować”)

Zastąp wiadomość własną.

Dane wyjściowe są następujące:

Model może klasyfikować nowe, niewidoczne wiadomości jako spam lub ham.

Wyzwanie w obliczu Klasyfikacja spamu w aplikacjach

Głównym wyzwaniem, przed którym stoi klasyfikacja spamu w aplikacjach, jest błędna klasyfikacja wiadomości. Modele uczenia maszynowego nie zawsze są poprawne. Mogą sklasyfikować spam jako ham i odwrotnie. W przypadku zaklasyfikowania ham jako spam program może usuwać wiadomości e-mail ze skrzynki odbiorczej użytkownika, powodując utratę ważnych wiadomości.