欢迎访问宙启技术站
智能推送

基于朴素贝叶斯算法的垃圾邮件过滤器的Python实现

发布时间:2023-12-25 17:50:08

垃圾邮件过滤器是一种用于自动识别和过滤垃圾邮件的软件工具。它可以通过分析邮件内容中的特征,如邮件的文本内容、发件人地址、邮件标题等,来判断邮件是否为垃圾邮件。朴素贝叶斯算法是一种常用的机器学习方法,在垃圾邮件过滤器中也有广泛的应用。

Python是一种非常适合机器学习和自然语言处理的编程语言,可以方便地实现垃圾邮件过滤器。下面是一个基于朴素贝叶斯算法的垃圾邮件过滤器的Python实现,并附带一个使用例子。

import os
import string
import math

# 加载训练数据,分为垃圾邮件和非垃圾邮件
def load_data(directory):
    spam_path = os.path.join(directory, 'spam')
    ham_path = os.path.join(directory, 'ham')
    spam_emails = []
    ham_emails = []

    for filename in os.listdir(spam_path):
        with open(os.path.join(spam_path, filename), 'r') as file:
            spam_emails.append(file.read())
    
    for filename in os.listdir(ham_path):
        with open(os.path.join(ham_path, filename), 'r') as file:
            ham_emails.append(file.read())

    return spam_emails, ham_emails

# 清洗邮件文本,去除标点符号和空格,并转为小写
def clean_text(text):
    for punctuation in string.punctuation:
        text = text.replace(punctuation, '')
    return text.lower()

# 训练朴素贝叶斯算法
def train(spam_emails, ham_emails):
    # 统计垃圾邮件和非垃圾邮件的数量
    spam_count = len(spam_emails)
    ham_count = len(ham_emails)

    # 将邮件内容进行清洗和分词处理
    spam_list = [clean_text(email).split() for email in spam_emails]
    ham_list = [clean_text(email).split() for email in ham_emails]

    # 统计垃圾邮件和非垃圾邮件中各个词的出现次数
    spam_word_counts = {}
    ham_word_counts = {}

    for email in spam_list:
        for word in email:
            if word not in spam_word_counts:
                spam_word_counts[word] = 0
            spam_word_counts[word] += 1
    
    for email in ham_list:
        for word in email:
            if word not in ham_word_counts:
                ham_word_counts[word] = 0
            ham_word_counts[word] += 1

    # 计算垃圾邮件和非垃圾邮件中各个词出现的概率
    spam_word_probs = {word: count / spam_count for word, count in spam_word_counts.items()}
    ham_word_probs = {word: count / ham_count for word, count in ham_word_counts.items()}

    # 计算垃圾邮件和非垃圾邮件的概率
    spam_prob = spam_count / (spam_count + ham_count)
    ham_prob = ham_count / (spam_count + ham_count)

    return spam_prob, ham_prob, spam_word_probs, ham_word_probs

# 使用训练好的模型进行预测
def predict(email, spam_prob, ham_prob, spam_word_probs, ham_word_probs):
    words = clean_text(email).split()
    spam_score = 0
    ham_score = 0

    for word in words:
        if word in spam_word_probs:
            spam_score += math.log(spam_word_probs[word])
        else:
            spam_score += math.log(1e-10)
        
        if word in ham_word_probs:
            ham_score += math.log(ham_word_probs[word])
        else:
            ham_score += math.log(1e-10)
    
    spam_score += math.log(spam_prob)
    ham_score += math.log(ham_prob)

    if spam_score > ham_score:
        return 'spam'
    else:
        return 'ham'

# 使用示例
spam_emails, ham_emails = load_data('data')
spam_prob, ham_prob, spam_word_probs, ham_word_probs = train(spam_emails, ham_emails)

# 测试邮件
test_email = "Get rich quick! Send money now!"
result = predict(test_email, spam_prob, ham_prob, spam_word_probs, ham_word_probs)
print(f"The email '{test_email}' is predicted as {result}")

在上面的代码中,load_data函数用于加载训练数据,根据指定的目录加载垃圾邮件和非垃圾邮件。clean_text函数用于清洗邮件文本,去除标点符号和空格,并将文本转为小写。train函数用于训练朴素贝叶斯算法,统计垃圾邮件和非垃圾邮件中每个词的出现次数,并计算词出现的概率。predict函数用于使用训练好的模型进行预测,根据邮件中词的概率和垃圾邮件与非垃圾邮件的概率,计算垃圾邮件和非垃圾邮件的得分,并返回预测结果。

在示例中,我们首先加载训练数据,然后训练朴素贝叶斯算法得到模型参数。接下来,我们使用一个测试邮件进行预测,并输出预测结果。根据邮件的内容,我们可以判断该邮件属于垃圾邮件还是非垃圾邮件。

通过上述Python实现,我们可以实现一个基于朴素贝叶斯算法的垃圾邮件过滤器,并使用训练好的模型对新的邮件进行预测。这种方法在实际应用中具有很高的可行性,可以帮助我们有效地过滤垃圾邮件,提高邮件处理效率。