热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现

本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。
### 1. 引言

随着互联网的发展,垃圾邮件和短信的数量急剧增加,不仅给用户带来困扰,还浪费了网络资源。本研究旨在利用机器学习和深度学习技术,开发高效的垃圾邮件和短信分类系统。

### 2. 分类算法原理

#### 2.1 常用分类器 - 贝叶斯分类器

贝叶斯分类器是一种基于概率论的分类方法。通过计算文本中特定词汇出现的概率,可以有效地识别垃圾邮件。具体来说,贝叶斯公式用于计算在给定条件下某个事件发生的概率。例如,当一个邮件包含特定关键词时,它是垃圾邮件的概率是多少。

### 3. 数据集介绍

我们使用了一个自采集中文邮件数据集,该数据集包括多个文件夹,每个文件夹内包含若干邮件文本。为了确保数据质量,我们进行了爬虫采集和人工筛选。

### 4. 数据预处理

在数据预处理阶段,我们将邮件样本和标签分离,并去除非中文字符,对文本进行分词处理。Python代码如下:

```python
import re
import jieba
import os

# 清洗字符串
def clean_str(string):
string = re.sub(r'[^一-鿿]', ' ', string)
string = re.sub(r'\s{2,}', ' ', string)
return string.strip()

# 提取所有邮件并保存到一个文件中
def get_data_in_a_file(original_path, save_path='all_email.txt'):
files = os.listdir(original_path)
for file in files:
if os.path.isdir(os.path.join(original_path, file)):
get_data_in_a_file(os.path.join(original_path, file), save_path=save_path)
else:
with open(os.path.join(original_path, file), 'r', encoding='gbk', errors='ignore') as f:
email = ''.join([clean_str(line) for line in f])
with open(save_path, 'a', encoding='utf8') as f:
email = [word for word in jieba.cut(email) if word.strip() != '']
f.write(' '.join(email) + '\n')

get_data_in_a_file('data', save_path='all_email.txt')
```

### 5. 特征提取

为了将文本型数据转化为数值型数据,我们使用了TF-IDF(词频-逆向文档频率)方法。TF-IDF能够衡量一个词在一个文档中的重要性。Python代码如下:

```python
from sklearn.feature_extraction.text import TfidfVectorizer

# 使用TfidfVectorizer进行特征提取
def get_data_tf_idf(email_file_name):
vectoring = TfidfVectorizer(tokenizer=lambda x: [li for li in x.split() if li.strip() != ''])
cOntent= open(email_file_name, 'r', encoding='utf8').readlines()
x = vectoring.fit_transform(content)
return x, vectoring
```

### 6. 训练分类器

我们使用了多种分类器进行实验,包括支持向量机(SVM)、随机森林(Random Forest)和逻辑回归(Logistic Regression)。以下是一个简单的逻辑回归分类器的例子:

```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
import numpy as np

if __name__ == '__main__':
np.random.seed(1)
x, vectoring = get_data_tf_idf('all_email.txt')
y = get_label_list('label.txt')
index = np.arange(len(y))
np.random.shuffle(index)
x = x[index]
y = y[index]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
clf = LogisticRegression()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
print('classification_report\n', metrics.classification_report(y_test, y_pred, digits=4))
print('Accuracy:', metrics.accuracy_score(y_test, y_pred))
```

### 7. 综合测试结果

我们对2000条数据进行了测试,结果显示分类精度较高。然而,由于数据量较小,难以全面评估模型性能。

### 8. 其他模型方法

除了传统的机器学习方法,还可以构建深度学习模型。以下是LSTM模型的一个例子:

```python
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout

# 获取嵌入矩阵
def get_embedding_vectors(tokenizer, dim=100):
embedding_index = {}
with open(f'data/glove.6B.{dim}d.txt', encoding='utf8') as f:
for line in tqdm.tqdm(f, 'Reading GloVe'):
values = line.split()
word = values[0]
vectors = np.asarray(values[1:], dtype='float32')
embedding_index[word] = vectors
word_index = tokenizer.word_index
embedding_matrix = np.zeros((len(word_index) + 1, dim))
for word, i in word_index.items():
embedding_vector = embedding_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
return embedding_matrix

# 构建LSTM模型
def get_model(tokenizer, lstm_units):
embedding_matrix = get_embedding_vectors(tokenizer)
model = Sequential()
model.add(Embedding(len(tokenizer.word_index) + 1,
EMBEDDING_SIZE,
weights=[embedding_matrix],
trainable=False,
input_length=SEQUENCE_LENGTH))
model.add(LSTM(lstm_units, recurrent_dropout=0.2))
model.add(Dropout(0.3))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy',
metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall()])
model.summary()
return model
```

### 9. 毕设帮助

提供毕设帮助、开题指导和技术解答。如有需要,请联系我。
推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
author-avatar
邹杂品_433
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有