基于机器学习的垃圾邮件过滤系统

简介: 基于机器学习的垃圾邮件过滤系统

一、概述

在这篇博客中,我们将介绍如何搭建一个基于机器学习的垃圾邮件过滤系统。我们将使用Python编程语言和一些常见的机器学习库来完成这个项目。整个项目将分为以下几个部分:

1.  概述

2.  数据收集与预处理

3.  选择和训练机器学习模型

4.  评估模型性能

5.  部署模型到实际应用中

6. 整合到客户端

二、数据收集

2.1从SpamAssassin公共邮件语料库获取数据

https://spamassassin.apache.org/old/publiccorpus/)下载垃圾邮件和正常邮件数据。这里有多个压缩包,包含大量的邮件数据,我们需要解压并合并这些数据。

以下是一个简单的Python代码,用于下载和解压邮件数据:

import os
import tarfile
import urllib.request
# 下载数据集
def download_data(url, target_folder):
    if not os.path.exists(target_folder):
        os.makedirs(target_folder)
    file_name = url.split("/")[-1]
    target_path = os.path.join(target_folder, file_name)
    if not os.path.exists(target_path):
        urllib.request.urlretrieve(url, target_path)
        print(f"Downloaded {file_name}")
    return target_path
# 解压数据集
def extract_data(file_path, target_folder):
    with tarfile.open(file_path, "r:gz") as tar:
        tar.extractall(target_folder)
        print(f"Extracted {os.path.basename(file_path)} to {target_folder}")
# 下载并解压数据集
url_list = [
    "https://spamassassin.apache.org/old/publiccorpus/20021010_easy_ham.tar.bz2",
    "https://spamassassin.apache.org/old/publiccorpus/20021010_hard_ham.tar.bz2",
    "https://spamassassin.apache.org/old/publiccorpus/20021010_spam.tar.bz2"
]
target_folder = "data"
for url in url_list:
    file_path = download_data(url, target_folder)
    extract_data(file_path, target_folder)

2.2、数据预处理

2.2.1读取邮件数据

我们需要从解压后的文件夹中读取邮件数据。以下是一个简单的Python函数,用于读取邮件文件:

import os
import email
import email.policy
def read_email(file_path):
    with open(file_path, "rb") as f:
        return email.parser.BytesParser(policy=email.policy.default).parse(f)
ham_folder = "data/easy_ham"
spam_folder = "data/spam"
ham_files = [os.path.join(ham_folder, f) for f in os.listdir(ham_folder)]
spam_files = [os.path.join(spam_folder, f) for f in os.listdir(spam_folder)]
ham_emails = [read_email(f) for f in ham_files]
spam_emails = [read_email(f) for f in spam_files]

2.2.2文本预处理

我们需要对邮件正文进行文本预处理,包括清洗、标准化和向量化。以下是一个简单的Python代码,用于实现这些操作:

import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
from sklearn.feature_extraction.text import TfidfVectorizer
nltk.download('stopwords')
stemmer = SnowballStemmer("english")
stop_words = set(stopwords.words("english"))
# 清洗文本
def clean_text(text):
    text = re.sub(r'\W+', ' ', text)  # 移除非字母数字字符
    text = text.lower()  # 转换为小写
    text = re.sub(r'\d+', '', text)  # 移除数字
text = ' '.join([stemmer.stem(word) for word in text.split() if word not in stop_words])  # 移除停用词并进行词干提取
return text
# 提取邮件正文
def get_email_text(email_obj):
parts = []
for part in email_obj.walk():
if part.get_content_type() == 'text/plain':
parts.append(part.get_payload())
return ''.join(parts)
# 对所有邮件进行预处理
ham_texts = [clean_text(get_email_text(email)) for email in ham_emails]
spam_texts = [clean_text(get_email_text(email)) for email in spam_emails]
# 合并数据和标签
texts = ham_texts + spam_texts
labels = [0] * len(ham_texts) + [1] * len(spam_texts)
# 向量化文本
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(texts)
y = labels

至此,我们已经完成了数据收集和预处理的工作。我们得到了向量化的邮件数据X和对应的标签y。接下来,我们可以将这些数据用于训练机器学习模型,以实现垃圾邮件过滤功能。

