基于文本内容的垃圾短信识别实战

news2024/11/26 4:50:49

1、实战的背景与目标

背景:

垃圾短信形式日益多变,相关报告可以在下面网站查看

360互联网安全中心(http://zt.360.cn/report/)

目标:

基于短信文本内容,建立识别模型,准确地识别出垃圾短信,以解决垃圾短信过滤问题

2、总体流程

 3、代码实现

1、数据探索

导入数据

#数据导入,设置第一行不为头标签并设置第一列数据为索引

message = pd.read_csv("./data/message80W1.csv",encoding="UTF-8",header=None,index_col=0)


更换列名

message.columns =["label","message"]

查看数据形状

message.shape


# (800000, 2)

整体查看数据

message.info()

"""
<class 'pandas.core.frame.DataFrame'>
Int64Index: 800000 entries, 1 to 800000
Data columns (total 2 columns):
 #   Column   Non-Null Count   Dtype 
---  ------   --------------   ----- 
 0   label    800000 non-null  int64 
 1   message  800000 non-null  object
dtypes: int64(1), object(1)
memory usage: 18.3+ MB
"""

查看数据是否有重复值(若有目前不清除,等抽样后,再处理样本数据)

message.duplicated().sum()


#13424

查看垃圾短信与非垃圾短信的占比

data_group = message.groupby("label").count().reset_index()


import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8))

plt.rcParams["font.sans-serif"] = ["SimHei"]    # 设置中文字体为黑体
plt.rcParams["axes.unicode_minus"] = False      # 设置显示负号

plt.title("垃圾短信与非垃圾短信的占比饼图",fontsize=12)

plt.pie(data_group["message"],labels=["非垃圾短信","垃圾短信"],autopct="%0.2f%%",startangle=90,explode=[0,0.04])

plt.savefig("垃圾短信与非垃圾短信的占比饼图.jpg")

plt.show()

 2、进行数据抽样

先抽取抽样操作 ,垃圾短信,非垃圾短信  各1000, 占比为   1:1

n = 1000

a = message[message["label"] == 0].sample(n)   #随机抽样

b = message[message["label"] == 1].sample(n)

data_new = pd.concat([a,b],axis=0)  #数据按行合并

3、进行数据预处理

数据清洗 去重  去除x序列 (这里的 x序列指  数据中已经用 XXX 隐藏的内容,例如手机号、名字,薪资等敏感数据)

#去重

data_dup = data_new["message"].drop_duplicates()


#去除x序列
import re

data_qumin = data_dup.apply(lambda x:re.sub("x","",x))

进行 jieba分词操作

import jieba


jieba.load_userdict("./data/newdic1.txt")  #向 jieba 模块中添加自定义词语

data_cut = data_qumin.apply(lambda x:jieba.lcut(x))  #进行分词操作


#设置停用词
stopWords = pd.read_csv('./data/stopword.txt', encoding='GB18030', sep='hahaha', header=None)   #设置分隔符为 不存在的内容,实现分割

stopWords = ['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–'] + list(stopWords.iloc[:, 0])


#去除停用词
data_after_stop = data_cut.apply(lambda x:[i for i in x if i not in stopWords])

#提取标签
labels = data_new.loc[data_after_stop.index,"label"]



#使用空格分割词语
adata = data_after_stop.apply(lambda x:" ".join(x))

将上述操作封装成函数


def data_process(file='./data/message80W1.csv'):
    data = pd.read_csv(file, header=None, index_col=0)
    data.columns = ['label', 'message']
    
    n = 10000

    a = data[data['label'] == 0].sample(n)
    b = data[data['label'] == 1].sample(n)
    data_new = pd.concat([a, b], axis=0)

    data_dup = data_new['message'].drop_duplicates()
    data_qumin = data_dup.apply(lambda x: re.sub('x', '', x))

    jieba.load_userdict('./data/newdic1.txt')
    data_cut = data_qumin.apply(lambda x: jieba.lcut(x))

    stopWords = pd.read_csv('./data/stopword.txt', encoding='GB18030', sep='hahaha', header=None)
    stopWords = ['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–'] + list(stopWords.iloc[:, 0])
    data_after_stop = data_cut.apply(lambda x: [i for i in x if i not in stopWords])
    labels = data_new.loc[data_after_stop.index, 'label']
    adata = data_after_stop.apply(lambda x: ' '.join(x))

    return adata, data_after_stop, labels

4、进行词云图绘制

调用函数,设置数据


adata,data_after_stop,labels = data_process()

非垃圾短信的词频统计

word_fre = {}
for i in data_after_stop[labels == 0]:
    for j in i:
        if j not in word_fre.keys():
            word_fre[j] = 1
        else:
            word_fre[j] += 1

绘图

            
from wordcloud import WordCloud
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12,8))

plt.title("非垃圾短息词云图",fontsize=20)

mask = plt.imread('./data/duihuakuan.jpg')

wc = WordCloud(mask=mask, background_color='white', font_path=r'D:\2023暑假\基于文本内容的垃圾短信分类\基于文本内容的垃圾短信识别-数据&代码\data\simhei.ttf')

wc.fit_words(word_fre)



