文本挖掘R(贝叶斯短信分类)学习笔记

getwd() #查找R工作目录,将文件放入工作目录路径下
sms_raw<-read.csv("sms_spam.csv",stringsAsFactors=FALSE) #导入数据,保存名为sms_raw
str(sms_raw) #探索数据结构
sms_raw$type<-factor(sms_raw$type) #将字符串变量转换成因子
str(sms_raw$type) #探索变量type
table(sms_raw$type) #分析变量结构

install.packages("tm") #安装文本挖掘添加包
library(tm) #加载文本挖掘添加包

sms_corpus<- Corpus(VectorSource(sms_raw$text)) #创建一个语料库(一个文本文件的集合)
print(sms_corpus) #输出建立的语料库
inspect(sms_corpus[1:3]) #查看前三条短信

corpus_clean<-tm_map(sms_corpus,tolower) #函数tm_map()转换语料库,变成小写字母
corpus_clean<-tm_map(corpus_clean,removeNumbers) #去除所有数字
corpus_clean<-tm_map(corpus_clean,removeWords,stopwords()) #去除停用词,使用tm添加包中提供的函数stopwords()
corpus_clean<-tm_map(corpus_clean,removePunctuation) #去除标点符号
corpus_clean<-tm_map(corpus_clean,stripWhitespace) #去除空格

inspect(corpus_clean[1:3])  #查看清理后的前三条短信

sms_dtm<-DocumentTermMatrix(corpus_clean) #函数DocumentTermMatrix()将语料库作为输入,创建一个稀疏矩阵,矩阵的行表示文档(短信),矩阵的列表示单词。矩阵中的每个单元数字代表由列标识的单词出现在由行所标识的文档中的次数。
sms_dtm #显示矩阵概况

#建立训练集和测试集
sms_raw_train<-sms_raw[1:4169,] #分解原始数据框
sms_raw_test<-sms_raw[4170:5559,]

sms_dtm_train<-sms_dtm[1:4169,] #分解文档-单词矩阵
sms_dtm_test<-sms_dtm[4170:5559,]

sms_corpus_train<-corpus_clean[1:4169] #分解语料库
sms_corpus_test<-corpus_clean[4170:5559]

prop.table(table(sms_raw_train$type)) #垃圾短信在训练数据中的占比
prop.table(table(sms_raw_test$type)) #垃圾短信在测试数据中的占比

install.packages("wordcloud") #安装词云添加包wordcloud
library(wordcloud) #加载词云添加包wordcloud

wordcloud(sms_corpus_train,mim.freq=80,random.order=FALSE) #创建词云(最小次数80)

出现次数大于80的词云图:
文本挖掘R(贝叶斯短信分类)学习笔记

wordcloud(sms_corpus_train,max.word=100,random.order=FALSE) #创建词云(top100)

出现次数最多的前100的词云图:
文本挖掘R(贝叶斯短信分类)学习笔记

spam<-subset(sms_raw_train,type=="spam") #创建type=spam的子集
ham<-subset(sms_raw_train,type=="ham") #创建type=ham的子集

wordcloud(spam$text,max.words=40,scale=c(3,0.5)) #创建spam子集词云(top40)
wordcloud(ham$text,max.words=40,scale=c(3,0.5)) #创建ham子集词云(top40)

spam子集词云图:
文本挖掘R(贝叶斯短信分类)学习笔记
ham子集词云图:
文本挖掘R(贝叶斯短信分类)学习笔记

sms_dict<-findFreqTerms(sms_dtm_train,5) #寻找频繁出现的单词,输入一个文档-单词矩阵,返回一个字符向量,该向量包含一个出现次数不少于指定次数的单词。
sms_train<-DocumentTermMatrix(sms_corpus_train,list(dictionary=sms_dict)) #训练矩阵降维
sms_test<-DocumentTermMatrix(sms_corpus_test,list(dictionary=sms_dict)) #测试矩阵降维

#根据稀疏矩阵元素,将其转换成因子变量,根据单词是否出现,表示成yes或no。
convert_counts<-function(x){
	x<-ifelse(x>0,1,0)
	x<-factor(x,levels=c(0,1),labels=c("No","Yes"))
}

#利用函数apply()将convert_counts()应用于稀疏矩阵的每一列,使用参数MARGIN来指定作用的对象是矩阵的行或者列,MARGIN=1表示行,MARGIN=2表示列
sms_train<-apply(sms_train,MARGIN=2,convert_counts) #转换训练集
sms_test<-apply(sms_test,MARGIN=2,convert_counts) #转换测试集

install.packages("e1071") #安装分类器添加包
library(e1071) #加载分类器添加包
install.packages("gmodels") #安装二维列联表添加包
library(gmodels) #加载二维列联表添加包

sms_classifier<-naiveBayes(sms_train,sms_raw_train$type) #应用e1071添加包中的naiveBayes(train,class,laplace=0)函数创建分类器。
sms_test_pred<-predict(sms_classifier,sms_test) #用函数predict()进行预测,并将预测结果存在名为sms_test_pred的向量中。
CrossTable(sms_test_pred,sms_raw_test$type,
		prop.chisq=FALSE,prop.t=FALSE,prop.r=FALSE,
		dnn=c('predicted','actual'))#创建二维列联表

分类结果:
文本挖掘R(贝叶斯短信分类)学习笔记

sms_classifier2<-naiveBayes(sms_train,sms_raw_train$type,laplace=1) #使用拉普拉斯调整
sms_test_pred2<-predict(sms_classifier2,sms_test)
CrossTable(sms_test_pred2,sms_raw_test$type,
		prop.chisq=FALSE,prop.t=FALSE,prop.r=FALSE,
		dnn=c('predicted','actual'))

使用拉普拉斯调整后分类结果:
文本挖掘R(贝叶斯短信分类)学习笔记