三、选择模型

在本项目中,我们选择使用朴素贝叶斯模型。朴素贝叶斯分类器是基于贝叶斯定理的一种简单概率分类器,它假设特征之间相互独立。虽然这个独立性假设在实际应用中往往不成立,但朴素贝叶斯分类器在许多场景中仍然表现出良好的性能,特别是在文本分类任务中。

3.1、训练模型

我们将使用scikit-learn库中的MultinomialNB模块实现朴素贝叶斯模型,并在预处理后的数据集上进行训练。以下是训练模型的Python代码:

from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建朴素贝叶斯模型并训练
model = MultinomialNB()
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")

通过以上代码,我们已经实现了朴素贝叶斯模型的选择和训练。同时,我们也计算了模型在测试集上的准确率、精确率、召回率和F1分数,以评估模型的性能。在后续步骤中,我们将使用这个训练好的模型对实际邮件进行预测,判断邮件是否为垃圾邮件。

四、评估模型性能

4.1、分割数据集

我们将预处理后的数据集分为训练集和测试集,比例为80%和20%。这里我们使用scikit-learn库中的train_test_split函数来实现。这部分代码已经在训练模型的部分给出,如下:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

4.2、评估指标

我们使用准确率、精确率、召回率和F1分数等指标来评估模型性能。这部分代码同样已经在训练模型的部分给出,如下:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")

4.3、交叉验证

为了更准确地评估模型性能,我们可以使用交叉验证方法。在这里,我们使用scikit-learn库中的cross_val_score模块来实现交叉验证。以下是使用交叉验证评估模型性能的Python代码:

from sklearn.model_selection import cross_val_score
# 使用交叉验证计算评估指标
cv_accuracy = cross_val_score(model, X, y, cv=5, scoring='accuracy').mean()
cv_precision = cross_val_score(model, X, y, cv=5, scoring='precision').mean()
cv_recall = cross_val_score(model, X, y, cv=5, scoring='recall').mean()
cv_f1 = cross_val_score(model, X, y, cv=5, scoring='f1').mean()
print(f"Cross-Validation Accuracy: {cv_accuracy:.4f}")
print(f"Cross-Validation Precision: {cv_precision:.4f}")
print(f"Cross-Validation Recall: {cv_recall:.4f}")
print(f"Cross-Validation F1 Score: {cv_f1:.4f}")

通过以上代码,我们已经实现了模型性能的评估,包括数据集的划分、评估指标的计算和交叉验证。这些评估结果可以帮助我们了解模型的性能,以便在实际应用中更好地预测垃圾邮件。

五、部署模型到实际应用中

5.1、保存模型

我们可以使用Python的pickle库来实现模型的保存和加载。以下是保存模型的Python代码:

import pickle
# 保存模型
with open('spam_classifier_model.pkl', 'wb') as file:
    pickle.dump(model, file)
# 保存向量化器
with open('vectorizer.pkl', 'wb') as file:
    pickle.dump(vectorizer, file)

5.2、邮件处理

在实际应用中,我们需要对收到的电子邮件进行预处理,使其适应我们训练好的模型。这需要我们实现一个电子邮件处理函数,主要包括以下几个步骤:

  1. 提取电子邮件正文:从收到的邮件中提取正文内容。可以使用Python的email库来解析邮件并获取正文。
  2. 文本预处理:对提取出的正文内容进行与之前相同的预处理操作,包括清洗、标准化和向量化。
  3. 模型预测:使用训练好的模型对预处理后的邮件正文进行预测。根据预测结果判断邮件是否为垃圾邮件。

以下是实现邮件处理功能的Python代码:

import email
from email.message import EmailMessage
# 加载模型和向量化器
with open('spam_classifier_model.pkl', 'rb') as file:
    model = pickle.load(file)
with open('vectorizer.pkl', 'rb') as file:
    vectorizer = pickle.load(file)
# 邮件处理函数
def process_email(raw_email):
    # 解析邮件并提取正文
    email_obj = email.message_from_string(raw_email)
    email_text = get_email_text(email_obj)
    # 文本预处理
    cleaned_text = clean_text(email_text)
    vectorized_text = vectorizer.transform([cleaned_text])
    # 使用模型预测
    prediction = model.predict(vectorized_text)
    return "Spam" if prediction[0] == 1 else "Ham"
