基于TF-IDF文本向量化的垃圾短信识别

文章目录

        • 1.实现目标
        • 2.具体实现
        • 3.小结

1.实现目标


基于短信文本内容,建立识别模型,准确识别出垃圾短信,以解决垃圾短信过滤问题。
基于TF-IDF文本向量化的垃圾短信识别_第1张图片
本例采用对分类的样本数据短信文本词频统计,转化为tf-idf权值向量(即文本向量表示法),代入高斯贝叶斯模型进行训练。

2.具体实现


  • 读取800000条已标签好的短信数据
import pandas as pd
data=pd.read_csv('message80W1.csv',header=None,index_col=0)#无标题的规整数据,行索引从0开始

在这里插入图片描述
我们发现短信数据表格有800000行2列,数据表格类型为DataFrame。

  • 观察数据结构
data.columns=['label','message']#分别赋列名称
data.shape
data.head()

基于TF-IDF文本向量化的垃圾短信识别_第2张图片
通过上表前五行数据结果观察到第一列是标签列0代表正常短信,1代表垃圾短信。

  • 观察数据分布
data['label'].value_counts()

在这里插入图片描述
上述结果表明有720000条正常短信,80000条垃圾短信

  • 数据抽样
n=1000 #5000抽样个数做对比
a=data[data['label']==0].sample(n)
b=data[data['label']==1].sample(n)
data_new=pd.concat([a,b],axis=0)#拼接,列拼接
data_new.head()

基于TF-IDF文本向量化的垃圾短信识别_第3张图片
分别对正常短信和垃圾短信抽取1000个样本后,两者列拼接成一个DataFrame的前五个数据。

  • 数据预处理
  1. 数据清洗
import re#导入re模块,去除敏感xxx序列
data_dup=data_new['message'].drop_duplicates()#去除重复短信
data_qumin=data_dup.apply(lambda x:re.sub('x','',x))#去除敏感信息xxx序列
data_qumin

基于TF-IDF文本向量化的垃圾短信识别_第4张图片
截取前一小部分数据,可以发现上述短信敏感序列xxx已去除。

2.分词

import jieba#导入分词库jieba
jieba.load_userdict('newdic1.txt')#jieba词库中添加自定义词库
data_cut=data_qumin.apply(lambda x:jieba.lcut(x))#对文本分词
data_cut

基于TF-IDF文本向量化的垃圾短信识别_第5张图片
截取前一部分数据发现上述短信分词完成。

3.去除停用词

stopWords=pd.read_csv('stopword.txt',encoding='gbk',sep='hahaha', engine='python',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))####应用
adata,labels,data_after_stop

adata部分数据:
基于TF-IDF文本向量化的垃圾短信识别_第6张图片
labels部分数据:
基于TF-IDF文本向量化的垃圾短信识别_第7张图片

data_after_stop部分数据:
基于TF-IDF文本向量化的垃圾短信识别_第8张图片

4.绘制词云图

#词频统计
from wordcloud import WordCloud#import wordcloud.WordCloud
from matplotlib import pyplot as plt#import matplotlib.pyplot as plt
word_fre={}
for i in data_after_stop[labels==1]:#labels==0
    for j in i:
        if j not in word_fre.keys():
            word_fre[j]=1
        else:
            word_fre[j]+=1

mask=plt.imread('duihuakuan.jpg')
wc=WordCloud(mask=mask,background_color='white',font_path=r'C:\Windows\Fonts\simhei.ttf')
wc.fit_words(word_fre)
plt.imshow(wc)

垃圾短信词云图:
基于TF-IDF文本向量化的垃圾短信识别_第9张图片

正常短信词云图:
基于TF-IDF文本向量化的垃圾短信识别_第10张图片

  • 模型建立
    文本型数据转向数值型数据,算法详解见博客。

    tf-idf权重策略步骤:
    1.转换成词频向量
    2.转换成TF-IDF权重矩阵
    3.特征提取,构建模型

代码实现:

  • 切分样本数据80%为训练集,20%为测试集
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
# sklearn.feature_extraction.text 文本特征提取模块
# CountVectorizer 转化词频向量函数
# TfidfTransformer 转化tf-idf权重向量函数
from sklearn.model_selection import train_test_split#导入切分函数
#切分数据
data_tr,data_te,labels_tr,labels_te=train_test_split(adata,labels,test_size=0.2)#80%为训练集

误区:
基于TF-IDF文本向量化的垃圾短信识别_第11张图片
训练集和测试集纬度不一样,无法进行训练,所以用以下方法获取同纬度的训练集和测试集。

  • 获得训练集和测试集
#以下正确方法
countVectorizer=CountVectorizer()
#获得训练集
data_tr=countVectorizer.fit_transform(data_tr)
X_tr=TfidfTransformer().fit_transform(data_tr.toarray()).toarray()

#获得测试集
data_te=CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_te)
X_te=TfidfTransformer().fit_transform(data_te.toarray()).toarray()#toarray()转成数组
data_te,data_tr
  • 高斯朴素贝叶斯训练
from sklearn.naive_bayes import GaussianNB#使用高斯朴素贝叶斯
model=GaussianNB()
model.fit(X_tr,labels_tr)
model.score(X_te,labels_te)
#n=1000高斯朴素贝叶斯模型精度是0.859649
#n=5000高斯朴素贝叶斯模型精度是0.898347

3.小结


  • 文本处理方法key:tf-idf权重策略,将文本数据转化为数值向量
  • 高斯贝叶斯模型训练

你可能感兴趣的:(机器学习,项目实践,机器学习,自然语言处理,数据挖掘)