文档和单词 Documents and Words
即将构造的分类器须要利用某些特征来对不同的内容项进行分类。
所谓特征,是指任何可以用来判断内容中具备或缺失的东西。
当考虑对文档进行分类时,所谓的内容即是文档,而特征则是文档中的单词。当将单词作为特征时,其假设是:某些单词相对而言更有可能会出现于垃圾信息中。这一假设是大多数垃圾信息过滤器背后所依赖的基本前提。不过,特征未必一定是一个个单词;它们也可以是词组或短语,或者任何可以归为文档中缺失或存在的其他东西。
请新建一个文件,取名docclass.py,并在其中加入一个名为getwords的函数,以从文本中提取特征:
import re
import math
def getwords(doc):
splitter=re.compile('\\W*')
# 根据非字母字符进行单词拆分
words=[s.lower() for s in splitter.split(doc)
if len(s)>2 and len(s)<20]
# 只返回一组不重复的单词
return dict([(w,1) for w in words])
该函数以任何非字母类字符为分隔符对文本进行划分,将文本拆分成了一个个单词。这一过程只留下了真正的单词,并将这些单词全都转换成了小写形式。
决定采用哪些特征颇具技巧性,也十分重要。特征必须具备足够的普遍性,即时常出现,但又不能普遍到每一篇文档里都能找到。
理论上,整篇文档的文本都可以作为特征,但是除非我们一再收到内容完全相同的邮件,否则这样的特征几乎肯定是毫无价值的。在另一种极端情况下,特征也可以是单个字符。但是由于每一封电子邮件中都有可能会出现所有这些字符,因此要想利用这样的特征将希望看到和不希望看到的文档区分开来是很困难的。即便选择使用单词作为特征,也依然还是会带来一些问题,包括如何正确划分单词,哪些标点符号应该被纳入单词,以及是否应该包含头信息(header information)等。
在根据特征进行判断时还有一点须要考虑,那就是如何才能更好地利用特征将一组文档划归到目标分类中去。例如,前述getwords函数的代码通过将单词转换为小写形式,从而减少了特征的总数。这意味着,程序会将位于句首以大写字母开头的单词与位于句中全小写形式的单词视为相同--这样做非常好,因为具有不同大小写形式的同一单词往往代表的含义是相同的。
然而,上述函数完全没有考虑到被用于许多垃圾信息中的"SHOUTING风格"(译注1),而这一点可能对区分垃圾邮件和非垃圾邮件是至关重要的。除此以外,如果超过半数以上的单词都是大写时,那就说明必定会有其他的特征存在。
正如你所看到的,在选择特征集时须要做大量的权衡,而且还要不断地进行调整。不过眼下,可以暂且使用这个简单的getwords函数;在本章的后续部分,我们还将了解到有关特征提取的一些改进方法。
网友评论