在搜索引擎的应用场景中,检索结果文档和用户输入的查询词之间的相关性越强,网页排名就越靠前。所以,在搜索引擎对检索结果的打分中,查询词和结果文档的相关性是一个非常重要的判断因子。
那要计算相关性,就必须要提到经典的 TF-IDF 算法了,它能很好地表示一个词在一个文档中的权重。TF-IDF 算法的公式是:相关性 = TF*IDF。其中,TF 是 词频(Term Frequency),IDF 是 逆文档频率(Inverse Document Frequency)。
在利用 TF-IDF 算法计算相关性之前,我们还要理解几个重要概念,分别是词频、文档频率和逆文档频率。
词频 定义的就是一个词项在文档中出现的次数。换一句话说就是,如果一个词项出现了越多次,那这个词在文档中就越重要。
文档频率(Document Frequency),指的是这个词项出现在了多少个文档中。你也可以理解为,如果一个词出现在越多的文档中,那这个词就越普遍,越没有区分度。一个极端的例子,比如“的”字,它基本上在每个文档中都会出现,所以它的区分度就非常低。
那为了方便理解和计算相关性,我们又引入了一个 逆文档频率 的概念。逆文档频率是对文档频率取 倒数,它的值越大,这个词的的区分度就越大。
因此, TF*IDF 表示了我们综合考虑了一个词项的重要性和区分度,结合这两个维度,我们就计算出了一个词项和文档的相关性。不过,在计算的过程中,我们会对 TF 和 IDF 的值都使用对数函数进行平滑处理。处理过程如下图所示:
使用 相关性 = TF*IDF ,我们可以计算一个词项在一个文档中的权重。但是,很多情况下,一个查询中会有多个词项。不过,这也不用担心,处理起来也很简单。我们直接把每个词项和文档的相关性累加起来,就能计算出查询词和文档的总相关性了。
这么说可能比较抽象,我列举了一些具体的数字,我们一起动手来计算一下相关性。假设查询词是「极客时间」,它被分成了两个词项「极客」和「时间」。现在有两个文档都包含了「极客」和「时间」,在文档 1 中,「极客」出现了 10 次,「时间」出现了 10 次。而在文档 2 中,「极客」出现了 1 次,「时间」出现了 100 次。
计算 TF-IDF 需要的数据如下表所示:
那两个文档的最终相关性得分如下:
文档 1 打分 = TFIDF(极客)+ TFIDF(时间)= (1+log(10)) 10 + (1+log(10)) 1 = 20 + 2 = 22
文档 2 打分 = TFIDF(极客)+ TFIDF(时间)=(1+log(1)) 10 + (1+log(100)) 1 = 10 + 3 = 13
你会发现,尽管「时间」这个词项在文档 2 中出现了非常多次,但是,由于「时间」这个词项的 IDF 值比较低,因此,文档 2 的打分并没有文档 1 高。