当前位置: 首页 > news >正文

ElasticSearch中的BM25算法实现原理及应用分析

文章目录

  • 一、引言
  • 二、BM25算法实现原理
    • BM25算法的实现原理
      • 1. 词频(TF):
      • 2. 逆文档频率(IDF):
      • 3. 长度归一化:
      • 4. BM25评分公式:
    • BM25算法示例
  • 三、BM25算法在ElasticSearch中的应用分析
    • 3.1 文档搜索
    • 3.2 参数调整
    • 3.3 混合搜索
  • 四、结论

在这里插入图片描述

一、引言

ElasticSearch是一个基于Lucene构建的开源搜索引擎,广泛应用于各种搜索场景中。为了提供高质量的搜索结果,ElasticSearch内部集成了多种信息检索算法,其中BM25算法是ElasticSearch
5.0及以后版本默认的相似度算法。BM25算法是一种基于词频(TF)和逆文档频率(IDF)的评分模型,用于评估查询与文档之间的相关性。本文将详细分析BM25算法的实现原理及其在ElasticSearch中的应用。

二、BM25算法实现原理

BM25算法的实现原理

BM25算法
BM25算法是一种在信息检索中广泛使用的排名函数,用于评估文档与用户查询之间的相关性。该算法是TF-IDF(词频-逆文档频率)的改进版本,旨在解决TF-IDF在处理某些问题时的不足。BM25算法的实现原理主要包括以下几个方面:

1. 词频(TF):

  1. 基本定义
    • 词频(TF)指的是在给定的文档d中,词项t出现的次数。
    • BM25调整:BM25对传统的TF计算方法进行了调整,引入了饱和度和长度归一化,以防止长文档由于包含更多词项而获得不公平的高评分。
  2. 饱和处理
    • 为了避免词项频率过高时产生过大的影响,BM25对TF进行了饱和处理。这通常通过一个非线性函数实现,使得词频的增长在达到一定阈值后变得平缓。
  3. 计算公式(在BM25公式中):
    • 词频f(qi, D)直接作为计算的一部分,但它会被一个饱和函数调整。具体来说,TF部分在BM25公式中通常表示为:
      f r a c f ( q i , D ) c d o t ( k _ 1 + 1 ) f ( q i , D ) + k _ 1 c d o t ( 1 − b + b c d o t f r a c ∣ D ∣ t e x t a v g d l ) \\frac{f(qi, D) \\cdot (k\_1 + 1)}{f(qi, D) + k\_1 \\cdot (1 - b + b \\cdot \\frac{|D|}{\\text{avgdl}})} fracf(qi,D)cdot(k_1+1)f(qi,D)+k_1cdot(1b+bcdotfracDtextavgdl)
      • 其中, ( f ( q i , D ) ) (f(qi, D)) (f(qi,D))是词项(qi)在文档(D)中的出现次数。
      • ( k _ 1 ) (k\_1) (k_1)是一个可调参数,通常设置在1.2到2.0之间,用于控制词频的饱和程度。
      • ( b ) (b) (b)是另一个可调参数,通常设置在0.0到0.75之间,用于控制文档长度对得分的影响。
      • ( ∣ D ∣ ) (|D|) (D)是文档 ( D ) (D) (D)的长度(即词项数量)。
      • t e x t a v g d l text{avgdl} textavgdl 是文档集合中文档的平均长度。
  4. 特点
    • 当词项在文档中出现次数很少时,TF的增加会显著提高该词项在文档中的权重。
    • 然而,随着词项出现次数的增加,TF的增加对权重的贡献会逐渐减小,从而实现饱和效果。
  5. 与TF-IDF中的TF比较
    • 在传统的TF-IDF中,词频通常是直接计算并使用的,没有饱和处理。
    • 而在BM25中,词频经过了一个非线性函数的调整,使得文档中的高频词项不会获得过高的权重。

2. 逆文档频率(IDF):

定义:衡量词项在整个文档集合中稀有程度的指标。
计算方法:通常是基于log函数来计算,即

I D F ( t ) = l o g ( N / d f ( t ) ) IDF(t) = log(N / df(t)) IDF(t)=log(N/df(t))