# 示例:读取邮件文本并使用处理函数判断是否为垃圾邮件
with open('example_email.txt', 'r') as file:
    raw_email = file.read()
result = process_email(raw_email)
print(f"Result: {result}")

通过以上代码,我们已经实现了部署模型到实际应用中的功能。我们可以将这些代码集成到一个电子邮件客户端或服务器中,以实现实时的垃圾邮件过滤。

六、整合到邮件客户端

为了方便使用,我们可以将垃圾邮件过滤器整合到现有的邮件客户端中。这需要我们实现一个插件或扩展,用于在收到新邮件时自动调用我们的垃圾邮件过滤器进行处理。具体的实现方法取决于所使用的邮件客户端。

在这里,我们以Microsoft Outlook为例,介绍如何将垃圾邮件过滤器整合到邮件客户端中。Outlook支持VBA(Visual Basic for Applications)宏,我们可以利用VBA宏来调用我们的Python垃圾邮件过滤器。具体的实现方法如下:

6.1、创建一个Outlook宏

  1. 打开Outlook,点击“开发者”选项卡。如果没有看到“开发者”选项卡,可以在“文件”->“选项”->“自定义功能区”中启用它。
  2. 点击“Visual Basic”按钮,打开VBA编辑器。
  3. 在VBA编辑器的左侧,双击“这个Outlook会话”,打开代码编辑窗口。
  4. 在代码编辑窗口中,输入以下代码:
Option Explicit
Sub ProcessNewEmail(Item As Outlook.MailItem)
    ' 调用Python脚本处理邮件,并获得预测结果
    Dim result As String
    result = RunPythonScript("process_email.py", Item.Body)
    ' 根据预测结果处理邮件
    If result = "Spam" Then
        ' 将邮件移动到垃圾邮件文件夹
        Dim spamFolder As Outlook.MAPIFolder
        Set spamFolder = Application.Session.GetDefaultFolder(olFolderJunk)
        Item.Move spamFolder
    End If
End Sub
  1. 点击“文件”->“保存这个Outlook会话”。

6.2、创建一个Python脚本

6.2.1新建一个Python脚本文件process_email.py,将之前实现的邮件处理函数process_email放入其中。同时,需要修改函数使其接受邮件正文作为参数,并在处理完后将预测结果输出到标准输出。

import sys
def process_email(email_text):
    # ...
    # 文本预处理和模型预测的代码
    # ...
    return "Spam" if prediction[0] == 1 else "Ham"
if __name__ == "__main__":
    email_text = sys.argv[1]
    result = process_email(email_text)
    print(result)

6.2.2将process_email.py和训练好的模型文件以及向量化器文件放在同一个文件夹中。

6.3、调用Python脚本

6.3.1为了在VBA中调用Python脚本,我们需要创建一个名为RunPythonScript的函数,用于执行Python脚本并返回结果。在VBA编辑器的代码编辑窗口中输入以下代码:

Function RunPythonScript(scriptPath As String, emailBody As String) As String
    Dim shell As Object
    Dim command As String
    Dim tempFile As String
    Dim fso As Object
    Dim file As Object
    Dim result As String
    ' 创建一个临时文件用于存储Python脚本的输出
    Set fso = CreateObject("Scripting.FileSystemObject")
    tempFile = fso.GetSpecialFolder(2) & "\" & fso.GetTempName
    ' 构建命令行
