在上一篇文章中,我们大概了解了如何使用搜索语句对索引进行搜索,但是在搜索完成之后如何对找到的文章进行排序并返回的问题产生了疑惑,那么我们是如何去判断搜索出的文档和搜索语句的相关性的呢?现在,我们来解决如何对文档之间的相关性进行打分的问题。
要对文档之间的关系进行打分可不是一个容易的事情,我们先看一个例子:如何去判断人之间的关系。
首先,看一个人,往往会综合许多的要素,比如性格、信仰、兴趣爱好、衣着打扮、高矮胖瘦等。
其次,对于人与人之间的关系,不同的要素重要性不同,性格、信仰、爱好可能会重要一些,而个人的衣着打扮和高矮胖瘦等可能重要性要相对小一个层次,故而拥有相同或者相似的性格、信仰和兴趣爱好的人会更容易成为好朋友,不过衣着打扮和高矮胖瘦不同的人,也能够成为好朋友。
因此判断人与人之间的关系,首先要知道哪些因素对人与人之间的关系更重要,比如性格、信仰和兴趣爱好等。其次,是判断两个人的这些要素之间的关系。例如A性格开朗,B性格外向,A信仰佛教,B信仰上帝,A喜欢打篮球,B喜欢踢足球。我们可以看到,A和B两个人的性格都很积极,都喜欢运动,而且两个人的信仰也都是善良积极的,因此我们判断两个人之间的关系应该会很好。
可能大家会说上面这个例子中的关联要素可能有点抽象,那我们再看一个更加直观的例子:公司之间的关系。
首先,一个公司由很多人构成,比如总经理,经理,首席技术官,普通员工,保安,门卫等,这些人的重要性不同,总经理、经理和首席技术官可能更重要点,而普通员工、保安、门卫等可能不是那么重要。所以说如果两个公司的总经理以前是同学,经理是老乡,首席技术官曾是一起创业的伙伴,那么,我们会判断这两家公司的关系一定很好。
通过上面的两个例子,我们知道判断两者之间的关系需要多方面地考虑许多因素,并且不同的因素的权重不同。现在,我们再来看一下如何去判断文档之间的关系。
首先,一个文档有许多词组成,如search,lucene,full-text,this,a,what等。
其次对于文档之间的关系,不同的Term重要性不同,比如对于本篇文档,search,lucene,full-text相对重要些,this,a,what相对不是那么重要,那么如果这两篇文档都包含search,lucene,full-text,那么这两篇文档之间的关系一定很紧密,这样的话,即便有一篇文档不包含this,a,what,也不会影响两个文档之间的紧密度。
因而判断文档之间的关系,首先要找出哪些词对文档之间的关系最重要,然后再去判断文档之间的关系。
这个就产生了另一个问题,我们要如何去判断一个词对文档的重要性呢?全文索引中有这样的一个计算过程,叫做计算词的权重。
计算词的权重有两个参数,第一个是词,第二个是文档。
词的权重表示这个词对所在文档的重要性,越重要的词它的权重越大,因而在计算文档之间的相关性上会发挥更大作用。
判断词之间的关系从而得到文档相关性需要使用向量空间模型算法。
下面我们来详细地介绍一下这两个过程:
First:计算权重的过程
影响一个词在一篇文档中的重要性主要有两个因素:
Term Frequency:即此Term在此文档中出现了多少次。tf越大说明越重要;
Document Frequecy:即有多少文档包含此Term,df越大说明越不重要;
很直观吧?词在文档中出现次数越多,说明该词对文档越重要;然而,一篇英文文档中“this”出现的次数最多,那么就说明“this”最重要么?这就需要通过第二个因素进行调节,第二个因素说明,一个词出现在越多的文档,则该词越不重要,也就是这个词太普通了,不足以区分这些文档之间的不同,那么它的权重就会很低。
好比程序员所学的技术,对于程序员而言,这项技术掌握的越深越好,找工作时越有竞争力。然而对于所有程序员而言,这项技术掌握的人越少越好,这样才能体现自己的价值,找工作时才会越有竞争力,毕竟人的价值在于不可替代性。
道理讲述明了了,下面来看一下词的权重的简单典型计算公式:
当然全文搜索系统都会有自己的一套实现方案,Lucene就和此稍有不同。
Second:判断词之间的关系c从而得到文档相关性的过程,也就是向量空间模型算法
我们把文档看作一系列的词,每个词都有自己的权重,不同的词根据自己在文档中的权重来影响文档相关性的打分计算。
于是,我们把所有此文档中的词的权重看做一个向量。
Document={term1,term 2,......,term N}
Document Vector={weight 1,weight 2,......,weight N}
同样,我们把查询语句看做一个简单文档,同样使用向量来表示:
Query={term1,term 2,......,term N}
Query Vector={weight 1,weight 2,......,weight N}
我们把所有搜索的文档向量及查询向量放到一个N维空间中,每个词都是一个维度,如下图所示:
我们认为两个向量之间的夹角越小,相关性越大。
所以我们计算夹角的余弦值作为相关性的打分,夹角越小,余弦值越小,打分越高,相关性越大。
有人会说,查询语句一般都很短,包含的词是很少的,因而查询向量的向量空间的维度很小,但是文档都会很长,包含的词很多,文档的向量空间的维度很大,为什么上图的两个维度相同,都是N呢?
在这里,既然是要放到相同的向量空间之中,那么维度一定是相等的,不同的是,我们在此取的是两者的并集,如果不包含某词,则权重为0。
相关性的打分公式如下:
举个例子,查询语句一共有十一个词,共计有三篇文档被搜索出来,其中各自的权重如下表所示:
于是通过上面的相关性计算公式可以得到:
于是我们可以得到,第二篇文档的相关性最高,排在最前面返回,然后依次为文档一和文档三。
说了这么多,其实我们还是没有真正地走进Lucene,我们仅仅是对信息检索技术的基础理论进行了一个基本的介绍与了解。然而当我们看过Lucene之后,我们会发现,Lucene是对这种基本理论的一种基础性的实践。所以在以后分析Lucene的文章中,会常常看到上面的理论在Lucene中的具体应用。
在真正的进入Lucene之前,最后对上面的理论介绍进行一个最终总结,如下图所示:
下一篇文章,我们将真正地走进Lucene。