基于卷积神经网络(CNN)的垃圾邮件过滤方法

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 传统的垃圾邮件过滤手段如规则匹配常因垃圾邮件的多变而失效。基于深度学习的方法,特别是卷积神经网络(CNN),能自动学习邮件中的复杂特征,有效识别垃圾邮件的新形态。CNN通过特征学习、处理复杂结构、良好的泛化能力和适应性,以及高效处理大数据的能力,显著提升了过滤精度。在文本分类任务中,CNN通过卷积层提取局部特征,池化层减少维度,全连接层进行分类,特别适合捕捉文本的局部模式和顺序信息,从而构建高效的垃圾邮件过滤系统。

传统的垃圾邮件过滤方法通常基于规则、关键词匹配和黑名单,但这些方法往往无法应对不断变化的垃圾邮件形式和策略。基于深度学习的垃圾邮件过滤系统可以通过学习邮件的语义和上下文特征,具备较高的适应性和准确性,能够不断适应新的垃圾邮件形式和策略。

深度学习在垃圾邮件分类的潜力主要表现在以下几个方面:

  1. 特征学习:深度学习模型,尤其是卷积神经网络(CNN)和循环神经网络(RNN),能够从原始数据中自动学习复杂的特征。这意味着它们可以识别垃圾邮件中的模式,如特定的单词、短语或语言结构,而无需人工设计特征。
  2. 处理复杂性:垃圾邮件往往包含复杂的结构和语义信息,深度学习模型能够处理这种复杂性,捕捉到传统机器学习方法可能忽略的细微差别。
  3. 泛化能力:深度学习模型通常具有良好的泛化能力,能够在未见过的数据上做出准确的预测,这对于不断变化的垃圾邮件模式尤为重要。
  4. 适应性:随着时间的推移,垃圾邮件发送者会采用新的策略来规避过滤系统。深度学习模型可以通过继续学习新的数据来适应这些变化。
  5. 大规模数据处理能力:深度学习模型可以处理大规模数据集,这对于训练强大的垃圾邮件过滤模型是必要的。

卷积神经网络(Convolutional Neural Networks, CNN)

卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。

卷积神经网络应用的领域:

  1. 图像分类:CNN是处理图像数据的主流方法,用于将图像分类到特定的类别。
  2. 目标检测:在图像中识别和定位多个目标,例如,识别图像中的所有猫并围绕它们绘制边界框。
  3. 文本分类:尽管文本数据不像图像那样具有网格状结构,但CNN也可以用于文本数据的分类任务,如情感分析、主题分类等。
  4. 自然语言处理(NLP):在NLP中,CNN可以用于句子或文档级别的分类任务,以及某些类型的语言模型。

    在文本分类任务中,CNN通常由输入层、卷积层、池化层、全连接层和Softmax层构成。相比传统神经网络,CNN具有强大的局部特征提取能力,并且参数共享的特点大大减少了网络训练参数,提高了模型效率。
    在文本分类中,传统机器学习方法容易丢失原始文本序列中的顺序信息。而使用卷积神经网络时,它可以将文本转化为词向量,并在扩展到相同维度后形成词向量矩阵。然后,利用卷积窗口对向量矩阵中的特征进行提取,从而保留原始文本的局部特征和顺序信息。

CNN的总体架构总共有四个部分:输入层,卷积层,池化层,全连接层 。

  1. 输入层是CNN的第一层,负责接收原始输入数据。在图像处理任务中,输入层通常接收图像的原始像素值,形成三维数据(高度、宽度和颜色通道数)。
  2. 卷积层是CNN的核心,用于从输入数据中提取局部特征。通过在输入数据上滑动一系列可学习的卷积核(或滤波器),卷积层能够捕捉到图像中的局部模式,如线条、角点等。
    卷积层通常包含多个不同的卷积核,每个卷积核负责提取不同的特征,输出结果称为特征映射(Feature Maps)。
  3. 池化层(Pooling Layer),通常跟在卷积层之后,用于降低特征的空间维度,减少参数数量和计算量,同时提高网络对输入变化的不变性。最常见的池化操作是最大池化(Max Pooling),它在输入数据的局部区域内选择最大值作为输出,有助于提取重要的特征并抑制不相关的变化。
  4. 全连接层(Fully Connected Layer, FC)通常位于CNN的末端,用于将前面层提取的特征映射到最终的输出结果,如分类任务中的类别概率。在全连接层中,每个输入神经元都与每个输出神经元相连,这允许网络学习特征之间的复杂关系。在全连接层之前,通常需要将卷积层和池化层的输出展平(Flatten)为一维向量,以便进行全连接的计算。