plt.imshow(wc)

 垃圾短信词云图绘制(方法类似)

word_fre = {}
for i in data_after_stop[labels == 1]:
    for j in i:
        if j not in word_fre.keys():
            word_fre[j] = 1
        else:
            word_fre[j] += 1


from wordcloud import WordCloud
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12,8))

plt.title("垃圾短息词云图",fontsize=20)

mask = plt.imread('./data/duihuakuan.jpg')

wc = WordCloud(mask=mask, background_color='white', font_path=r'D:\2023暑假\基于文本内容的垃圾短信分类\基于文本内容的垃圾短信识别-数据&代码\data\simhei.ttf')

wc.fit_words(word_fre)

plt.imshow(wc)

 

 5、模型的构建

采用   TF-IDF权重策略

权重策略文档中的高频词应具有表征此文档较高的权重,除非该词也是高文档频率词

TF:Term frequency即关键词词频,是指一篇文档中关键词出现的频率

TF = N / M                   N:单词在某文档中的频次 ,     M:该文档的单词数

IDF:Inverse document frequency指逆向文本频率,是用于衡量关键词权重的指数

IDF = \log (D/DW)       D:总文档数 ,     Dw:出现了该单词的文档数

调用 Sklearn库中相关模块解释

sklearn.feature_extraction.text  #文本特征提取模块

CosuntVectorizer           #转化词频向量函数

fit_transform()              #转化词频向量方法

get_feature_names()    #获取单词集合方法

toarray()                       #获取数值矩阵方法

TfidfTransformer          #转化tf-idf权重向量函数

fit_transform(counts)   #转成tf-idf权重向量方法




transformer = TfidfTransformer()      #转化tf-idf权重向量函数

vectorizer = CountVectorizer()        #转化词频向量函数

word_vec = vectorizer.fit_transform(corpus)     #转成词向量

words = vectorizer.get_feature_names()          #单词集合

word_cout = word_vec.toarray()                  #转成ndarray

tfidf = transformer.fit_transform(word_cout)    #转成tf-idf权重向量

tfidf_ma= tfidf.toarray()                       #转成ndarray

采用朴素贝叶斯算法

 多项式朴素贝叶斯——用于文本分类 构造方法:

sklearn.naive_bayes.MultinomialNB(alpha=1.0 #平滑参数, 
                                  fit_prior=True #学习类的先验概率  ,
                                  class_prior=None) #类的先验概率

模型代码实现

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB


data_train,data_test,labels_train,labels_test = train_test_split(adata,labels,test_size=0.2)

countVectorizer = CountVectorizer()


data_train = countVectorizer.fit_transform(data_train)

X_train = TfidfTransformer().fit_transform(data_train.toarray()).toarray()


data_test = CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_test)

X_test = TfidfTransformer().fit_transform(data_test.toarray()).toarray()


model = GaussianNB()


model.fit(X_train, labels_train)  #训练


model.score(X_test,labels_test)  #测试



#  0.9055374592833876

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

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

相关文章

【LeetCode热题100】打卡第38天:课程表实现前缀树

文章目录 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树⛅前言 课程表&#x1f512;题目&#x1f511;题解 实现前缀树&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第38天&#xff1a;课程表&实现前缀树 ⛅前言 大家好&#xff0c;我是…

udx实现揭秘之---------udx的慢启动带宽探测

我们都知道bew wnd*1000/rtt 当慢启动的时候&#xff0c;每收一个ack,可以这样调整发送速度当前sendspeed sendspeed mss/rtt.并且更新wnd->wnd1. udx的变形版本是sendspeed checksize/rtt; 但是这种增加速度太快&#xff0c;在到达临界点的时候&#xff0c;很容易击…

低功耗设计:为可持续发展带来能源效率的突破

引言&#xff1a; 低功耗设计是面向电子设备和系统的一种设计理念&#xff0c;旨在降低设备的能耗和功耗&#xff0c;提高能源利用效率。在当前节能环保的背景下&#xff0c;低功耗设计成为了电子行业的热门话题&#xff0c;它对于延长电池寿命、提高设备性能和减少能源消耗具有…

选读SQL经典实例笔记08_区间查询

1. 计算同一组或分区的行之间的差 1.1. 最终结果集 1.1.1. sql DEPTNO ENAME SAL HIREDATE DIFF ------ ---------- ---------- ----------- ----------10 CLARK 2450 09-JUN-1981 -255010 KING 5000 17-NOV-1981 370010 …

20 - 队列 - 链队列——队列的链式表示和实现

前面我们学习了 先进先出、后进后出 的线性表- 队列,并且我们是使用数组进行了实现,那么这节课我们来使用链表来实现队列,即链队列! 队列的定义 队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端…

针对Weblogic上的shiro漏洞利用工具

工具介绍 日常项目中&#xff0c;可能会碰见部署在weblogic上的shiro&#xff0c;所以先写了这个生成攻击payload的小Demo&#xff0c;方便后面使用。但目前只支持无回显命令执行&#xff0c;后续回显、内存马功能后面出差后再写。 关注【Hack分享吧】公众号&#xff0c;回复关…

