R语言-贝叶斯算法过滤手机垃圾短信

本文介绍使用R语言和朴素贝叶斯算法进行短信垃圾信息分类的过程,包括数据预处理、特征选择、模型训练及评估。通过将短信文本转换为特征矩阵,并应用频率词筛选,实现了对短信内容的有效分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码:

sms <- read.csv("/Users/wenfeng/Desktop/R&ML/机器学习和R语言/机器学习实验5 朴素贝叶斯/sms_spam.csv", stringsAsFactors = FALSE)
#install.packages("tm")
library(NLP)
library(tm)
#数据准备
str(sms)
sms$type<-factor(sms$type)
str(sms$type)
table(sms$type)
#数据准备
sms_corpus<-Corpus(VectorSource(sms$text))
print(sms_corpus)
inspect(sms_corpus[1:3])

corpus_clean<-tm_map(sms_corpus,tolower)
corpus_clean<-tm_map(corpus_clean,removeNumbers)
corpus_clean<-tm_map(corpus_clean,removeWords,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)
sms_dtm

#训练
sms_train <- sms[1:4169, ]
sms_test  <- sms[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_train$type))
prop.table(table(sms_test$type))

#install.packages("wordcloud")
library(RColorBrewer)
library(wordcloud)
wordcloud(sms_corpus_train, min.freq = 30, random.order = FALSE)

spam <- subset(sms_train, type == "spam")
ham  <- subset(sms_train, type == "ham")

wordcloud(spam$text, max.words = 40, scale = c(3, 0.5))
wordcloud(ham$text, max.words = 40, scale = c(3, 0.5))

# 标示大于5次的关键词(为频繁出现的单词创建指示特征)
sms_term <- TermDocumentMatrix(sms_corpus,control = list(removePunctuation = TRUE,stopwords = TRUE))

#获取次数大于5次的词组成字典
#sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
#sms_list <- Terms(findFreqTerms(sms_term, 5))
sms_dict <- findFreqTerms(sms_term, 5)

sms_train2 <- DocumentTermMatrix(sms_corpus_train, list(dictionary = sms_dict))
sms_test2  <- DocumentTermMatrix(sms_corpus_test, list(dictionary = sms_dict))

convert_counts <- function(x) {
  x <- ifelse(x > 0, 1, 0)
  x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
}

sms_train2 <- apply(sms_train2, MARGIN = 2, convert_counts)
sms_test2  <- apply(sms_test2, MARGIN = 2, convert_counts)

#训练模型
#install.packages("e1071")
library(e1071)
sms_classifier <- naiveBayes(sms_train2, sms_train$type)
sms_classifier

sms_test_pred <- predict(sms_classifier, sms_test2)

library(gmodels)
CrossTable(sms_test_pred, sms_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))

sms_classifier2 <- naiveBayes(sms_train2, sms_train$type, laplace = 1)
sms_test_pred2 <- predict(sms_classifier2, sms_test)
CrossTable(sms_test_pred2, sms_est$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值