,其中 N N N是文档总数, d f ( t ) df(t) df(t)是包含词项t的文档数。

3. 长度归一化:

引入原因:考虑到文档长度对评分的影响,BM25引入了长度归一化因子。
实现方式:通过计算文档长度与平均文档长度的比值,并将其作为一个因子加入到评分公式中。

4. BM25评分公式:

公式:

S c o r e ( D , Q ) = ∑ ( I D F ( q i ) ∗ f ( q i , D ) ∗ ( k 1 + 1 ) ) / ( f ( q i , D ) + k 1 ∗ ( 1 − b + b ∗ ∣ D ∣ / a v g d l ) ) Score(D, Q) = ∑(IDF(qi) * f(qi, D) * (k1 + 1)) / (f(qi, D) + k1 * (1 - b + b * |D| / avgdl)) Score(D,Q)=(IDF(qi)f(qi,D)(k1+1))/(f(qi,D)+k1(1b+bD∣/avgdl))

  • D D D:文档
  • Q Q Q:查询,由词项qi组成
  • q i qi qi:查询中的词项
  • f ( q i , D ) f(qi, D) f(qi,D):词项qi在文档D中的词频
  • ∣ D ∣ |D| D:文档D的长度
  • a v g d l avgdl avgdl:文档集合的平均文档长度
  • k 1 k1 k1 b b b:可调节的参数,通常k1取1.2到2.0之间的值,b取0.0到1.0之间的值

 BM25算法示例

BM25算法示例

假设我们有以下简单的场景:

1. 文档集合:包含两篇文档D1和D2。

  • D1: “The cat sat on the mat.”
  • D2: “The dog chased the cat around the house.”
    2. 查询:Q = “cat”

3. 计算步骤:
TF计算:

  • D1中"cat"的TF = 1
  • D2中"cat"的TF = 1

IDF计算 (假设只有两篇文档):

I D F ( " c a t " ) = l o g ( 2 / 2 ) = 0 IDF("cat") = log(2 / 2) = 0 IDF("cat")=log(2/2)=0

(因为"cat"在两篇文档中都出现了)

注意:在实际应用中,由于文档集合通常很大,IDF值通常不会是0。

长度归一化 (假设|D1| = 5, |D2| = 7, avgdl = 6):

  • D1的长度归一化因子 = 1(因为|D1|与avgdl接近)
  • D2的长度归一化因子会稍小一些(因为|D2|略大于avgdl)
  • BM25评分(由于IDF为0,这里的评分仅作为示例):

S c o r e ( D 1 , Q ) = ( 0 ∗ 1 ∗ ( k 1 + 1 ) ) / ( 1 + k 1 ∗ ( 1 − b + b ∗ 5 / 6 ) ) Score(D1, Q) = (0 * 1 * (k1 + 1)) / (1 + k1 * (1 - b + b * 5 / 6)) Score(D1,Q)=(01(k1+1))/(1+k1(1b+b5/6))

S c o r e ( D 2 , Q ) = ( 0 ∗ 1 ∗ ( k 1 + 1 ) ) / ( 1 + k 1 ∗ ( 1 − b + b ∗ 7 / 6 ) ) Score(D2, Q) = (0 * 1 * (k1 + 1)) / (1 + k1 * (1 - b + b * 7 / 6)) Score(D2,Q)=(01(k1+1))/(1+k1(1b+b7/6))

注意:由于IDF为0,这里的评分都为0。在实际应用中,由于IDF不会是0,所以评分会有所不同。

4.结果 :由于评分相同(但实际上不会是0),我们可以根据其他因素(如文档长度、其他词项的评分等)来进一步排序文档。

请注意,这个示例是为了说明BM25算法的计算过程而简化的。在实际应用中,文档集合会更大,IDF值不会是0,并且会考虑查询中的多个词项。

BM25算法在ElasticSearch中的应用分析

三、BM25算法在ElasticSearch中的应用分析

3.1 文档搜索

ElasticSearch使用BM25算法来计算查询与文档的相关性评分,并根据评分对搜索结果进行排序。用户输入的查询会被分词,并与索引中的文档进行匹配,最终返回相关性最高的文档列表。

