Elasticsearch相关度评分算法(三):BM25(Okapi BM25)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch相关度评分算法(三):BM25(Okapi BM25)

1、引言

BM25(全称:Okapi BM25) 其中 BM 指的 Best Matching 的缩写,是搜索引擎常用的一种相关度评分函数。和TF/IDF一样,BM25 也是基于词频和文档频率和文档长度相关性来计算相关度,但是规则有所不同,文章中将会给出详细讲解。


BM25 也被认为是 目前最先进的 评分算法。


2、相关度概率模型

BM25 是一个 bag-of-words 检索功能,它根据每个文档中出现的查询词对一组文档进行排名,而不管它们在文档中的接近程度如何。它是一系列评分函数,其组件和参数略有不同。


3、Okapi BM25 函数

给定一个查询Q QQ,包含关键词 q 1 , q 2 , ⋅ ⋅ ⋅ , q n q_1,q_2,···,q_nq

 ,对于文档 D DD 的 BM25 分数为计算公式:

微信截图_20221118075344.png

score(D,Q):表示查询Q QQ对文档D DD的最终评分

IDF(q_i)表示查询词的 I D F IDFIDF 权重,其计算公式为

S(q_i,D表示

qi:表示查询Q中第 i 个 term

D:表示当前计算评分的文档


3.1 逆文档频率:IDF(q_i)

3.1.1 函数公式及参数

微信截图_20221118075612.png


N:指的是索引中的文档总数

n(q_i)表示包含的文档的q_i 的文档个数。


3.1.2 函数曲线

以下是IDF(qi)随着文档频率n(qi)(反词频)的变化曲线:

d81f0825208448b5b9bb7425ae7019a4.png

BM25 的 IDF 看起来与经典的 Lucene IDF 差别不大。这里存在差异的原因是它采用了概率相关模型,而 TF-IDF 所使用的的是向量空间模型


3.1.3 总结

原本IDF(qi)对文档频率(反词频)非常高的词项是有可能计算出负值得出负分的,所以 Lucene 对 BM25 的常规 IDF 进行了一项优化:通过在获取对数之前将值加 1,让结果无法得出负值。最终结果是一个看起来和 Lucene 当前的 IDF 曲线极为相似的 IDF曲线。


总结:BM25 相对于 TF-IDF 在 IDF 计算分数的层面上增益并不明显。


3.2 词频相关性函数:S(qi,D)

3.2.1 函数及参数

微信截图_20221118075957.png


f(qi,D)表示词项qi在文档D中的词频。

K:表示文档长度相关性(这里的文档长度指的是词项个数)。

k1:控制非线性项频率归一化(饱和度),默认值为1.2


3.2.2 相关性曲线

在 TF-IDF 算法中,coord(q,d)可以对匹配到的词项提供加成,文档中出现的次数越多,加成越多,这个关系是一个线性函数。


但是,如果同一个 doc 中,出现了 1000 次某个相同的词项,比如 _id = 1 的文档的 title 字段为:“苹果-苹果- ··· -苹果”(共 1000 次苹果),而 _id = 2 的文档的 title 字段为:“苹果-苹果-···-苹果”(共 100 次苹果)。那么对于词项“苹果”,文档1的相关性应该是文档2的十倍吗?


显然不是,对于文档一和文档二,这两个文档对苹果这个词项的相关性应该是非常接近的,换句话说,当文档中出现了一个词项的时候,后面再次出现相同词项,对当前文档的相关性虽然应该有提升,但是提升幅度应该逐渐下降。当词频足够多或者说达到某个阈值的时候,再增加词频对于相关度的提升应该无限趋近于0。


降低 TF 的增益权重的常用手段是对其取平方根,但是这仍然是一个无穷大函数,所以就需要设置一个阈值来限制 TF 的最大值。而 k1就是控制因子。


对于微信截图_20221118080538.png
,将分子分母同时微信截图_20221118080545.png

微信截图_20221118080551.png


其中,K此时为常量,k1也为常量,默认为 1.2,随着f(qi,D) 的不断增大,K/f (qi,D)+1无限趋近于 0,因此K/f(qi,D)+1无限趋近于1,所以此时S(qi,D) 的值k为最大值,也就是 k1+1

也就是说,当文档频率不断增大,TF 得分最大值也就是 k1+1而不会继续增大下去。

bf0af5fa254549c8a5802f38d833a754.png


BM25降低了TF的对评分增益率

非常直观的可以看到,这条曲线随着词频的不断增大,无限地趋近于 (k + 1)(默认 k = 1.2)


3.2.3 k1值的作用:

我们可以人为的通过设置 k 的值来控制最大 TF 得分。更重要的一点是增加 k 的值可以延迟 TF 达到最大值的速度,通过拉伸这个临界值,可以来调节较高和较低词频之间的差异相关性。


3.3 文档长度相关性:K

微信截图_20221118081412.png

k1:控制非线性项频率归一化(饱和度),默认值为1.2。

b:控制文档长度标准化t f tftf值的程度,默认值为0.75。

D:表示文档D的词项长度,即 term 数量

avgdl:表示所有文档的平均长度,这里的长度指的是词项的数量。


假设微信截图_20221118081459.png,即微信截图_20221118081514.png

下图是不同 L 下,S(qi,D)随着词频的变化曲线:

  • 紫色曲线为:L  =1/5 即当前文档长度:平均文档长度 = 1:5
  • 红色曲线为:L= 1,即当前文档长度:平均文档长度 = 1:1
  • 黄色曲线为:L= 5,即当前文档长度:平均文档长度 = 5:1

e2a3a5c651a14f9d918c763a1996745b.png

从图中可以看出,L越小,越快的随着词频的增加而达到S(qi,D)即TF评分阈值,也就是最佳分数。


总的来说:当词频越小的时候,提升词频对评分的帮助是越大的。反之,当词频足够的时候,再提升词频对S(qi,D) 的提升几乎无帮助。


4、最终函数公式

微信截图_20221118081846.png

相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
机器学习/深度学习 数据挖掘 索引
Elasticsearch 如何把评分限定在0到1之间?
Elasticsearch 如何把评分限定在0到1之间?
35 0
|
2月前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
|
2月前
|
监控 算法 搜索推荐
科普一下Elasticsearch中BM25算法的使用
科普一下Elasticsearch中BM25算法的使用
168 0
|
12月前
|
存储 算法 API
Elasticsearch评分相关度算法解析
Elasticsearch评分相关度算法解析
119 0
|
算法 数据挖掘 索引
白话Elasticsearch48-深入聚合数据分析之 Percentiles Aggregation-percentiles百分比算法以及网站访问时延统计及Percentiles优化
白话Elasticsearch48-深入聚合数据分析之 Percentiles Aggregation-percentiles百分比算法以及网站访问时延统计及Percentiles优化
96 0
|
算法 数据挖掘 索引
白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法
白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法
127 0
|
算法 数据挖掘
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
113 0
|
分布式计算 算法 大数据
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
白话Elasticsearch45-深入聚合数据分析之易并行聚合算法,三角选择原则,近似聚合算法
72 0
|
算法
白话Elasticsearch26-深度探秘搜索技术之function_score自定义相关度分数算法
白话Elasticsearch26-深度探秘搜索技术之function_score自定义相关度分数算法
80 0
|
算法 Java
白话Elasticsearch24- 深度探秘搜索技术之TF&IDF算法/向量空间模型算法/lucene的相关度分数算法
白话Elasticsearch24- 深度探秘搜索技术之TF&IDF算法/向量空间模型算法/lucene的相关度分数算法
72 0