基于CNN的代码实现

①:数据读取、分析、预处理

import pickle

import numpy as np

with open('../data/mailContent_list_1000.pickLe', 'rb') as file:
    content_list = pickle.load(file)
with open('../data/mailLabel_list_1800.pickle', 'rb') as file:
    label_list = pickle.load(file)


def statistics():
    # 查看邮件最大长度和平均长度
    length = np.array([len(tmp) for tmp in content_list])
    print(np.max(length))  # 33714
    print(np.mean(length))  # 752
    print(np.median(length))  # 333
    # 统计汉字个数
    print(len(set(''.join(content_list))))  # 9777

class TextData():
    def init__(self, *args):
        content_list = args[8]
        label_list = args[1]
        train_X, test_X, train_y, test_y = train_test_split(content_list, label_list, randon_state=1234)
        self.train_content_list = train_X
        self.train_label_list = train_y
        self.test_content_list = test_X
        self.test_label_list = test_y
        self.content_list = self.train_content_list
        self.test_content_list
        self.num_classes = np.unique(self.train_label_list + self.test_label_list).shape[8]
        self.enbedding_din = 64  # 词向维度
        self.seq_length = 180

    def __prepare_data(self):
        # 获取词汇表,更新词汇大小和内容长度
        counter = Counter(''.join(self.content_list))
        vocabulary_list = ['PAD'] + [k[8] for k in counter.most_common()]
        # 出现次数倒序排列
        self.vocab_size = len(vocabulary_list)
        # 构建词-id的映射,将label转为0和1
        self.mord2id_dict = dict([(b, a) for a, b in enumerate(vocabulary_list)])
        self.label_encoder = LabelEncoder()
        self.label_encoder.fit(self.train_label_list)  # ham和spam转为0和1
        self.labels = self.label_encoder.classes_

    # 给每封邮件添加padding(在前)
    def __content2x(self, content_list):
        idlist_list = [[self.mord2id_dict[word] for word in content if word in self.word2id_dict] for content in
                       content_list]
        X = kr.preprocessing.sequence.pad_sequences(idlist_list, self.seq_length)
        return X

②:使用cnn模型进行训练与测试


class CNN(nn.Module):
    def _init_(self, embedding_dim, vocab_size, num_filters, kernel_size, hidden_dim, dropout_keep_prob, num_classes):
        super(CNN, self).__init__()
        self.embeds = nn.Embedding(vocab_size, embedding_dim)  # 随机词向量
        self.conv = nn.Convld(in_channels=embedding_dim, 
                              out_channels=num_filters,  # 通道数即过滤器个数
                              kernel_size=kernel_size)
        self.maxpool = nn.AdaptiveMaxPoolld(1)
        self.dense = nn.Linear(num_filters, hidden_dim)
        self.dropout = nn.Dropout(dropout_keep_prob)
        self.relu = nn.ReLU()
        self.dense2 = nn.Linear(hidden_dim, num_classes)


    def forward(self, x):
        x = self.embeds(x)  # train_size*seq_length*embedding_dim
        x = x.permute(0, 2, 1)  # train_size*embedding_dim*seq_length
        x = self.conv(x)  # train_size*num_filters*conv(seq_length)
        x = self.maxpool(x)[:, :, 0]  # train_size*num_filters
        x = self.dense(x)  # train_size*hidden_dim
        x = self.dropout(x)
        x = self.relu(x)
        x = self.dense2(x)  # train_size*num_classes
        return x


    def cnn_train(self):
        max_accuracy = 0

        for i in range(self.config['num_iteration']):
            selected_index = random.sample(list(range(len(self.train_X))), k=self.config['batch_size'])
            batch_X = self.train_X[selected_index].to(self.device)
            batch_Y = self.train_Y[selected_index].to(self.device)
            outputs = self.cnn(batch_X)
            self.optimizer.zero_grad()
            loss = self.criterion(outputs, batch_Y)
            loss.backward()  # 反向传播计算梯度
            self.optimizer.step()  # 应用计算出的梯度并更新模型权重
            step = i + 1
            if step % self.config['print_per_batch'] == 0 or step == 1:
                loss, accuracy = self.evaluate(self.criterion, outputs, batch_Y)
                print('step: %d loss: %.4f accuracy: %.4f'(step, loss, accuracy))
                if accuracy > max_accuracy:
                    max_accuracy = accuracy
                    torch.save(self.cnn.state_dict(), '../model/best_cnn. pkl')

    def cnn_test(self):
        with torch.no_grad():
            self.cnn.load_state_dict(torch.Load('../model/best_cnn.pkl'))
            outputs = self.cnn(self.test_X.to(self.device))
            test_Y = self.test_Y.to(self.device)
            loss, accuracy = self.evaluate(self.criterion, outputs, test_Y)
            print('test loss: %.4f accuracy: %.4f' % (loss, accuracy))
            outputs = torch.argmax(outputs, 1)
            self.print_report_table(outputs, test_Y, self.config['labels'])
            self.print_confusion_matrix(outputs, test_Y, self.config['labels'])
            self.plot_roc_curve(outputs, test_Y)

