垃圾邮件检测_TF-IDF分析,聚类分析与朴素贝叶斯

news2024/12/26 14:28:24

数据入口:基于机器学习的垃圾信息识别分类 - Heywhale.com

本数据集专为邮件和短信的垃圾信息分类设计,适合建立垃圾邮件检测模型。

数据说明

字段名说明
message_content邮件或短信的正文内容
is_spam标签,指示该消息是否为垃圾信息(1表示垃圾邮件,0表示非垃圾邮件)

在本文中主要包含垃圾和非垃圾邮件模式剖析以及利用机器学习模型对垃圾邮件过滤器进行训练和测试。

一:垃圾邮件模式分析

为了分析垃圾邮件中的常见模式,例如促销优惠、钓鱼攻击等,接下来我们可以仅选择标签为1的垃圾邮件,并对这些邮件的内容进行文本分析。首先,我们可以使用TF-IDF技术来识别垃圾邮件中的关键词。这将帮助我们了解哪些词在垃圾邮件中最常见。然后,我们可以使用一些基本的文本处理技术,如分词和去除停用词,来进一步分析文本数据。最后,我们将总结垃圾邮件中的常见模式。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np

file_path = 'spam_dataset.csv'
data = pd.read_csv(file_path)

spam_messages = data[data['is_spam'] == 1]['message_content']

vectorizer = TfidfVectorizer(max_features=20, stop_words='english')
X = vectorizer.fit_transform(spam_messages)

feature_names = vectorizer.get_feature_names_out()

top_words = np.argsort(X.sum(axis=0)).flatten()[::-1]
top_words_in_spam = [feature_names[i] for i in top_words]

top_words_in_spam

从TF-IDF分析中,我们可以看到垃圾邮件中最常见的词汇包括:“avoid”, “verify”, “fast”, “win”, “free”, “time”, “special”, “limited”, “account”, “claim”, “offer”, “don’t”, “miss”, “act”, “click”, “directly”, “visit”, “website”, “contact”, 和 “details”。

这些词汇可以帮助我们识别垃圾邮件的一些常见模式,例如:

  • 促销优惠:词汇如 “free”, “special”, “limited”, “offer”, “act now” 和 “time” 通常与促销优惠相关。
  • 钓鱼攻击:词汇如 “verify”, “account”, “claim” 和 “details” 可能表明这是一封钓鱼邮件,试图获取个人信息。
  • 紧急性:词汇如 “fast”, “don’t miss” 和 “directly” 通常用来创造紧迫感,促使收件人迅速采取行动。

要进一步细分垃圾邮件类型,我们可以使用无监督学习技术,如聚类分析。我们可以使用TF-IDF向量作为聚类的特征。选择一个合适的聚类算法,如K-means,并选择一个合适的聚类数量。最后对聚类结果进行解释,以识别不同的垃圾邮件类型。

from sklearn.cluster import KMeans

X_spam = X.todense()
num_clusters = 3
X_spam_array = np.array(X_spam)

kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(X_spam_array)

cluster_labels = kmeans.labels_

data_spam = data[data['is_spam'] == 1]
data_spam['cluster_label'] = cluster_labels

data_spam.head()

我们已经成功地对垃圾邮件进行了聚类分析,并将聚类标签添加到了数据框中。现在,我们可以进一步分析每个聚类中的邮件内容,以识别不同的垃圾邮件类型。为了更好地理解每个聚类的内容,我们可以为每个聚类提取一些代表性的关键词。这将帮助我们识别每个聚类的主题或模式。

from sklearn.cluster import KMeans

X_spam = X.todense()
num_clusters = 3
X_spam_array = np.array(X_spam)

kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(X_spam_array)

cluster_labels = kmeans.labels_

data_spam = data[data['is_spam'] == 1]
data_spam['cluster_label'] = cluster_labels

data_spam.head()

根据聚类分析,我们可以将垃圾邮件分为以下几种类型:

集群 0

关键词:‘click’, ‘details’, ‘contact’, ‘website’, ‘visit’

描述:这个集群可能与引导点击链接有关,可能是为了收集个人信息或引导到恶意网站。

集群 1

关键词:‘limited’, ‘time’, ‘offer’, ‘free’, ‘act’

描述:这个集群可能与促销优惠有关,强调时间的紧迫性和免费优惠。

