朴素贝叶斯分类--R语言应用

来源:互联网 发布:java调用api接口实例 编辑:程序博客网 时间:2024/05/16 15:12

前面我们曾经讲解过朴素贝叶斯算法原理,以及python的代码实现。原理可以参考这里。这里我们就用R包来应用朴素贝叶斯来解决手机垃圾短信过滤,其实与垃圾邮件分类的原理差不多,这里我们就熟悉熟悉怎么在R里面运用朴素贝叶斯。数据集

  • 准备数据

  • 数据导入

    data <- read.xlsx("C:\\Users\\user\\Desktop\\sms_spam.xlsx",sheetIndex = 1)

    这里写图片描述

    这里写图片描述
    可以看到5574条手机短信,特征值有两个:type(ham和spam垃圾短信),text文本内容。
    由于type是分类向量,最好转化成因子。
    这里写图片描述
    再用table看看每个分类的量
    这里写图片描述

  • 清理和标准化文本数据
    这里我们需要引入tm添加包,能对文本有一个预处理。

    sms_corpus <- VCorpus(VectorSource(sms_raw$text))

    我们先将文本创建一个源对象。
    这里写图片描述

    inspect(sms_corpus[1:2])

    这里写图片描述
    inspect函数可以查看第一条和第二条预料的概要
    要查看完整信息我们可以用这条语句

    lapply(sms_corpus[1:2],as.character)#lapply与apply等可以应用一个程序到每一个元素

    这里写图片描述
    为了进行分词分析,我们需要将这些短信划分成单个单词,但是我们要先清理文本,去除标点符号,和其他可能的影响。

    这些操作都被封装在了tm库里面,首先我们需要使用tm_map函数来提供将变换映射语料库。
    例如tolower进行大小写变换

    > sms_corpus_clean <- tm_map(sms_corpus,content_transformer(tolower))

    这里我的rstudio环境出问题了,后来把系统位置转换成us,问题就解决了。
    这里写图片描述
    我们再来看看变化后的前两条短信
    这里写图片描述
    所有的词都变成小写了。

    后面我们再除去数字,由于数字基本上不会提供有用的信息。

    > sms_corpus_clean <- tm_map(sms_corpus_clean,removeNumbers)

    然后我们要去除像to、and、but等出现次数较多,但是又没什么实际价值的词,这些词我们可以作为停用词去除。

    sms_corpus_clean <- tm_map(sms_corpus_clean,removeWords,stopwords())

    我们用tm默认的停用词库来去除单词

    另外就是去除标点符号,但是如果盲目去除会导致问题,比如“hello…world”,会导致“helloworld”,所以我们需要定义用空格来代替。
    我们自定义一个函数

    > replacePunctuation <- function(x){gsub("[[:punct:]]+"," ",x)}> sms_corpus_clean <- tm_map(sms_corpus_clean,replacePunctuation)

    我们还需要进行词干提取(streamming),这里我们可以SnowballC来进行词干提取,里面提供了wordStem可用于字符向量。
    例如:
    这里写图片描述
    另外我们再去除多余的空白

    > sms_corpus_clean <- tm_map(sms_corpus_clean,stemDocument)> sms_corpus_clean <- tm_map(sms_corpus_clean,stripWhitespace)

    我们看看进行这些变化后的文本前三条
    这里写图片描述

可以看到处理后的结果还是不错的,到这里分词的工作就完成了。

  • 将词向量转化成文档单词稀疏矩阵
    前面python处理垃圾邮件中我们曾将词向量转化为0-1的词向量,这里我们直接转化成0-1稀疏矩阵。
    这里直接转化会有问题
    这里写图片描述
    因为DocumentTermMatrix更新后,不再接受character格式,需要先转化成文本格式。

    > sms_corpus_clean <- tm_map(sms_corpus_clean,PlainTextDocument)> sms_dtm <- DocumentTermMatrix(sms_corpus_clean)

    这里写图片描述

  • 数据准备–建立训练数据集和测试数据集

    sms_dtm_train <- sms_dtm[1:4169,]sms_dtm_test <- sms_dtm[4170:5574,]sms_train_labels <- sms_raw[1:4169,]$typesms_test_labels <- sms_raw[4170:5574,]$type
  • 可视化文本数据

    wordcloud(sms_corpus_clean,min.freq=50,random.order=F,colors = brewer.pal(7,"Set1"),random.color = T,ordered.colors = T)

    这里写图片描述

    spam <- subset(sms_raw,type=="spam")ham <- subset(sms_raw,type=="ham")
原创粉丝点击