结果与分析

模型评估的【F1】结果截图
image.png

目录
相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
深度解析:基于卷积神经网络的宠物识别
宠物识别技术随着饲养规模扩大而兴起,传统手段存在局限性,基于卷积神经网络的宠物识别技术应运而生。快瞳AI通过优化MobileNet-SSD架构、多尺度特征融合及动态网络剪枝等技术,实现高效精准识别。其在智能家居、宠物医疗和防走失领域展现广泛应用前景,为宠物管理带来智能化解决方案,推动行业迈向新高度。
|
10天前
计算网络号的直接方法
子网掩码用于区分IP地址中的网络部分和主机部分,连续的“1”表示网络位,“0”表示主机位。例如,255.255.255.0 的二进制为 11111111.11111111.11111111.00000000,前24位是网络部分。通过子网掩码可提取网络号,如 IP 192.168.1.10 与子网掩码 255.255.255.0 的网络号为 192.168.1.0。此外,文档还介绍了十进制与二进制间的转换方法,帮助理解IP地址的组成与计算。
43 11
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
|
2月前
|
机器学习/深度学习 算法 JavaScript
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
|
2月前
|
缓存 数据中心 网络架构
5个减少网络延迟的简单方法
高速互联网对工作与娱乐至关重要,延迟和断线会严重影响效率和体验。本文探讨了导致连接缓慢的三个关键因素:吞吐量、带宽和延迟,并提供了减少延迟的实用方法。包括重启设备、关闭占用带宽的程序、使用有线连接、优化数据中心位置以及添加内容分发网络 (CDN) 等策略。虽然完全消除延迟不可能,但通过这些方法可显著改善网络性能。
444 7
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
害虫识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了12种常见的害虫种类数据集【"蚂蚁(ants)", "蜜蜂(bees)", "甲虫(beetle)", "毛虫(catterpillar)", "蚯蚓(earthworms)", "蜚蠊(earwig)", "蚱蜢(grasshopper)", "飞蛾(moth)", "鼻涕虫(slug)", "蜗牛(snail)", "黄蜂(wasp)", "象鼻虫(weevil)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Djan
160 1
基于Python深度学习的【害虫识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
2月前
|
机器学习/深度学习 数据安全/隐私保护
基于神经网络逆同步控制方法的两变频调速电机控制系统matlab仿真
本课题针对两电机变频调速系统,提出基于神经网络a阶逆系统的控制方法。通过构造原系统的逆模型,结合线性闭环调节器实现张力与速度的精确解耦控制,并在MATLAB2022a中完成仿真。该方法利用神经网络克服非线性系统的不确定性,适用于参数变化和负载扰动场景,提升同步控制精度与系统稳定性。核心内容涵盖系统原理、数学建模及神经网络逆同步控制策略,为工业自动化提供了一种高效解决方案。
|
2月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
96 12
|
2月前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。