集群 2

关键词:‘verify’, ‘account’, ‘avoid’, ‘details’, ‘contact’

描述:这个集群可能与钓鱼攻击有关,试图诱骗收件人提供账户信息或其他个人信息。

请注意,这些类型是基于文本内容的初步分析,更深入的分析可能需要考虑更多的上下文信息。

二:非垃圾邮件模式分析

为了分析非垃圾邮件模式,首先我们将筛选出非垃圾邮件(标记为0的邮件)。接下来,我们将对非垃圾邮件的内容进行分析,以识别常见的内容格式,如会议提醒、项目更新等。最后,我们将总结分析结果,并考虑如何以可视化的方式展示这些信息。

non_spam_messages = data[data['is_spam'] == 0]['message_content']
non_spam_messages.head()

我们已经筛选出了非垃圾邮件。接下来,我们将对这些邮件的内容进行分析,以识别常见的内容格式,如会议提醒、项目更新等。由于这是一个文本分析任务,我们可以考虑使用自然语言处理(NLP)技术来帮助我们识别邮件中的模式和主题。一种简单的方法是查看邮件中经常出现的词汇和短语,这可以帮助我们了解邮件的一般内容和格式。让我们开始分析邮件内容,并尝试识别常见的词汇和短语。

from collections import Counter
import re

words = []
for message in non_spam_messages:
    words.extend(re.findall(r'\b\w+\b', message.lower()))

word_counts = Counter(words)

common_words = word_counts.most_common(20)

common_words

从非垃圾邮件中提取的常见词汇包括:

‘you’, ‘to’, ‘please’, ‘the’, ‘any’, ‘have’, ‘questions’, ‘if’, ‘i’, ‘out’, ‘your’, ‘reach’, ‘feel’, ‘free’, ‘attached’, ‘let’, ‘on’, ‘know’, ‘me’, ‘project’

这些词汇可以帮助我们了解非垃圾邮件的一般内容和格式。例如,词汇如 ‘questions’, ‘attached’, ‘project’ 可能暗示着邮件涉及项目更新或信息分享。而词汇如 ‘please’, ‘feel free’, ‘reach out’ 可能表明邮件是在请求或提供帮助。接下来先以可视化的方式展示这些常见词汇,以便更好地理解非垃圾邮件的模式。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

words, counts = zip(*common_words)
plt.figure(figsize=(12, 8))
plt.barh(words, counts, color='skyblue')
plt.xlabel('Frequency')
plt.ylabel('Words')
plt.title('Most Common Words in Non-Spam Messages')
plt.gca().invert_yaxis()
plt.gca().xaxis.set_major_locator(ticker.MaxNLocator(integer=True)) 
plt.show()

上图展示了非垃圾邮件中最常见的词汇及其出现的频率。从图中可以看出,词汇如 ‘you’, ‘to’, ‘please’ 等在非垃圾邮件中非常常见,这可能与邮件的礼貌性和交流性质有关。

接下来,要识别与特定主题(如会议提醒、项目更新等)相关的关键词汇,我们可以首先定义一些与这些主题相关的关键词或短语。然后,我们将搜索非垃圾邮件中包含这些关键词或短语的邮件。最后,我们将分析这些邮件,以识别与每个主题相关的常见词汇和短语。例如,对于会议提醒,我们可以考虑关键词如 ‘meeting’, ‘reminder’, ‘schedule’ 等。对于项目更新,我们可以考虑关键词如 ‘project’, ‘update’, ‘status’ 等。

下面我们将搜索非垃圾邮件中包含这些关键词的邮件,并分析这些邮件的内容。

meeting_keywords = ['meeting', 'reminder', 'schedule', 'agenda', 'time', 'date']
project_keywords = ['project', 'update', 'status', 'progress', 'report']

meeting_messages = non_spam_messages[non_spam_messages.str.contains('|'.join(meeting_keywords), case=False, na=False)]

project_messages = non_spam_messages[non_spam_messages.str.contains('|'.join(project_keywords), case=False, na=False)]

num_meeting_messages = len(meeting_messages)
num_project_messages = len(project_messages)

num_meeting_messages, num_project_messages

我们找到了277封与会议提醒相关的邮件和283封与项目更新相关的邮件。