在文档搜索过程中,用户输入的查询首先会被Elasticsearch的分词器处理成多个查询词项,然后这些词项与索引中的文档进行匹配。BM25算法会根据每个词项在文档中出现的频率(TF)和在整个文档集合中的稀有程度(IDF)来计算每个词项对文档得分的贡献。此外,BM25算法还包括两个可调节的参数k1和b,分别用来控制词频的饱和度和文档长度对得分的影响。

3.2 参数调整

ElasticSearch允许用户根据实际需求调整BM25算法中的参数(如k1,
b),以优化搜索结果的准确性和相关性。通过调整这些参数,可以控制词频、文档长度等因素对评分的影响,从而适应不同的搜索场景和数据集。

3.3 混合搜索

除了使用BM25算法进行文本搜索外,ElasticSearch还支持与其他算法(如向量模型、基于学习的模型等)进行混合搜索。通过结合不同算法的优点,可以进一步提高搜索效率和准确性,满足更复杂的搜索需求。

ElasticSearch

四、结论

ElasticSearch中的BM25算法是一种基于词频和逆文档频率的评分模型,通过计算查询与文档的相关性评分来提供高质量的搜索结果。其实现原理简单而有效,通过调整参数和与其他算法进行混合搜索,可以进一步优化搜索结果的准确性和相关性。在实际应用中,ElasticSearch的BM25算法已经得到了广泛的应用和验证,为用户提供了高效、准确的搜索体验。

相关文章:

ElasticSearch中的BM25算法实现原理及应用分析

文章目录 一、引言二、BM25算法实现原理BM25算法的实现原理1. 词频(TF):2. 逆文档频率(IDF):3. 长度归一化:4. BM25评分公式: BM25算法示例 三、BM25算法在ElasticSearch中的应用分析…...

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了,我们在拿下web权限过后,我们要看自己拿下的是什么权限,可能是普通的用户权限,这个连添加用户都不可以,这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…...

ros1仿真导航机器人 hector_mapping gmapping

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 hector_mapping 建图过程 &#xff08;1&#xff09;gazebo仿真 roslaunch why_simulation why_slam.launch <launch><!-- We resume the logic in empty_world.launch, changing only the name of t…...

嵌入式实验---实验五 串口数据接收实验

一、实验目的 1、掌握STM32F103串口数据接收程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、STM32F103R6能通过查询中断方式接收数据&#xff0c;每接收到一个字节&#xff0c;立即向对方发送一个相同内容的字节&#xff0c;并把该字节的十六进…...

ubuntu 22.04下编译安装glog共享库

笔者是完美主义者&#xff0c;在编译opencv4.9时,有个有关glog的warn&#xff0c;就下载编译google的glog库并把它编译成shared libaray。重新编译opencv4.9时&#xff0c;该warn解除。现把编译安装glog过程记录&#xff0c;以备后查。 以下操作全程以root身份或sudo执行。 cd…...

Linux环境安装配置nginx服务流程

Linux环境的Centos、麒麟、统信操作系统安装配置nginx服务流程操作&#xff1a; 1、官网下载 下载地址 或者通过命令下载 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上传到指定的服务器并解压 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、编译并安装到…...

设计模式-模板模式

简介 模板方法模式是一种行为设计模式&#xff0c;它在父类中定义了一个操作的算法框架&#xff0c;允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的&#xff0c;通过抽象类将通用的代码抽取到超类中&#xff0c;同时通过具体类实现或者改写算法…...

物理删除和逻辑删除区别

物理删除和逻辑删除是数据库管理中针对记录删除操作的两种不同方式&#xff0c;它们的主要区别在于数据的实际处理和后续影响&#xff1a; 物理删除&#xff1a; 操作实质&#xff1a;物理删除会将数据记录从数据库表中彻底移除&#xff0c;包括记录所占的磁盘空间都会被释放。…...

C# 警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset”

警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset” C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\amd64\Microsoft.CSharp.CurrentVersion.targets(129,9): warning MSB3884: 无法找到规则集文件“MinimumRe…...

