这篇文章是一个系列的第一篇,我们将讨论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的最大值和最小值。
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'中的匹配被视为更重要,应该获得更高的评分。但关于这一点将在未来的文章中详细讨论。