BM25(Best Matching 25)介绍与使用
BM25(Best Matching 25)是一种基于概率检索框架的改进算法,主要用于信息检索中的相关性评分。它通过引入词频饱和函数、文档长度归一化等机制,克服了传统TF-IDF算法的局限性。
一、BM25的核心原理
1. 改进TF-IDF的三大维度
-
词频饱和控制:通过引入非线性函数限制高频词的影响,避免词频无限增长导致相关性偏差。
-
文档长度归一化:对长文档进行惩罚,解决长文档因包含更多关键词而天然得分高的问题。
-
参数可调节性:通过调节因子(如k1、b)灵活控制词频和文档长度的影响程度。
2. 核心设计思想
-
词的重要性(IDF):基于逆文档频率衡量词的区分能力,包含该词的文档越多,其权重越低。
-
词与文档的相关性(TF优化):对词频进行非线性变换,使高频词贡献趋于饱和。
-
词与查询的相关性(查询词频):若查询较长,会额外考虑查询中的词频(qfi),但通常默认qfi=1。
二、BM25的计算公式
BM25的得分公式分为三个部分,最终得分为所有查询词项的加权和:
Score ( Q , D ) = ∑ i = 1 n IDF ( q i ) ⋅ f ( q i , D ) ⋅ ( k 1 + 1 ) f ( q i , D ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ avgdl ) \text{Score}(Q,D) = \sum_{i=1}^n \text{IDF}(q_i) \cdot \frac{f(q_i,D) \cdot (k_1+1)}{f(q_i,D) + k_1 \cdot \left(1 - b + b \cdot \frac{|D|}{\text{avgdl}}\right)} Score(Q,D)=i=1∑nIDF(qi)⋅f(qi,D)+k1⋅(1−b+b⋅avgdl∣D∣)f(qi,D)⋅(k1+1)
- IDF(逆文档频率)
-
公式:
IDF ( q i ) = log ( N − n ( q i ) + 0.5 n ( q i ) + 0.5 ) \text{IDF}(q_i) = \log \left( \frac{N - n(q_i) + 0.5}{n(q_i) + 0.5} \right) IDF(qi)=log(n(qi)+0.5N−n(qi)+0.5)
-
N N N:文档总数
-
n ( q i ) n(q_i) n(qi):包含词项 q i q_i qi的文档数
-
作用:衡量词项的全局区分度,高频词(如“的”)IDF值低。
-
- TF(词频)与长度归一化
-
文档词频 f ( q i , D ) f(q_i,D) f(qi,D):词项 q i q_i qi在文档 D D D中的出现次数。
-
长度归一化因子:
K = k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ avgdl ) K = k_1 \cdot \left(1 - b + b \cdot \frac{|D|}{\text{avgdl}} \right) K=k1⋅(1−b+b⋅avgdl∣D∣)
-
∣ D ∣ |D| ∣D∣:文档 D D D的长度(词数)
-
avgdl \text{avgdl} avgdl:文档集合的平均长度
-
参数作用:
◦ k 1 k_1 k1(默认1.2):控制词频饱和度,值越大饱和速度越慢。
◦ b b b(默认0.75):控制文档长度的影响, b = 0 b=0 b=0时忽略长度。
-
- 得分计算示例
假设文档库中有1000篇文档( N = 1000 N=1000 N=1000),查询词“算法”在50篇文档中出现( n ( q i ) = 50 n(q_i)=50 n(qi)=50),当前文档 D D D中“算法”出现5次( f ( q i , D ) = 5 f(q_i,D)=5 f(qi,D)=5),文档长度 ∣ D ∣ = 800 |D|=800 ∣D∣=800,平均长度 avgdl = 500 \text{avgdl}=500 avgdl=500,参数 k 1 = 1.2 k_1=1.2 k1=1.2, b = 0.75 b=0.75 b=0.75:
- 计算IDF:
IDF = log ( 1000 − 50 + 0.5 50 + 0.5 ) ≈ 2.12 \text{IDF} = \log \left( \frac{1000 - 50 + 0.5}{50 + 0.5} \right) \approx 2.12 IDF=log(50+0.51000−50+0.5)≈2.12 - 计算K值:
K = 1.2 ⋅ ( 1 − 0.75 + 0.75 ⋅ 800 500 ) ≈ 1.8 K = 1.2 \cdot \left(1 - 0.75 + 0.75 \cdot \frac{800}{500} \right) \approx 1.8 K=1.2⋅(1−0.75+0.75⋅500800)≈1.8 - 最终得分:
Score = 2.12 ⋅ 5 ⋅ ( 1.2 + 1 ) 5 + 1.8 ≈ 2.12 ⋅ 1.54 ≈ 3.26 \text{Score} = 2.12 \cdot \frac{5 \cdot (1.2+1)}{5 + 1.8} \approx 2.12 \cdot 1.54 \approx 3.26 Score=2.12⋅5+1.85⋅(1.2+1)≈2.12⋅1.54≈3.26
三、BM25的优势与场景
1. 优势
-
抗长文档偏差:通过归一化因子平衡长文档的天然优势。
-
灵活的参数调节:可根据业务需求调整 k 1 k_1 k1和 b b b,优化排序效果。
-
适用性广:尤其适合短查询与长文档的匹配(如搜索引擎)。
2. 应用场景
-
搜索引擎:Elasticsearch从5.0版本后默认使用BM25。
-
问答系统:结合RAG(检索增强生成)提升答案相关性。
-
推荐系统:用于候选内容与用户查询的匹配评分。
四、与TF-IDF的对比
维度 | TF-IDF | BM25 |
---|---|---|
词频处理 | 线性增长,无上限 | 非线性饱和(如 k 1 = 1.2 k_1=1.2 k1=1.2时趋近于 k 1 + 1 k_1+1 k1+1) |
文档长度 | 无归一化 | 通过参数 b b b动态调整影响 |
参数灵活性 | 固定公式 | 可调节 k 1 k_1 k1、 b b b、 k 3 k_3 k3(查询词频参数) |
相关文章:
BM25(Best Matching 25)介绍与使用
BM25(Best Matching 25)是一种基于概率检索框架的改进算法,主要用于信息检索中的相关性评分。它通过引入词频饱和函数、文档长度归一化等机制,克服了传统TF-IDF算法的局限性。 一、BM25的核心原理 1. 改进TF-IDF的三大维度 词频…...
.NET 函数:检测 SQL 注入风险
以下是一个用 C# 编写的 .NET 函数,用于检测用户输入是否存在潜在的 SQL 注入风险: using System; using System.Text.RegularExpressions;public class SqlInjectionChecker {// 常见 SQL 注入关键词和模式private static readonly string[] SqlKeywor…...
远程数据采集智能网关支持下的雨洪资源分布式监测网络搭建实践
一、项目背景 随着城市化进程的加快以及气候变化的影响,雨洪水管理成为了城市基础设施建设中的重要课题。传统的雨洪水监测手段主要依赖人工巡查和固定站点监测,存在数据获取不及时、不全面,以及在恶劣天气条件下人员安全隐患等诸多问题。为…...
LinuxYUM下载笔记
在基于RPM的Linux发行版(如CentOS、RHEL、Fedora等)中,YUM(Yellowdog Updater Modified)是默认的包管理工具,用于简化软件的安装、更新和依赖管理。以下是YUM的使用指南: 一、检查YUM是否安装 …...
研读论文《Attention Is All You Need》(7)
原文 14 3.2 Attention An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight…...
使用excel 工具做数据清洗
数据分析中有个很重要的预处理步骤,叫做「数据清洗」。 简单来说就是把数据中「脏脏的 」部分 —— 缺失的、重复的、错误的等等,给它清除掉,剩下「干净的」数据。 1、缺失数据 如果某处缺了一两个数据,最简单的方法就是 —— …...
LeetCode 217.存在重复元素
目录 题目: 题目描述: 题目链接: 思路: 思路一详解(排序): 思路二详解(Set): 思路三详解(Map): 代码: …...
Flask 与 Django 服务器部署
一、引言 在 Web 开发领域,Flask 和 Django 是 Python 生态中最受欢迎的两个 Web 框架。Flask 以其轻量级和灵活性著称,适合快速开发小型应用和 API;而 Django 则提供了全面的功能套件,包括 ORM、管理界面和认证系统,…...
Python:操作Excel按行写入
Python按行写入Excel数据,5种实用方法大揭秘! 在日常的数据处理和分析工作中,我们经常需要将数据写入到Excel文件中。Python作为一门强大的编程语言,提供了多种库和方法来实现将数据按行写入Excel文件的功能。本文将详细介绍5种常见的Python按行写入Excel数据的方法,并附上…...
架构演变 -单体到云原生
软件架构的演变是随着技术发展、业务需求和硬件条件的变化而不断迭代的过程。以下是从单体架构到现代云原生架构的典型演变路径及关键阶段特点: 一、单体架构(Monolithic Architecture) 时间阶段:2000 年代前 特点: …...
VSCode 安装教程
访问官网 Visual Studio Code 官网 打开下载的exe文件 选一个安装位置 创建桌面快捷方式 (D) 在桌面生成 VSCode 的快捷图标,方便快速启动程序。 将 “通过 Code 打开” 操作添加到 Windows 资源管理器文件上下文菜单 右键点击文件时,菜单中会新增 “通…...
开源表单设计器FcDesigner配置多语言教程
开源低代码表单设计器FcDesigner中提供了强大的多语言支持功能,允许开发者在表单中实现一键式语言切换。在现代业务应用中,多语言支持是一项基本需求,尤其在国际化产品中。 源码地址: Github | Gitee | 文档 | 在线演示 设计器中配置多语言…...
ONIE安装NOS操作说明
ONIE 安装 NOS 操作说明 1. ONIE 简介 ONIE(Open Network Install Environment)是开放网络设备的出厂预装环境,类似于服务器的PXE/BIOS,主要用于自动或手动安装网络操作系统(NOS,如SONiC、Cumulus、FBOSS等…...
fastadmin 数据导出,设置excel行高和限制图片大小
fastadmin默认导出图片全部都再一块,而且不在单元格里 话不多说,上代码 修改文件的路径: /public/assets/js/require-table.js exportOptions: {fileName: export_ Moment().format("YYYY-MM-DD"),preventInjection: false,mso…...
仿腾讯会议——音频服务器部分
1、中介者定义处理音频帧函数 2、 中介者实现处理音频帧函数 3、绑定函数映射 4、服务器定义音频处理函数 5、 服务器实现音频处理函数...
国产化替代对金融行业有哪些影响?如何应对?
在全球产业链重构与科技自主创新的时代背景下,国产化替代已从技术领域的局部探索,升级为金融行业应对复杂外部环境、夯实发展根基的战略选择。作为国家核心竞争力的重要组成部分,金融行业长期依赖国外技术设备的传统模式正面临安全性、可控性…...
包装类(1)
1.包装类的分类 1.针对八种基本数据类型相应的引用类型--包装类 2.有了类的特点,就可以调用类中的方法. 基本数据类型. 包装类 例: 手动装箱 int->Integer 手动执箱 Integer->int 注:jdk5后就可以自动装箱和拆箱 2.包装类和基本数据的转换 (1)jdk5前的…...
java中如何优雅处理多租户系统的查询?
多租户系统通常是指一个应用服务多个客户(租户),每个租户的数据需要隔离,确保数据安全和隐私。处理这样的系统需要考虑数据隔离、查询效率、代码的可维护性等方面。 首先,我应该明确多租户的实现方式。常见的多租户数据…...
Ubuntu服务器部署多语言项目(Node.js/Python)方式实践
Ubuntu服务器部署多语言项目(Node.js/Python)方式实践 服务器脚本运行方式命令行直接执行nohup后台执行进程 Screen概述安装基本操作命令启动 Screen退出当前会话(不终止进程)查看所有会话重连会话关闭会话 常用快捷键典型使用场景…...
【MySQL】基础操作
MySQL(二)基础操作 一、数据库操作 1.创建库 2.查看库 3.选中库 4.删除库 二、表操作 1.创建表 1.1[comment 注释]: 1.2,...: 2.查看表 2.1查看所有表 2.2查看表结构 3.删除表 三、记录操作 1.插入记录 1.1全列插入 1.2指定列插入 1.3…...
在 Java MyBatis 中遇到 “操作数类型冲突: varbinary 与 float 不兼容” 的解决方法
在 MyBatis 中遇到 “操作数类型冲突: varbinary 与 float 不兼容” 错误,通常是因为当字段值为 null 时,MyBatis 无法正确推断其 JDBC 类型,导致向数据库传递 null 值时类型不匹配。以下是原因分析和解决方案: 问题原因 未指定 j…...
课题推荐——扩展卡尔曼滤波(EKF)估计pmsm的位置误差
扩展卡尔曼滤波(EKF)是一种常用于非线性系统状态估计的方法,特别适用于永磁同步电机(PMSM)的位置和速度估计。EKF可以实时估计电机的转子位置误差(与实际转子位置的偏差),从而提高控…...
elasticsearch之记录es7.17升级8.17 springboot2.7.0 程序改造坑
es7.17升级8.x问题目录 一、硬件安装1-1. centos7 服务器上,删除elasticsearch7.17,安装es8.17 二、 程序改造2-1. Java API Client 8.17.52-2. 依赖引入2-3. 配置文件2-4. Java 配置类 三、根据 Elasticsearch 集群信息(版本 8.17.2…...
SpringBoot+ELK 搭建日志监控平台
ELK 简介 ELK(Elasticsearch, Logstash, Kibana)是一个目前主流的开源日志监控平台。由三个主要组件组成的: Elasticsearch: 是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建…...
家庭数字生态构建实战:基于飞牛fnOS的智能家居数据中台搭建全流程解析
文章目录 前言1. VMware安装飞牛云(fnOS)1.1 打开VMware创建虚拟机1.3 初始化系统 2. 安装Cpolar工具3. 配置远程访问地址4. 远程访问飞牛云NAS5. 固定远程访问地址 前言 在数字生活时代,数据管理正成为每个家庭的刚需。今天要向大家重点推荐…...
博客系统功能测试
博客系统网址:http://8.137.19.140:9090/blog_list.html 主要测试内容 功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试… 测试方法及目的 利用selenium和python编写测试脚本,对博客系统进行的相关…...
抽奖相关功能测试思路
1. 抽奖系统功能测试用例设计(登录 每日3次 中奖40% 道具兑换码) ✅ 功能点分析 必须登录后才能抽奖每天最多抽奖3次抽奖有 40% 概率中奖中奖返回兑换码 ✅ 测试用例设计 编号 用例描述 前置条件 操作 预期结果 TC01 未登录时抽奖 未登录 …...
paddle ocr本地化部署进行文字识别
一、Paddle 简介 1. 基本概念 Paddle(全称 PaddlePaddle,飞桨)是百度开发的 开源深度学习平台,也是中国首个自主研发、功能丰富、技术领先的工业级深度学习平台。它覆盖了深度学习从数据准备、模型训练、模型部署到预测的全流程…...
在CentOS系统上部署GitLabRunner并配置CICD自动项目集成!
在CentOS系统上部署GitLabRunner并配置CICD自动项目集成 在CentOS系统上部署GitLab Runner并配置CI/CD自动项目集成GitLab CI/CD是一个强大的持续集成和持续部署工具,能够显著提高开发团队的效率。 本文将详细介绍如何在CentOS系统上部署GitLab Runner,…...
python学习day2(未写完,明天继续补充)
今天主要学习了变量的数据类型,以及如何使用格式化符号进行输出。 一、认识数据类型 在python里为了应对不同的业务需求,也把数据分为不同的类型。 代码如下: """ 1、按类型将不同的变量存储在不同的类型数据 2、验证这些…...
深度强化学习框架DI-engine
深度强化学习框架DI-engine 一、DI-engine概述:决策智能的通用引擎 DI-engine是由OpenDILab开源的决策智能引擎,基于PyTorch和JAX构建,旨在为强化学习(RL)、模仿学习(IL)、离线学习等场景提供…...
gitlab迁移
需求:需要将A服务器上的 gitlab 迁移到B服务器上,均使用docker 部署 一、备份数据 进入到A服务器的 gitlab 的容器中,运行gitlab-rake gitlab:backup:create 该命令会在 /var/opt/gitlab/backups/ 目录下创建一个xxx_gitlab_backup.tar 压缩…...
UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview---33.2.6 Strings
33.2.6 Strings UEFI 环境中的 string 是使用 UCS-2 格式定义,每个字符由 16bit 数据表示。对于用户界面,strings 也是一种可以安装到 HIIdatabase 的一种数据。 为了本土化,每个 string 通过一个唯一标识符来识别,而每一个标识…...
如何确保低空经济中的数据安全?
低空经济涉及大量敏感数据,如无人机的飞行轨迹、拍摄的地理图像和视频等。为确保这些数据的安全,可从以下几方面着手: 加强数据加密 传输加密 :采用 SSL/TLS 等加密协议,对数据在传输过程中进行加密,防止…...
在linux平台下利用mingw64编译windows程序
背景 笔者平时都是基于linux平台开发C代码,已经熟悉使用CMake这一套工具上一次开发windows应用程序还要追溯到10多年前,彼时还是使用微软的visual studio这个IDE,这个IDE确实也很强大,但也确实很笨重,当时用起来也很不…...
虚幻引擎5-Unreal Engine笔记之什么时候新建GameMode,什么时候新建关卡?
虚幻引擎5-Unreal Engine笔记之什么时候新建GameMode,什么时候新建关卡? code review! 参考笔记: 1.虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 2.虚幻引擎…...
[IMX] 04.定时器 - Timer
目录 1.周期中断定时器 - EPIT 1.1.工作模式 1.2.配置寄存器 - EPIT_CR 1.3.状态寄存器 - EPIT_SR 1.4.加载寄存器 - EPIT_LR 1.5.比较寄存器 - EPIT_CMPR 1.6.计数寄存器 - EPIT_CNR 2.通用定时器 - GPT 2.1. 时钟源 2.2.模块结构 2.3.工作模式 2.4.配置寄存器 - …...
前端 vue + element-ui 框架从 0 - 1 搭建
1. 安装node 地址: Node.js — 在任何地方运行 JavaScript 2. 安装 vue 2.1 执行安装命令 npm uninstall -g vue-cli npm install -g vue/cli 安装最新的vue3版本 2.2 使用vue 脚手架 搭建项目 vue create project_name 2.2.1 注意 项目名称不能包…...
【IDEA】删除/替换文件中所有包含某个字符串的行
目录 前言 正则表达式 示例 使用方法 前言 在日常开发中,频繁地删除无用代码或清理空行是不可避免的操作。许多开发者希望找到一种高效的方式,避免手动选中代码再删除的繁琐过程。 使用正则表达式是处理字符串的一个非常有效的方法。 正则表达式 …...
算法刷题(Java与Python)2.数组、列表
目录 Java的数组 数组介绍 注意事项 Python的列表 列表介绍 Python 的列表和 Java 的 ArrayList 一样吗? 例题1 代码分析 Java代码 Python代码 对比代码 例题2 代码分析 Java代码 Python代码 对比代码 例题三 Java代码 Python代码 代码对比 Jav…...
uniapp打包H5,输入网址空白情况
由于客户预算有限,最近写了两个uniapp打包成H5的案例,总结下面注意事项 1. 发行–网站-PCWeb或手机H5按钮,输入名称,网址 点击【发行】,生成文件 把这个给后端,就可以了 为什么空白呢 最重要一点…...
JavaScript 中使用 Elasticsearch 的正确方式,第一部分
作者:来自 Elastic Jeffrey Rengifo 讲解如何用 JavaScript 创建一个可用于生产环境的 Elasticsearch 后端。 想获得 Elastic 认证?看看下一期 Elasticsearch 工程师培训什么时候开始吧! Elasticsearch 拥有大量新功能,能帮助你…...
每日一道leetcode(增加版)
901. 股票价格跨度 - 力扣(LeetCode) 题目 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今…...
排序复习/下(C语言版)
目录 1.快速排序(hoare法) 单趟: 整体: 代码优化: 编辑三数取中代码: 小区间优化代码: hoare法疑问解答: 2.快速排序(挖坑法) 3.快速排序&#x…...
Vue百日学习计划Day33-35天详细计划-Gemini版
总目标: 在 Day 33-35 理解 Vue 组件从创建到销毁的完整生命周期,熟练掌握 Composition API 中主要的生命周期钩子,并知道在不同阶段执行哪些操作。 所需资源: Vue 3 官方文档 (生命周期钩子): https://cn.vuejs.org/guide/essentials/lifecycle.html你…...
Apidog MCP服务器,连接API规范和AI编码助手的桥梁
#作者:曹付江 文章目录 1.了解 MCP2.什么是 Apidog MCP 服务器?3.Apidog MCP 服务器如何工作4.利用人工智能改变开发工作流程5.设置 Apidog MCP 服务器: 分步指南5.高级功能和提示5.1 使用 OpenAPI 规范5.2.多个项目配置5.3.安全最佳实践5.4…...
统计客户端使用情况,使用es存储数据,实现去重以及计数
这篇文件的重点在tshark、filebeat、和logstash。 需求:统计客户使用的客户端版本 实现工具:tshark 1.10.14,filebeat 8.17.0,logstash 8.17.0,elasticsearch 8.17.0,kibana 8.17.0 总体设计:…...
Git基础面试题
git的rm命令与系统的rm命令有什么区别 git rm 和系统的 rm (在 Windows 上是 del) 命令都用于删除文件,但它们在 Git 仓库的上下文中作用有所不同: 系统 rm (或 del) 命令: 作用: 直接从文件系统中删除文件。Git 的感知ÿ…...
conda 的常用命令
好的,下面为你介绍conda的常用命令: 环境管理 # 创建新环境 conda create -n env_name python3.8# 激活环境 conda activate env_name# 查看所有环境 conda env list# 复制环境 conda create -n new_env --clone old_env# 删除环境 conda remove -n en…...
PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲
PLC双人舞:ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析:施耐德PLC与AB PLC的互联互通 在现代工业自动化中,设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关,将施耐德P…...