上一篇介绍了倒排表这种数据结构,接下来将介绍一下词频-逆文档频(tf-idf)这个概念。
首先,什么是词频?词频就是一篇文档包含一个词的次数。
举个例子,如果一篇文档d中“cat”这个词出现了5词,那么我们就说“cat”的词频为5,记做tf(cat)=5。
那么,什么是文档频?这个概念也是对于一个词来说的。通俗来说文档频就是包含一个词的文档数目。
举个例子,如果有100篇文档都有“cat”这个词,我们就说“cat”的文档频为100,记做df(cat)=100。
那么什么叫做逆文档频呢?idf表示逆文档频,检索库中一共有N篇文档,那么idf=log(N/df),例如上例,“cat”的逆文档频记做idf(cat)=log(N/df(cat))=log(N/100)。么为什么需要逆文档频的概念我们后面将会介绍。
为什么需要这几个概念呢?我们下面就说一说。直观上想像,一个搜索引擎应该如何工作呢?
1:首先用户输入查询词。
2:搜索引擎根据查询词查找相应的文档。
3:搜索引擎把查询结果以一定的方式显示给用户。
我们知道搜索引擎还无法做到语义检索,它只会根据一篇文档包不包含查询词来判断这个文档是否符合用户需要。那么显而易见一个能说得通的假设是:一个文档包含查询词的次数越多,就认为该文档越符合用户的需要。
例如:用户查询“cat”,A文档包含“cat”10次,B文档包含“cat”1次,搜索引擎更可能把A文档返回用户。
所以,词频对于搜索引擎来说是一个非常重要的信息。
现在说说逆文档频,它主要告诉搜索引擎用户输入的哪个词更能说明用户的需求。例如用户输入“dog cat”,有100篇文档包含“dog”,但是只有一篇文档包含“cat”。这样搜索引擎就认为用户可能更想得到包含“cat”的文档,因为该词足够特殊(包含该词的文档数目少),要不然用户怎么会输入这个词来作为查询呢?所以搜索引擎会把包含“cat”的这篇文档放在结果列表的第一个位置,而把剩下的包含“dog”的文档放在后面。
通过这个例子也说明,包含文档频较高的词的文档的排序位置会放在包含文档频较低的文档的后面,即词的重要程度和该词的文档频成反比。所以,逆文档频这个信息对于搜索引擎来说也是非常重要的。
为什么逆文档频要表现成这个样子?为什么不是简单的表示成1/df?我当时也有这个疑问,后来到网上查,再加上自己的理解,我得出了下面的看似合理其实我又说不太明白的原因:
假设用户输入K个查询词,那么一篇文档相对于这个查询的重要性可以用下面的式子表示
Dw=tf1*idf1+tf2*idf2+……+tfk*idfk。其中tfi是第i个查询词对于d的词频,idfi是第i个查询词的逆文档频。
通常,对于一个词来说它的tf可能会远远小于df。Idf主要表示一个词的重要程度,idf=1/df这种形式的逆文档频不怎么好, df即使不用很大, idf就已经比较小了,如果df很大的话,计算上的精度无法保证,并且这个词和其它词相比可有可无,这显然也不是我们想要的,我们并不想由于其文档频过高而忽视它。那么又有idf=N/df,其中N为文档总数。这种形式也不怎么好,比如当df=1时,那么这个词的重要程度将会出奇的大,以至于掩盖了其它所有词的价值。所以人们又提出了这种形式的逆文档频idf=log(N/df),由于log函数增长相对缓慢,所以表现的比较温和,而且实际上用这个值去计算效果也要比其它的要好。所以综上所述,这种形式是一个经验性的结果。当然上面的想法是我自己的,做不得准。吴军博士的《数学之美》上对这个东西有了一个详尽的介绍。根据他所言,Idf的形式是早在1972年就有斯巴克.琼斯提出来了,但是提出者也没有说idf为啥长成这个样子,之后的科学家们就尝试解释这个东西,直到2004年才有人给出了正确的解释,解释过程相当复杂,用了18页的篇幅。
上面说到,搜索引擎会把不同的文档放在结果列表的不同位置上来彰显一个文档符合用户需要的程度,所以检索技术还有一个很重要的部分就是搜索引擎的结果排序,即文档排序。为什么需要排序呢?这主要是因为,搜索引擎返回给用户的文档数目会非常之多,可能会有几十万甚至几百万之多。如果毫无章法的返回给用户,那么用户将会再一次陷入文档的汪洋大海之中,只不过这个大海的规模由几百亿个文档变成几十万个文档而已,但是人哪有那么多经历去翻阅这几十万篇文档呢?搜索引擎把自己认为最符合用户需求的文档放到列表靠前的位置,这样人们只要顺次查看少许文档就能够获取到满意文档。那么文档按照什么指标排序这些问题都要解决。而要解决这些问题就需要介绍一下检索模型以及相似度等概念,这些具体细节放到以后的博客中去介绍。