Relevance scoring in Manticore : part I

这篇文章是一个系列的第一篇,讨论 Manticore Search 中相关性评分的工作原理。我们从相关性的基础开始:词项频率和特异性。

简单的评分介绍

像 Sphinx/Manticore Search 这样的搜索引擎从文档中提取文本,将其拆分成词元,并允许在该集合上搜索一组词元/单词。
在最简单的情况下,这个集合包含词元/单词(我们称之为索引字典)和找到它们的文档列表以及文档中找到它们的字段。
搜索首先识别输入词之一是否存在于集合中,并提取文档列表,随后与其他词的列表合并,以编制包含输入的所有词的文档列表。
如果有多个文档满足该标准,下一步是区分它们。哪一个文档对给定输入更相关?
一个简单的区分方法是计算每个输入词在文档中的出现次数。更多的出现次数意味着更相关的词吗?这要看情况。
某些词在文档中可能出现多次——我们可以认为这个词对该文档是重要的,但这个词也可能出现在集合中的许多其他文档中——这就引发了一个问题:这个词只是一个常见词,它的重要性应该降低吗?
如果我们计算一个词在文档中的出现次数(频率),我们将希望抑制这些常见词对我们计算的可能影响。为此,我们添加一个计数器,记录包含该词的文档数量——这就是 “词项频率"——还有另一个计数器告诉我们该词在多少文档中找到(与总文档数相比)——它的逆称为逆文档频率(IDF),是术语特异性的一个衡量指标。
这两者共同形成 TF-IDF,它告诉我们一个词在一个集合中的文档中的重要性。基于 IDF,我们还可以计算另一个广泛使用的排名函数—— BM25

BM25 和 TF-IDF

这些因素如何在 Manticore Search 中实现并使用?
首先,有几个内置的排序器(评分公式)可以立即使用。但最重要的是表达式排序器,它允许访问这些因素并创建自定义公式。
我们之前提到 BM25 排名函数,在 Manticore 中它包含在默认排序器中(proximity_bm25),也可以作为排名表达式中的文档级因子使用。
我们不打算详细讨论 BM25,因为有许多学术论文涉及,但我们将专注于 Manticore 的实现。
关于 bm25 因子的一个重要说明是,名称有点不当,因为它并不是 BM25 的传统实现,而是相当于 BM25(K1=1.2,B=0) 的估计,这在某些论文中称为 BM15。
您仍然可以使用经典的 BM25,甚至可以使用 bm25a(k1,b) 排名函数调整 k1 和 b 参数。
一个更高级的版本是 bm25f(k1, b, {field=weight, …}),它允许为字段设置权重。请注意,这与常规的 field_weights(稍后将介绍)不同,并且需要 index_field_lenghts 选项。
在字段级别,TF-IDF 可以通过几种方式访问: **tf\_idf** 是匹配关键字在字段中每次出现的 tf_idf 值的总和。此外, **sum\_idf** 是每个匹配关键字的 tf_idf 值的总和(因此不是乘以出现次数),而 **max\_idf****min\_idf** 提供找到的最大 tf_idf 值和最小 tf_idf 值。
IDF 计算可以通过 **idf**OPTION 子句进行控制。在初始实现(Sphinx 2.1 之前)中,IDF 值是规范化的——这意味着常见词(出现在超过 50% 的文档中)会受到惩罚(idf=‘normalized’)。IDF 的值范围在 [-log(N),log(N)] 之间。在这种模式下,“常见词 + 不那么常见词” 的匹配会得到的 IDF 总和低于仅包含不那么常见词的匹配。为了克服这个问题(如果有这个需要),添加了一种新模式(idf=‘plain’),在该模式下没有 IDF 值的惩罚,值范围在 [0,log(N)] 之间。在此基础上,IDF 值还会除以查询关键字计数,使得 tf_idf 总和适应 [0,1] 范围。
这在布尔查询中带来了一个问题,当搜索 “found-word” 与 “found-word OR not-found-word” 的结果集提供的权重不同,因为除法的存在。
为了解决这个问题, idf 采用了另一对设置,允许控制是否应用除法。默认的 idf 设置保持为 normalized,tfidf_normalized 出于兼容性原因,但 idf='plain,tfidf_unnormalized' 在一般情况下应提供更好的结果。

下一步是什么?

此时,我们可以基于 频率特异性 创建评分,但这仅告诉我们词在文档中,而没有指示词是否紧挨在一起,或者仅仅是分散在文本中。这引出了我们需要在集合中添加的另一项:词在文本中的 位置
拥有位置使我们知道输入词是否匹配文档的确切字段,它们是否逐字出现,或彼此之间的距离如何,或者它们离文本开始的距离如何(因为我们可以认为更靠近甚至开始文本的内容比位于文档末尾的内容更相关)。
由于文档可能有多个字段,因此字段的重要性也可能不同。例如,如果我们有 ’title’ 和 ‘body’ 列,’title’ 中的匹配被认为更重要,应该获得更高的评分。但关于这一点将在以后的文章中讨论。

安装Manticore Search

安装Manticore Search