Bayesiaanse spamfiltering gebruiken om e-mails te classificeren in Python

Bayesiaanse spamfiltering gebruiken

Aspose.Email biedt e-mailfilterfunctionaliteit met behulp van een Bayesiaanse spam-analyzer. Het biedt de SpamAnalyzer klasse voor dit doel. Dit artikel laat zien hoe de filter te trainen om spam en reguliere e-mail te onderscheiden op basis van een woorden-database.

  1. Specificeer de mappaden voor de ham-e-mails (ham_folder), spam-e-mails (spam_folder), test-e-mails (test_folder) en het databasebestand (database_file) voor de spamfilter.
  2. Definieer de hulpfunctie print_result om af te drukken of een bericht als spam is geclassificeerd of niet, op basis van de berekende spamkans.
  3. Maak een Spam Analyzer, train deze met de e‑mails uit ham_folder (geen spam) en spam_folder (spam) via de methode ’train_filter(message, is_spam)’, sla vervolgens de getrainde database op met ‘save_database(file_path)’.
  4. Maak een Spam Analyzer, herstel de getrainde database met ’load_database(file_path)’, laad de .eml‑bestanden uit ’test_folder’, analyseer elk met ’test(message)’ om de spam‑kans te krijgen, en print het e‑mailonderwerp en de classificatie met ‘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)