接下来,我们将分别分析这些邮件,以识别与每个主题相关的常见词汇和短语。我们将对每个主题的邮件进行分词,并统计每个词汇的出现频率。这样可以帮助我们了解与会议提醒和项目更新相关的常见内容和格式。

meeting_words = []
for message in meeting_messages:
    meeting_words.extend(re.findall(r'\b\w+\b', message.lower()))

meeting_word_counts = Counter(meeting_words)

project_words = []
for message in project_messages:
    project_words.extend(re.findall(r'\b\w+\b', message.lower()))

project_word_counts = Counter(project_words)

common_meeting_words = meeting_word_counts.most_common(20)
common_project_words = project_word_counts.most_common(20)

common_meeting_words, common_project_words

对于会议提醒邮件,最常见的词汇包括:

  • ‘you’, ‘to’, ‘please’, ‘the’, ‘any’, ‘if’, ‘have’, ‘questions’, ‘i’, ‘out’, ‘reach’, ‘feel’, ‘free’, ‘your’, ‘on’, ‘let’, ‘know’, ‘attached’, ‘project’, ‘me’

对于项目更新邮件,最常见的词汇包括:

  • ‘you’, ‘the’, ‘to’, ‘please’, ‘any’, ‘if’, ‘have’, ‘questions’, ‘i’, ‘out’, ‘your’, ‘feel’, ‘free’, ‘reach’, ‘project’, ‘on’, ‘attached’, ‘let’, ‘know’, ‘me’

从这些结果中可以看出,会议提醒和项目更新邮件中有许多共同的常见词汇,如 ‘you’, ‘to’, ‘please’, ‘any’, ‘if’, ‘have’, ‘questions’ 等。这些词汇可能与邮件的礼貌性和交流性质有关。同时,我们也可以看到一些与特定主题相关的词汇,如 ‘meeting’, ‘reminder’, ‘schedule’(会议提醒)和 ‘project’, ‘update’, ‘status’(项目更新)。我们可以先以可视化的方式展示这些常见词汇,以便更好地理解会议提醒和项目更新邮件的模式。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))

words, counts = zip(*common_meeting_words)
ax1.barh(words, counts, color='lightgreen')
ax1.set_xlabel('Frequency')
ax1.set_ylabel('Words')
ax1.set_title('Most Common Words in Meeting Reminder Messages')
ax1.invert_yaxis() 
ax1.xaxis.set_major_locator(ticker.MaxNLocator(integer=True)) 

words, counts = zip(*common_project_words)
ax2.barh(words, counts, color='lightblue')
ax2.set_xlabel('Frequency')
ax2.set_ylabel('Words')
ax2.set_title('Most Common Words in Project Update Messages')
ax2.invert_yaxis() 
ax2.xaxis.set_major_locator(ticker.MaxNLocator(integer=True))  
plt.tight_layout()
plt.show()

三:模型训练和评估

首先进行一些基本的数据探索,比如查看数据集的大小、缺失值、以及垃圾邮件和非垃圾邮件的分布情况。然后进行文本处理,由于垃圾邮件过滤是一个文本分类问题,需要对邮件内容进行文本处理,比如去除停用词、词干提取等。然后,需要从处理后的文本中提取特征,常用的方法有词袋模型、TF-IDF等。随后选择合适的机器学习模型进行训练,比如朴素贝叶斯、逻辑回归等。最后使用测试数据评估模型的性能,比如计算准确率、召回率等指标。

dataset_size = len(data)
spam_distribution = data['is_spam'].value_counts()
dataset_size, spam_distribution

数据集共有 1000 条记录,其中垃圾邮件(标记为 1)和非垃圾邮件(标记为 0)各占一半,即各有 500 条。下一步继续进行文本处理,使用一个简单的英文停用词列表,并手动实现文本分词和词干提取的过程:

predefined_stopwords = set([
    "i", "me", "my", "myself", "we", "our", "ours", "ourselves", "you", "your", "yours", "yourself", "yourselves",
    "he", "him", "his", "himself", "she", "her", "hers", "herself", "it", "its", "itself", "they", "them", "their",
    "theirs", "themselves", "what", "which", "who", "whom", "this", "that", "these", "those", "am", "is", "are", "was",
    "were", "be", "been", "being", "have", "has", "had", "having", "do", "does", "did", "doing", "a", "an", "the", "and",
    "but", "if", "or", "because", "as", "until", "while", "of", "at", "by", "for", "with", "about", "against", "between",
    "into", "through", "during", "before", "after", "above", "below", "to", "from", "up", "down", "in", "out", "on", "off",
    "over", "under", "again", "further", "then", "once"
])

