13.5.3 将文本转化成向量

讨论完如何存储向量,下面我们开始讨论如何将文本转化成向量。在信息时代,文本文件的数量呈爆炸式增长。仅Google搜索引擎的索引就有200亿的Web文档。文本数据是海量的,这些海量数据中蕴含着大量的知识。公司或机构可以使用诸如聚类、分类的机器学习算法去发现这些知识。学习用向量表示文本是从海量数据中发现知识的第一步。

向量空间模型(VSM, Vector space model)是最常用的相似度计算模型。Mahout中对文本的聚类使用了这种技术。什么是向量空间模型?下面做一个简单的介绍。

假设共有10个词w1,w2,……,w10,5篇文章d1、d2、d3、d4和d5。统计所得的词频表如表13-5所示。

13.5.3 将文本转化成向量 - 图1

这个词频表就是空间向量模型。对于任意的两篇文档,当要计算它们的相似度时,可以选择计算两个向量的余弦值。如果余弦值为1,则说明两篇文档完全相同;如果余弦值为0,则说明两篇文档完全不同。总之,在[0,1]内余弦值越大,两篇文章相似度越大。除了计算余弦值以外,还有其他的方法测量两篇文章的相似度,这里不作介绍。

在Mahout下处理的数据必然是海量数据。待处理的文本包含的所有单词就是例子中的单词w,待处理的文本文件就是相应的d。可以想象,待处理文本所包含的单词量是巨大的,因此,文本向量的维度也是巨大的。示例中的具体数值是某个单词在特定文章中出现的次数,称为词频(term frequency)。例如,表中的1代表单词w1在d1文档中出现一次,其词频为1。

在一些简单的处理方法中,可以只通过词频来计算文本间的相似度,不过当某个关键词在两篇长度相差很大的文本中出现的频率相近时,会降低结果的准确性。因此通常会把词频数据正规化,以防止词频数据偏向于关键词较多、即较长的文本。如某个词在文档d1中出现了100次,在d2中出现了100次,仅从词频看来,这个词在这两个文档中的重要性相同,然而,再考虑另一个因素,就是d1的关键词总数是1000,而d2的关键词总数是100000,所以从总体上看,这个词在d1和d2中的重要性是不同的。正规化处理的方法是用词频除以所有文档的关键词总数。

当仅使用词频来区分文档时,还会遇到这样一个问题。众所周知,一篇文章会包含很多诸如一、二、你、我、他等的单词,并且这些词语会多次出现。很明显,无论使用何种距离来测算两篇文章的相似度,这些经常出现的词汇都会对结果起到很大的负面影响。但这些词语并不能区分两份文档,相似性判断也因此变得不再准确。把文档按照相似性进行合理的聚类就更不可能了。为了解决这个问题,人们使用了TF-IDF(Term Frequency-Inverse Document Frequency)技术。

TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是TF*IDF, TF代表词频(Term Frequency),表示词条在文档中出现的频率;IDF代表反文档频率(Inverse Document Frequency),IDF的主要思想是,如果包含词语w的文档越少,IDF越大,则说明词语w具有很好的类别区分能力。