Използване на байесов филтър за спам за класифициране на имейли в Python

Използване на байесов филтър за спам

Aspose.Email предоставя функционалност за филтриране на имейли, използвайки байесов спам анализатор. Той предоставя SpamAnalyzer клас за тази цел. Тази статия показва как да обучите филтъра да разграничава спам и обикновени имейли, базирано на речникова база данни.

  1. Посочете пътищата до папките за хам имейли (ham_folder), спам имейли (spam_folder), тестови имейли (test_folder) и файла с база данни (database_file) за спам филтъра.
  2. Определете помощната функция print_result за отпечатване дали съобщението е класифицирано като спам или не, въз основа на изчислената вероятност за спам.
  3. Създайте Spam Analyzer, обучете го с имейлите от ham_folder (не спам) и spam_folder (спам), използвайки метода ’train_filter(message, is_spam)’, след което запазете обучената база данни с ‘save_database(file_path)’.
  4. Създайте Spam Analyzer, възстановете обучената база данни с ’load_database(file_path)’, заредете .eml файловете от ’test_folder’, анализирайте всеки с ’test(message)’, за да получите вероятността за спам, и отпечатайте темата на имейла и класификацията, използвайки ‘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)