def simple_stemmer(word):
    suffixes = ('ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment')
    stem = word
    for suffix in suffixes:
        if word.endswith(suffix):
            stem = word[:-len(suffix)]
            break
    return stem

def preprocess_text_v2(text):
    words = text.lower().split()
    processed_words = [simple_stemmer(word) for word in words if word.isalnum() and word not in predefined_stopwords]
    return ' '.join(processed_words)

data['processed_text_v2'] = data['message_content'].apply(preprocess_text_v2)

data[['message_content', 'processed_text_v2']].head()

文本已成功处理。接下来,我将从处理后的文本中提取特征。这里,我计划使用 TF-IDF(词频-逆文档频率)方法来转换文本数据为数值特征,这种方法可以有效地表示文本中单词的重要性:

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=500, stop_words='english')

X = vectorizer.fit_transform(data['processed_text_v2'])

X_df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())

在特征提取完成之后。接下来,我将使用这些特征来训练一个机器学习模型。考虑到这是一个文本分类问题,我计划使用朴素贝叶斯分类器,它是一种常用的文本分类算法,特别是对于垃圾邮件过滤这种二分类问题效果很好。下面继续进行模型训练:

from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report

X_train, X_test, y_train, y_test = train_test_split(X, data['is_spam'], test_size=0.2, random_state=42)

nb_classifier = MultinomialNB()

nb_classifier.fit(X_train, y_train)

y_pred = nb_classifier.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

report = classification_report(y_test, y_pred, target_names=['Non-Spam', 'Spam'])

accuracy, report

模型训练和测试已完成。使用朴素贝叶斯分类器,我们得到了 100% 的准确率,这意味着模型在测试集上完美地区分了垃圾邮件和非垃圾邮件,这是一个非常好的结果。

想要探索多元化的数据分析视角,可以关注之前发布的相关内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

恒生科指八连涨,汽车股强势

9月20日电 周五,港股三大股指集体收涨。恒生指数涨1.36%报18258.57点,连续第六个交易日上涨;恒生科技指数涨1.43%报3703.84点,连续第八个交易日上涨,创逾两个月来新高;恒生中国企业指数涨1.21%报6381.5点&a…

Set 和 Map 的模拟实现

1、引言 在数据结构与算法的学习与实践中,关联容器(associative containers)是不可忽视的重要工具。作为高效管理数据的一类容器,C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…

c++类中的特殊函数

My_string.cpp #include <iostream> #include "my_string.h" #include <string.h> using namespace std; My_string::My_string():size(15) { this->ptr new char[size] ; this->ptr[0]\0;//串为空串 this->len 0; }; My_string::My_str…

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…

基于SpringBoot+Vue+MySQL的电影院购票管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着电影产业的蓬勃发展&#xff0c;电影院已成为人们休闲娱乐的重要场所。然而&#xff0c;传统的电影院购票管理系统存在诸多不便&#xff0c;如购票流程繁琐、排队时间长、无法提前选座等问题&#xff0c;给观众的观影体验带…

光控资本:沪指涨0.72%,煤炭、银行板块拉升,车路云概念活跃

23日早盘&#xff0c;沪指盘中强势上扬&#xff0c;深证成指亦走高&#xff0c;场内超3100股飘红。 到午间收盘&#xff0c;沪指涨0.72%报2756.39点&#xff0c;深证成指涨0.58%&#xff0c;创业板指微涨0.09%&#xff0c;上证50指数涨0.73%&#xff1b;两市估计成交3657亿元。…

828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问

一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品&#xff0c;它主要面向中小企业和开发者&#xff0c;旨在解决传统云服务中的痛点&#xff0c;提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…

全栈开发(三):springBoot3中使用mybatis-plus

MyBatis-Plus &#x1f680; 为简化开发而生 (baomidou.com) 1.配置pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency&g…

JavaScript --- 字符串常用方法(2)

concat拼接 和号一样 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…

基于微信小程序的商品展示+ssm(lw+演示+源码+运行)

