基于短信文本内容,建立识别模型,准确识别出垃圾短信,以解决垃圾短信过滤问题。
本例采用对分类的样本数据短信文本词频统计,转化为tf-idf权值向量(即文本向量表示法),代入高斯贝叶斯模型进行训练。
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()
通过上表前五行数据结果观察到第一列是标签列0代表正常短信,1代表垃圾短信。
data['label'].value_counts()
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()
分别对正常短信和垃圾短信抽取1000个样本后,两者列拼接成一个DataFrame的前五个数据。
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
2.分词
import jieba#导入分词库jieba
jieba.load_userdict('newdic1.txt')#jieba词库中添加自定义词库
data_cut=data_qumin.apply(lambda x:jieba.lcut(x))#对文本分词
data_cut
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
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)
代码实现:
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%为训练集
误区:
训练集和测试集纬度不一样,无法进行训练,所以用以下方法获取同纬度的训练集和测试集。
#以下正确方法
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