文本挖掘和可视化案例:基于文本内容的垃圾短信分类

一、总体流程

在这里插入图片描述

1.数据展示

在这里插入图片描述

观察数据,请思考:
建模前需要对文本数据做哪些处理?
需要怎么评价模型的好坏?
在这里插入图片描述

2. 数据抽取

随机抽取上文的2W条文本处理后的数据的80%作为训练样本,其余作为测试集样本。

二、数据预处理

1.数据清洗

去除空格x序列

在这里插入图片描述

x序列

在这里插入图片描述
即银行账户;电话、固话、QQ;价格;日期

文本去重

在数据的的储存和提取过程中,由于技术和某些客观的原因,造成了相同短信文本内容缺失等情况,因此需要对文本数据进行去重,去重即仅保留重复文本中的一条记录。
在这里插入图片描述
仅保留其中一条记录

2.分词

中文分词

中文分词是指以词作为基本单元,使用计算机自动对中文文本进行词语的切分,即使词之间有空格,这样方便计算机识别出各语句的重点内容。
在这里插入图片描述

添词典去停用词

在这里插入图片描述

jieba.load_userdict(‘newdic1.txt’)#添加词典进行分词

3.去停用词

中文表达中最常用的功能性词语是限定词,如“的”、“一个”、“这”、“那”等。这些词语的使用较大的作用仅仅是协助一些文本的名词描述和概念表达,并没有太多的实际含义。
而大多数时候停用词都是非自动生产、人工筛选录入的,因为需要根据不同的研究主题人为地判断和选择合适的停用词语。
在这里插入图片描述
data_process.py

import pandas as pd
import re
import jieba


def data_process(file='message80W1.csv'):
    data = pd.read_csv(file, header=None, index_col=0)#无列名称
    data.columns = ['label', 'message']
    n = 5000

    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))#去除X序列

    jieba.load_userdict('newdic1.txt')#添加词典进行分词
    data_cut = data_qumin.apply(lambda x: jieba.lcut(x))
    # 设置停用词中未有的词语hahaha作为分割词,则可把逗号作为停用词
    stopWords = pd.read_csv('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. 绘制词云

词云图是文本结果展示的有利工具,通过词云图的展示可以对短信文本数据分词后的高频词予以视觉上的强调突出效果,使得阅读者一眼就可获取到主旨信息

word_cloud.py

from data_process import data_process
from wordcloud import WordCloud
import matplotlib.pyplot as plt

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

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)


三、文本向量的表示

1.One-Hot表达

文本1:My dog ate my homework.
文本2:My cat ate the sandwich.
文本3:A dolphin ate the homework.
文本转化为词向量矩阵
[a, ate, cat, dolphin, dog, homework, my, sandwich, the]
文本1:[0 1 0 0 1 1 1 0 0]
文本2:[0 1 1 0 0 0 1 1 1]
文本3:[1 1 0 1 0 1 0 0 1]
缺陷:忽略了句子词频信息

2. TF-IDF权重

增加词频信息
文本1:[0 1 0 0 1 1 2 0 0] “my”在句子中出现了2次
文本2:[0 1 1 0 0 0 1 1 1]
文本3:[1 1 0 1 0 1 0 0 1]
归一化:避免句子长度不一致问题,即文档TF信息
文本1:[0 1/5 0 0 1/5 1/5 2/5 0 0] “my”在句子中出现了2次
文本2:[0 1/5 1/5 0 0 0 1/5 1/5 1/5]
文本3:[1/5 1/5 0 1/5 0 1/5 0 0 1/5]
在这里插入图片描述

3.文本分类实例

sklearn.feature_extraction.text #文本特征提取模块
CountVectorizer #转化词频向量函数
fit_transform() #转化词频向量方法
get_feature_names() #获取单词集合方法
toarray() #获取数值矩阵方法
TfidfTransformer #转化tf-idf权重向量函数
fit_transform(counts) #转成tf-idf权重向量方法

TF-IDF权值向量
在这里插入图片描述

步骤:
1.分词;去除停用词;
2.转换成词频向量
3.转换成TF-IDF权重矩阵
4.特征提取,构建模型

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

adata, data_after_stop, lables = data_process()
data_tr, data_te, labels_tr, labels_te = train_test_split(adata, lables, test_size=0.2)

countVectorizer = CountVectorizer()
data_tr = countVectorizer.fit_transform(data_tr)
X_tr = TfidfTransformer().fit_transform(data_tr.toarray()).toarray()#训练集样本自变量的TF-IDF值

data_te = CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_te)#将测试样本的列数转为和训练样本列数一样
X_te = TfidfTransformer().fit_transform(data_te.toarray()).toarray()#测试集样本自变量的TF-IDF

四、模型训练及评价

使用朴素贝叶斯

model = GaussianNB()
model.fit(X_tr, labels_tr)
model.score(X_te, labels_te)

结果:
在这里插入图片描述

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值