机器学习——垃圾邮件过滤(R语言)

以下是根据《机器学习:实用案例解析》一书中的案列写的,感觉结果并没有达到预期的状态,欢迎大家指出我其中理解错的地方,哈哈哈。

原始数据:SpamAssassin语料库,
http://spamassain.apache.org/publiccorpus/
spam:垃圾邮件
easy ham:易识别的正常邮件
hard ham:不易识别的正常邮件

文本分类算法:朴素贝叶斯分类器(假设所有词之间频次统计相互独立)
a)明显更可能在垃圾邮件中出现的词;
b)明显更可能在非垃圾邮件中出现的词。
分类结果:
a)假设电子邮件是垃圾邮件,看到其具体内容的概率;
b)假设电子邮件不是垃圾邮件,看到相同内容的概率。
预测:通过邮件正文内容本身预测邮件的类别

思路:
a)原始邮件预处理:去除头部,保留邮件正文;
b) 构建特征词类别知识库,通过从邮件正文中抽取特证词来构建邮件分类器的特征集。
  • 语料库构造:量化特证词频率——构造一个词项-文档矩阵(TDM)N*M的矩阵,[i,j]表示词项i在文档j中出现的次数
c)构建分类器:
  • 构建一个数据框来保存所有特征项在垃圾邮件中的条件概率;
  • 能在已知观测特征的前提下计算出邮件是垃圾的概率;
  • 根据有多少邮件包含这个特征词项来定义一封邮件是垃圾邮件的条件概率;

一、首先处理spam垃圾邮件:
#加载程序包
library(tm)
library(ggplot2)

#设置数据源路径
spam.path <- file.path("data", "spam")
spam2.path <- file.path("data", "spam_2")
easyham.path <- file.path("data", "easy_ham")
easyham2.path <- file.path("data", "easy_ham_2")
hardham.path <- file.path("data", "hard_ham")
hardham2.path <- file.path("data", "hard_ham_2")

# 读取文件正文内容
# 每份邮件包含头部和正文两个部分一般由第一个空行分割(协议规定)
#打开每个文件,找到空行,并将空行之后的文本返回一个字符串向量,就是空行之后的所有文本拼接之后字符串。
get.msg <- function(path)
{
#"rt" read as text 以文本格式读取,"latin1"编码方式
con <- file(path, open = "rt", encoding = "latin1")
#读取每一行文本返回为字符串向量的一个元素
text <- readLines(con)
# 定位第一个空行,并抽取出其后的所有文本
# tryCatch来捕获异常,不输出,原先代码为msg <- text[seq(which(text == "")[1] + 1, length(text), 1)] 报错
msg <- tryCatch(text[seq(which(text == "")[1] + 1, length(text), 1)], error = function(e) e)
#关闭文件
close(con)
#paste把向量拼接成一个单条文本元素,用"\n"换行来分割各个元素
return(paste(msg, collapse = "\n"))
}

#保存邮件内容,使得向量的每个元素就是一封邮件内容。
#dir 获得路径下所有文件名列表
spam.docs <- dir(spam.path)
#读取文件名,cmds是用于移动文件的命令,不是数据集,要排除掉
#spam.docs 就是包含用于训练的所有文件名的一个字符向量
spam.docs <- spam.docs[which(spam.docs != "cmds")]
#sapply,对每个邮件应用get.msg函数,通过返回值构建一个文本向量
all.spam <- sapply(spam.docs,
function(p) get.msg(paste(spam.path, p,sep="")))

#检查每个向量元素的名称与文件名是否一一对应
head(all.spam)

#构建一个文本资料库
#定义get.td函数:输入邮件文本向量;输出TDM;
#tm包提供若干方法用于构建语料库;
get.tdm <- function(doc.vec)
{
#stopwords = TRUE,告诉tm在所有文本中
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值