Używanie bayesowskiej filtracji spamu do klasyfikacji e‑maili w Pythonie

Używanie bayesowskiej filtracji spamu

Aspose.Email zapewnia funkcjonalność filtrowania e‑maili przy użyciu bayesowskiego analizatora spamu. Dostarcza SpamAnalyzer klasa do tego celu. Ten artykuł pokazuje, jak wytrenować filtr, aby odróżniał spam od zwykłych e‑maili na podstawie bazy słów.

  1. Określ ścieżki folderów dla e‑maili nie‑spamowych (ham_folder), e‑maili spamowych (spam_folder), testowych e‑maili (test_folder) oraz pliku bazy danych (database_file) dla filtru spamu.
  2. Zdefiniuj funkcję pomocniczą print_result aby wypisać, czy wiadomość jest sklasyfikowana jako spam, czy nie, w oparciu o obliczone prawdopodobieństwo spamu.
  3. Utwórz Spam Analyzer, wytrenuj go na e-mailach z ham_folder (nie spam) i spam_folder (spam) przy użyciu metody ’train_filter(message, is_spam)’, a następnie zapisz wytrenowaną bazę danych metodą ‘save_database(file_path)’.
  4. Utwórz Spam Analyzer, przywróć wytrenowaną bazę danych metodą ’load_database(file_path)’, wczytaj pliki .eml z ’test_folder’, przeanalizuj każdy metodą ’test(message)’, aby uzyskać prawdopodobieństwo spamu, i wydrukuj temat e-maila oraz klasyfikację przy użyciu ‘print_result’.
import os

from aspose.email import MailMessage
from aspose.email.antispam import SpamAnalyzer

ham_folder = "hamFolder"
spam_folder = "spamFolder"
test_folder = "testFolder"
database_file = "SpamFilterDatabase.txt"

def print_result(probability):
    if probability >= 0.5:
        print("The message is classified as spam.")
    else:
        print("The message is classified as not spam.")
    print("Spam Probability: " + str(probability))
    print()

def train_from_directory(analyzer, folder, is_spam):
    for file in os.listdir(folder):
        if file.endswith(".eml"):
            analyzer.train_filter(MailMessage.load(os.path.join(folder, file)), is_spam)

def teach_and_create_database(ham_folder, spam_folder, database_file):
    analyzer = SpamAnalyzer()
    train_from_directory(analyzer, ham_folder, False)
    train_from_directory(analyzer, spam_folder, True)
    analyzer.save_database(database_file)

teach_and_create_database(ham_folder, spam_folder, database_file)

test_files = [f for f in os.listdir(test_folder) if f.endswith(".eml")]
analyzer = SpamAnalyzer()
analyzer.load_database(database_file)

for file in test_files:
    file_path = os.path.join(test_folder, file)
    msg = MailMessage.load(file_path)
    print(msg.subject)
    probability = analyzer.test(msg)
    print_result(probability)