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

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

一、概述

在这篇博客中,我们将介绍如何搭建一个基于机器学习的垃圾邮件过滤系统。我们将使用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环境。在不同的邮件客户端中,整合方法可能会有所不同。具体的实现方法取决于所使用的邮件客户端及其支持的扩展方式。

 

目录
相关文章
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
193 4
|
18天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
50 5
|
2月前
|
机器学习/深度学习 API 计算机视觉
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
27 2
|
2月前
|
机器学习/深度学习 存储 算法
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
35 1
|
3月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
50 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于python 机器学习算法的二手房房价可视化和预测系统
文章介绍了一个基于Python机器学习算法的二手房房价可视化和预测系统,涵盖了爬虫数据采集、数据处理分析、机器学习预测以及Flask Web部署等模块。
119 2
基于python 机器学习算法的二手房房价可视化和预测系统
|
4月前
|
机器学习/深度学习 算法
【Deepin 20系统】机器学习分类算法模型xgboost、lightgbm、catboost安装及使用
介绍了在Deepin 20系统上使用pip命令通过清华大学镜像源安装xgboost、lightgbm和catboost三个机器学习分类算法库的过程。
54 4
|
4月前
|
机器学习/深度学习 数据可视化 数据处理
Python vs R:机器学习项目中的实用性与生态系统比较
【8月更文第6天】Python 和 R 是数据科学和机器学习领域中最受欢迎的两种编程语言。两者都有各自的优点和适用场景,选择哪种语言取决于项目的具体需求、团队的技能水平以及个人偏好。本文将从实用性和生态系统两个方面进行比较,并提供代码示例来展示这两种语言在典型机器学习任务中的应用。
97 1
|
6月前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
329 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
5月前
|
机器学习/深度学习 数据采集 运维
智能化运维:利用机器学习优化系统性能
在当今快速发展的信息技术时代,传统的运维方式已难以满足日益增长的业务需求和复杂性。本文将探讨如何通过机器学习技术来提升运维效率,确保系统的高可用性和性能优化。我们将深入分析机器学习模型在预测系统负载、自动故障检测与响应以及资源分配中的应用,并讨论实施这些策略时可能遇到的挑战和解决思路。

热门文章

最新文章