赞
踩
观察数据,请思考:
建模前需要对文本数据做哪些处理?
需要怎么评价模型的好坏?
随机抽取上文的2W条文本处理后的数据的80%作为训练样本,其余作为测试集样本。
即银行账户;电话、固话、QQ;价格;日期
在数据的的储存和提取过程中,由于技术和某些客观的原因,造成了相同短信文本内容缺失等情况,因此需要对文本数据进行去重,去重即仅保留重复文本中的一条记录。
仅保留其中一条记录
中文分词是指以词作为基本单元,使用计算机自动对中文文本进行词语的切分,即使词之间有空格,这样方便计算机识别出各语句的重点内容。
jieba.load_userdict(‘newdic1.txt’)#添加词典进行分词
中文表达中最常用的功能性词语是限定词,如“的”、“一个”、“这”、“那”等。这些词语的使用较大的作用仅仅是协助一些文本的名词描述和概念表达,并没有太多的实际含义。
而大多数时候停用词都是非自动生产、人工筛选录入的,因为需要根据不同的研究主题人为地判断和选择合适的停用词语。
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
词云图是文本结果展示的有利工具,通过词云图的展示可以对短信文本数据分词后的高频词予以视觉上的强调突出效果,使得阅读者一眼就可获取到主旨信息
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: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]
缺陷:忽略了句子词频信息
增加词频信息
文本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]
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)
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。