【HCIA】12.网络服务与应用

文件传输协议FTP FTP基于TCP&#xff0c;传输较慢&#xff0c;但是比较可靠。典型的C/S架构。双通道协议。TFTP基于UDP&#xff0c;传输较快&#xff0c;但是不可靠。FTP有两种不同的传输模式 ASCII模式 传输文本文件时会对文本内容进行编码方式转换&#xff0c;提高传输效率&…

音视频技术开发周刊 | 302

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 ChatGPT神器Code Interpreter终于开放&#xff0c;到底怎么用&#xff1f;这里有一份保姆级教程 Code Interpreter 已经正式开放。 上海世界AI大会&#xff1a;MidJourney…

Fedproto:原型聚合的联邦学习框架

题目&#xff1a;FedProto: Federated Prototype Learning across Heterogeneous Clients 网址&#xff1a;http://arxiv.org/abs/2105.00243 目录 前言 什么是原型&#xff1f; Fedproto框架 fedproto settings Fedproto算法 优化目标 全局聚合 局部更新 伪代码 前言…

抖音seo源码搭建,抖音矩阵系统源码分发,抖音矩阵账号管理

前言&#xff1a; 抖音seo源码&#xff0c;抖音矩阵系统源码搭建&#xff0c;抖音矩阵同步分发。抖音seo源码部署是需要对接到这些正规接口再来做开发的&#xff0c;目前账号矩阵程序开发的功能&#xff0c;围绕一键管理多个账号&#xff0c;做到定时投放&#xff0c;关键词自动…

[Linux笔记]vim基础

vim本身不是像vs那样什么都能做的ide&#xff0c;只是单纯的编辑器。 命令行输入vim 文件名&#xff0c;会以vim打开文件。 若当前路径下尚无该名称的文件&#xff0c;则会在保存退出时创建该文件。 在vim中操作&#xff0c;尽量不要用鼠标及其滚轮操作&#xff0c;而只用键盘…

tql!AD域渗透信息收集可视化工具

工具介绍 adalanche是一款ad域中的ACL可视化及利用工具&#xff0c;和BloodHound功能类似&#xff0c;能方便域渗透人员快速发现域中的弱点&#xff1b;有开源版和商业两个版本。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230709】获取下载链接 相比于BloodHound工具…

nest.js 添加 swagger 响应数据文档

基本使用 通常情况下&#xff0c;在 nest.js 的 swagger 页面文档中的响应数据文档默认如下 此时要为这个控制器添加响应数据文档的话&#xff0c;只需要先声明 数据的类型&#xff0c;然后通过ApiResponse 装饰器添加到该控制器上即可&#xff0c;举例说明 todo.entity.ts …

DP1044 CAN FD 待机模式总线收发器替代TJA1044

5V 供电&#xff0c;IO 口兼容 3.3V&#xff0c;5Mbps&#xff0c;CAN FD 待机模式总线收发器DP1044是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、小汽车、工业控制等领域&#xff0c;支持 5Mbps 灵活数据速率&#xff08;Flexible Da…

新零售商城系统开发流程,新零售商城系统的前景如何?

近10年来&#xff0c;新零售商城系统火爆的原因在于移动互联网普及、个性化需求的增加、优化用户体验、数据驱动的营销和线上线下融合。新零售商城系统是基于互联网技术的商城平台&#xff0c;通过线上线下融合、数据分析和个性化推荐等功能&#xff0c;为零售商提供全方位的销…

N!Weblogic CVE-2023-21839 RCE

项目简介 Weblogic CVE-2023-21839/CVE-2023-21931/CVE-2023-21979 一键检测工具&#xff0c;这是来自长亭xray的代码&#xff0c;该漏洞扫描已集成到新版本xray中。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230708】获取下载链接 无需任何Java依赖&#xff0c;构造…

【C语言】unsigned 与 signed 详解

1. 基本概念 整数在存储单元中都是以补码形式存储的&#xff0c;存储单元中的第 1 个二进制位代表符号。整型变量的值的范围包括负数到正数。 但是在实际应用中&#xff0c;有的数据的范围常常只有正值&#xff08;如学号、年龄等&#xff09;&#xff0c;为了充分利用变量的值…

网盘工具alist在Windows中使用教程

alist 软件同时支持 http 协议和 WebDAV 协议&#xff0c;并且支持很多网盘种类&#xff0c;这样就给我们留下了很多可玩的空间&#xff0c;比如&#xff1a; 实现网盘本地化访问关联本地的播放器&#xff0c;以实现很好的播放效果多端文件互传&#xff0c;比如将阿里云盘的文…

GO语言slice

slice: data lencap 以及存取的元素是可以安全读写的 Slice 扩容。 1&#xff0c;预估&#xff1a; 2&#xff0c;预估容量后*字节数 所需的内存 3&#xff0c;各种语言从OS上提前申请内存&#xff0c;匹配GO规则的内存

nosql——Redis,Mongodb

目录 一、redis 1、 string类型数据的命令操作 2、 list类型数据的命令操作 3、 hash类型数据的命令操作 4、Keys相关的命令操作 二、mongodb 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 4. 查找 5. 增加、…