商品展示系统 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序被用户普遍使用&#xff0c;为方…

英伟达 Blackwell平台和ASIC芯片升级助力,预计2025年液冷散热渗透率将超20%

TrendForce集邦咨询: 英伟达 Blackwell平台和ASIC芯片升级助力&#xff0c;预计2025年液冷散热渗透率将超20% 根据TrendForce集邦咨询最新调查&#xff0c;随着NVIDIA Blackwell新平台预计于2024年第四季出货&#xff0c;将推动液冷散热方案的渗透率明显增长&#xff0c;从202…

完全无线测量物体电压

无线电压测量的物理原理 所有导电物体都具有一定的电容&#xff0c;我们可以将其分为自电容和相对于其他导体的电容。对于孤立物体&#xff0c;自电容占主导地位&#xff1b;对于导电球体&#xff0c;这是教科书表达式C 4 πεε 0 R&#xff0c;其中ε 0是自由空间的介电常数…

MQ入门(二):java客户端SpringAMQP

目录 1.SpringAMQP 1.1.导入demo工程 1.2.快速入门 1.2.1.消息发送 1.2.2.消息接收 1.2.3.测试 1.3.WorkQueues模型 1.4.交换机类型 1.4.1.Fanout交换机 1.4.2.Direct交换机 1.4.3.Topic交换机 1.5.声明队列和交换机 1.5.1.基于注解声明 1.6.消息转换器 1.6.1.测…

Centos Stream 9根目录扩容

要将 sda 的剩余空间扩展给 cs-root&#xff0c;可以按照以下步骤进行操作。假设你已经有剩余的未分配空间在 sda 上。 步骤 1&#xff1a;查看当前磁盘分区情况 首先&#xff0c;确保你有未分配的空间在 sda 上。 lsblk步骤 2&#xff1a;创建新的分区 使用 fdisk 或 par…

SpringBoot+Aop+注解方式 实现多数据源动态切换

整体思路&#xff1a; 引入基本依赖SpringBootAopMySqlMyBatislombok在配置文件中配置多个数据源创建数据源配置类用于读取配置编写用于标识切换数据源的注解创建数据源切换工具类DataSourceContextHolder编写切面类用于在注解生效处切换数据源编写配置类&#xff0c;加载数据…

在线文档搜索服务测试报告

目录 1. 项目背景: 2. 项目功能: 3. 测试计划: 1. 项目背景: 1.1 在线搜索服务的前端主要一下几个功能, 分别是进入搜索引擎界面(有提示输入关键词信息); 进行输入关键词的界面, 以及显示有关关键词的文档url, 点击跳转至目标文档的界面; 1.2 该在线搜索服务的文档可以实现用…

2024/9/22周报

文章目录 摘要Abstract可能的数据结构数据集结构 数据处理步骤数据集示例人工智能模型应用关键评估目标评价指标分类应用实例最终目标多目标优化的基本概念1. Pareto最优解&#xff08;Pareto Optimality&#xff09;2. 目标权重法&#xff08;Weighted Sum Method&#xff09;…

Python3 爬虫教程 - Web 网页基础

Web网页基础 1&#xff0c;网页的组成HTMLcssJavaScript2&#xff0c;网页的结构 3&#xff0c;节点树及节点间的关系4&#xff0c;选择器开头代表选择 id&#xff0c;其后紧跟 id 的名称。如&#xff1a;div 节点的 id 为 container&#xff0c;那么就可以表示为 #container 1…

Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook

文章目录 一 、计算属性1. 简写2. 完整写法 二、监视watch1. 监视【ref】定义的【基本类型】数据2. 监视【ref】定义的【对象类型】数据3. 监视【reactive】定义的【对象类型】数据4. 监视【ref】或【reactive】定义的【对象类型】数据中的某个属性5. 监视多个数据总结 三、wat…

matlab之数据处理:滑动平均滤波算法与五点三次平滑算法

关注微♥公众号&#xff1a;“电击小子程高兴的MATLAB小屋”获取专属优惠 一.滑动平均滤波算法 算数平均滤波需要多次采样后才能得出一个有效值&#xff0c;如果被检测量变化较快&#xff0c;多次采样后才输出一次有效值&#xff0c;表现就是系统反应迟钝。将当前采样值与之前…