Lua网站开发之文件表单上传

这个代码示例演示如何上传文件或图片&#xff0c;获取上传信息及保存文件到本地。 local fw require("fastweb") local request require("fastweb.request") local response require("fastweb.response") local cjson require("cjson&q…...

千益畅行,旅游卡,如何赚钱?

​ 赚钱这件事情&#xff0c;只有自己努力执行才会有结果。生活中没有幸运二字&#xff0c;每个光鲜亮丽的背后&#xff0c;都是不为人知的付出&#xff01; #旅游卡服务#...

Element-plus点击当前行之后获取数据显示跟随行数据

要实现点击当前行后&#xff0c;在当前行的下方显示数据&#xff0c;可以通过以下步骤来实现&#xff1a; 在表格的行点击事件中获取当前点击行的位置信息。根据位置信息动态计算并设置需要显示数据区域的位置。 下面是一个更新后的示例代码&#xff0c;演示如何在 Element-P…...

Docker与微服务实战2022 尚

Docker与微服务实战2022 尚硅谷讲师:周阳 1. 基础篇(零基小白) 1 1.1. Docker简介 2 1.2. Docker安装 15 1.3. Docker常用命令 29 1.4. Docker镜像 43 1.5. 本地镜像发布到阿里云 50 1.6. 本地镜像发布到私有库 57 1.7. Docker容器数据卷 64 1.8. Docker常规安装简介 …...

Spring @Cacheable缓存注解用法说明

注解Cacheable 是 Spring 框架中用于缓存数据的方法或类的注解。通过使用这个注解&#xff0c;你可以避免重复计算和重复获取数据&#xff0c;从而提高应用程序的性能。 基本用法 引入依赖 确保在你的项目中引入了 Spring Cache 相关的依赖。如果你使用的是 Spring Boot&…...

Redis如何实现主从复制

Redis主从复制包括全量复制和增量复制。主是主服务器&#xff0c;从是从服务器&#xff0c;主服务器(master &#xff09;的数据如果更新了也会同步到从服务器(slave)&#xff0c;一个主服务器可以搭配很多个从服务器&#xff0c;主服务器负责写入&#xff0c;从服务器只能读取…...

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容&#xff0c;文本三剑客都是针对文本内容。 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 awk&#xff1a;按行取列 一、grep grep的作用使用正则表达式来匹配文本内容 1、grep选项 -m&#xff1a;匹配几次之后停止…...

HSRP热备份路由协议(VRRP虚拟路由冗余协议)配置以及实现负载均衡

1、相关原理 在网络中&#xff0c;如果一台作为默认网关的三层交换机或者路由器损坏&#xff0c;所有使用该网关为下一跳的主机通信必然中断&#xff0c;即使配置多个默认网关&#xff0c;在不重启终端的情况下&#xff0c;也不能彻底换到新网关。Cisco提出了HSRP热备份路由协…...

不同集成学习算法的比较:随机森林、AdaBoost、XGBoost、LightGBM

好的&#xff0c;我来为您比较一些常见的集成学习算法&#xff0c;并生成表格形式以便于对比&#xff1a; 算法主要思想和特点应用场景并行处理支持稳定性和鲁棒性主要优化策略和技术AdaBoost使用加权投票组合多个弱分类器&#xff0c;逐步提升分类器性能二分类和多分类问题&a…...

【聊聊原子性,中断,以及nodejs中的具体示例】

什么是原子性 从一个例子说起&#xff0c; x &#xff0c;读和写 &#xff0c; 如图假设多线程&#xff0c;线程1和线程2同时操作变量x&#xff0c;进行x的操作&#xff0c;那么由于写的过程中&#xff0c;都会先读一份x数据到cpu的寄存器中&#xff0c;所以这个时候cpu1 和 c…...

常见网络端口号

在网络工程领域&#xff0c;了解和掌握默认端口号是至关重要的。端口号是计算机网络中最基本的概念之 一&#xff0c;用于标识特定的网络服务或应用程序。 1、什么是端口号&#xff1f; 端口号是计算机网络中的一种标识&#xff0c;用于区分不同的网络服务和应用程序。每个端…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...