command = "python " & scriptPath & " """ & emailBody & """" & " > " & tempFile
' 执行命令行
Set shell = CreateObject("WScript.Shell")
shell.Run command, 0, True
' 读取临时文件中的输出结果
Set file = fso.OpenTextFile(tempFile, 1)
result = file.ReadAll
file.Close
' 删除临时文件
fso.DeleteFile tempFile
' 返回结果
RunPythonScript = Trim(result)

6.4、创建邮件规则

1. 返回Outlook主界面,点击“规则”->“管理规则和警报”。

2. 点击“新建规则”,选择“通过特定帐户接收的邮件”。

3. 选择你的电子邮件帐户,然后点击“下一步”。

4. 不需要设置任何条件,直接点击“下一步”,选择“是”。

5. 选择“运行一个脚本”,然后点击“脚本”链接。

6. 在弹出的窗口中,选择刚刚创建的`ProcessNewEmail`宏,点击“确定”。

7. 点击“完成”以保存规则。

现在,当你收到新邮件时,Outlook会自动调用我们的垃圾邮件过滤器进行处理。如果邮件被判断为垃圾邮件,它将被移动到垃圾邮件文件夹。

需要注意的是,这种方法依赖于在本地安装的Python环境。在不同的邮件客户端中,整合方法可能会有所不同。具体的实现方法取决于所使用的邮件客户端及其支持的扩展方式。

 

目录
相关文章
|
5月前
|
机器学习/深度学习 存储 运维
机器学习异常检测实战:用Isolation Forest快速构建无标签异常检测系统
本研究通过实验演示了异常标记如何逐步完善异常检测方案和主要分类模型在欺诈检测中的应用。实验结果表明,Isolation Forest作为一个强大的异常检测模型,无需显式建模正常模式即可有效工作,在处理未见风险事件方面具有显著优势。
422 46
|
10月前
|
人工智能 自然语言处理 安全
通过阿里云Milvus与PAI搭建高效的检索增强对话系统
阿里云向量检索Milvus版是一款全托管的云服务,兼容开源Milvus并支持无缝迁移。它提供大规模AI向量数据的相似性检索服务,具备易用性、可用性、安全性和低成本等优势,适用于多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等场景。用户可通过PAI平台部署RAG系统,创建和配置Milvus实例,并利用Attu工具进行可视化操作,快速开发和部署应用。使用前需确保Milvus实例和PAI在相同地域,并完成相关配置与开通服务。
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
822 4
|
8月前
|
存储 人工智能 自然语言处理
基于QwQ-32B+Hologres+PAI搭建 RAG 检索增强对话系统
本文介绍如何使用PAI-EAS部署基于QwQ大模型的RAG服务,并关联Hologres引擎实例。Hologres与达摩院自研高性能向量计算软件库Proxima深度整合,支持高性能、低延时、简单易用的向量计算能力。通过PAI-EAS,用户可以一键部署集成大语言模型(LLM)和检索增强生成(RAG)技术的对话系统服务,显著缩短部署时间并提升问答质量。具体步骤包括准备Hologres向量检索库、部署RAG服务、通过WebUI页面进行模型推理验证及API调用验证。Hologres支持高性能向量计算,适用于复杂任务的动态决策,帮助克服大模型在领域知识局限、信息更新滞后和误导性输出等方面的挑战。
|
8月前
|
人工智能 自然语言处理 API
Hologres × PAI × DeepSeek 搭建 RAG 检索增强对话系统
本文介绍如何使用PAI-EAS部署基于DeepSeek大模型的RAG(检索增强生成)服务,并关联Hologres引擎实例。Hologres与阿里云自研高性能向量计算软件库Proxima深度整合,支持高性能、低延时的向量计算能力。通过PAI-EAS,用户可以一键部署集成了大语言模型和RAG技术的对话系统服务,显著缩短部署时间,并提高问答质量。部署步骤包括准备Hologres向量检索库、部署基于DeepSeek的RAG服务、通过WebUI进行模型推理验证,以及通过API调用进行模型推理验证。Hologres还提供了特色功能支持,如高性能向量计算等。
|
9月前
|
人工智能 自然语言处理 安全
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统
基于阿里云向量检索 Milvus 版与 PAI 搭建高效的检索增强生成(RAG)系统
213 0
|
11月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
640 4
|
12月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
331 1
|
10月前
|
人工智能 运维 API
PAI企业级能力升级:应用系统构建、高效资源管理、AI治理
PAI平台针对企业用户在AI应用中的复杂需求,提供了全面的企业级能力。涵盖权限管理、资源分配、任务调度与资产管理等模块,确保高效利用AI资源。通过API和SDK支持定制化开发,满足不同企业的特殊需求。典型案例中,某顶尖高校基于PAI构建了融合AI与HPC的科研计算平台,实现了作业、运营及运维三大中心的高效管理,成功服务于校内外多个场景。
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
366 5

热门文章

最新文章

下一篇
oss云网关配置