文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注。目前,在机器学习模型的帮助下,包括情绪分析,文件分类,话题分类,文本总结,机器翻译等在内的诸多文本挖掘应用都已经实现了自动化。
在这些应用中,垃圾邮件过滤算是初学者实践文件分类的一个很不错的开始,例如 Gmail 账户里的“垃圾邮箱”就是一个垃圾邮件过滤的现实应用。下面我们将基于一份公开的邮件数据集 Ling-spam,编写一个垃圾邮件的过滤器。Ling-spam 数据集的下载地址如下:
这里我们已经从 Ling-spam 中提取了相同数量的垃圾邮件和非垃圾邮件,具体下载地址如下:
下面我们将通过以下几个步骤,编写一个现实可用的垃圾邮件过滤器。
1.准备文本数据;
2.创建词典(word dictionary);
3.特征提取;
4.训练分类器。
最后,我们会通过一个测试数据集对过滤器进行验证。
1. 准备文本数据
这里我们将数据集分成了训练集(702封邮件)和测试集(260封邮件)两部分,其中垃圾和非垃圾邮件各占 50%。这里因为每个垃圾邮件的数据集都以 spmsg 命名,因此很容易区分。
在大部分的文本挖掘问题中,文本清理都是第一步,即首先要清理掉那些与我们的目标信息无关的词句,本例中也一样。通常邮件里一般都会包含很多无用的字符,比如标点符号,停用词,数字等等,这些字符对检测垃圾邮件没什么帮助,因此我们需要将它们清理掉。这里 Ling-spam 数据集里的邮件已经经过了以下几个步骤的处理:
a) 清除停用词 --- 像 "and", "the", "of" 等这些停用词在英语语句中非常常见。然而,这些停用词对于判定邮件的真实身份并没有什么卵用,所以这些词已经从邮件中被移除。
b) 词形还原 --- 这是一种把同一个词的不同形式组合在一起,以便被当做一个单独项目来分析的过程。举个栗子,"include", "includes" 和 "included" 就可以全部用 "include" 来代表。与此同时,语句的上下文含义也会通过词形还原的方法保留下来,这一点不同于词干提取 (stemming) 的方法(注:词干提取是另一种文本挖掘的方法,此法不考虑语句的含义)。
此外,我们还需要移除一些非文字类的符号(non-words),比如标点符号或者特殊字符之类的。要实现这一步有很多方法,这里,我们将首先创建一个词典(creating a dictionary),之后再移除这些非文字类的符号。需要指出的是,这种做法其实非常方便,因为当你手上有了一个词典之后,对于每一种非文字类符号,只需要移除一次就 ok 了。
2. 创建词典(Creating word dictionary)
一个数据集里的样本邮件一般长这样:
Subject: posting
hi , ' m work pho