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.