Använda Bayesiansk spamfiltrering för att klassificera e-post i Python

Använda Bayesiansk spamfiltrering

Aspose.Email tillhandahåller e‑postfiltreringsfunktionalitet med en Bayesiansk spam‑analysator. Den erbjuder SpamAnalyzer klass för detta ändamål. Denna artikel visar hur man tränar filtret för att särskilja spam från vanlig e‑post baserat på en orddatabas.

  1. Ange sökvägarna till mapparna för ham‑e‑post (ham_folder), spam‑e‑post (spam_folder), test‑e‑post (test_folder) samt databasfilen (database_file) för spamfiltret.
  2. Definiera hjälpfunktionen print_result för att skriva ut om ett meddelande klassificeras som spam eller inte baserat på den beräknade spam‑sannolikheten.
  3. Skapa en Spam Analyzer, träna den med e‑postmeddelandena från ham_folder (inte spam) och spam_folder (spam) med metoden ’train_filter(message, is_spam)’, spara sedan den tränade databasen med ‘save_database(file_path)’.
  4. Skapa en Spam Analyzer, återställ den tränade databasen med ’load_database(file_path)’, ladda .eml-filerna från ’test_folder’, analysera var och en med ’test(message)’ för att få spam‑sannolikheten, och skriv ut e‑postens ämne och klassificering med ‘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)