首页 > 编程语言 >BM25(Best Matching 25)算法基本思想

BM25(Best Matching 25)算法基本思想

时间:2024-01-14 23:13:16浏览次数:34  
标签:25 term BM25 doc self 文档 query Matching

  BM25(Best Matching 25)是一种用于信息检索(Information Retrieval)和文本挖掘的算法,它被广泛应用于搜索引擎和相关领域。BM25 基于 TF-IDF(Term Frequency-Inverse Document Frequency)的思想,但对其进行了改进以考虑文档的长度等因素。

一.基本思想

  以下是 BM25 算法的基本思想:

  1. TF-IDF 的改进: BM25 通过对文档中的每个词项引入饱和函数(saturation function)和文档长度因子,改进了 TF-IDF 的计算。
  2. 饱和函数: 在 BM25 中,对于词项的出现次数(TF),引入了一个饱和函数来调整其权重。这是为了防止某个词项在文档中出现次数过多导致权重过大。
  3. 文档长度因子: BM25 考虑了文档的长度,引入了文档长度因子,使得文档长度对权重的影响不是线性的。这样可以更好地适应不同长度的文档。

二.计算方程

  BM25 的具体计算公式如下:

其中:

  • 是查询中的词项数。
  • 是查询中的第个词项。
  • 是逆文档频率,计算方式通常是,其中是文档总数, 是包含词项的文档数。
  • 是词项在文档 中的出现次数(TF)。
  • 是文档 的长度。
  • 是所有文档的平均长度。
  • 是调整参数,通常设置为

  BM25 算法的实现通常用于排序文档,使得与查询更相关的文档排名更靠前。在信息检索领域,BM25 已经成为一个经典的算法。

三.Python 实现

  以下是一个简单的 Python 实现 BM25 算法的例子。请注意,实际应用中可能需要进行更复杂的文本预处理,例如去除停用词、词干化等。

import math
from collections import Counter

class BM25:
    def __init__(self, corpus, k1=1.5, b=0.75):
        self.k1 = k1
        self.b = b
        self.corpus = corpus
        self.doc_lengths = [len(doc) for doc in corpus]
        self.avg_doc_length = sum(self.doc_lengths) / len(self.doc_lengths)
        self.doc_count = len(corpus)
        self.doc_term_freqs = [Counter(doc) for doc in corpus]
        self.inverted_index = self.build_inverted_index()

    def build_inverted_index(self):
        inverted_index = {}
        for doc_id, doc_term_freq in enumerate(self.doc_term_freqs):
            for term, freq in doc_term_freq.items():
                if term not in inverted_index:
                    inverted_index[term] = []
                inverted_index[term].append((doc_id, freq))
        return inverted_index

    def idf(self, term):
        doc_freq = len(self.inverted_index.get(term, []))
        if doc_freq == 0:
            return 0
        return math.log((self.doc_count - doc_freq + 0.5) / (doc_freq + 0.5) + 1.0)

    def bm25_score(self, query_terms, doc_id):
        score = 0
        doc_length = self.doc_lengths[doc_id]
        for term in query_terms:
            tf = self.doc_term_freqs[doc_id].get(term, 0)
            idf = self.idf(term)
            numerator = tf * (self.k1 + 1)
            denominator = tf + self.k1 * (1 - self.b + self.b * (doc_length / self.avg_doc_length))
            score += idf * (numerator / denominator)
        return score

    def rank_documents(self, query):
        query_terms = query.split()
        scores = [(doc_id, self.bm25_score(query_terms, doc_id)) for doc_id in range(self.doc_count)]
        sorted_scores = sorted(scores, key=lambda x: x[1], reverse=True)
        return sorted_scores

# Example usage
corpus = [
    "The quick brown fox jumps over the lazy dog",
    "A quick brown dog outpaces a swift fox",
    "The dog is lazy but the fox is swift",
    "Lazy dogs and swift foxes"
]

bm25 = BM25(corpus)
query = "quick brown dog"
result = bm25.rank_documents(query)

print("BM25 Scores for the query '{}':".format(query))
for doc_id, score in result:
    print("Document {}: {}".format(doc_id, score))

  此代码创建了一个简单的 BM25 类,通过给定的语料库计算查询与文档的相关性得分。




NLP工程化

1.本公众号以对话系统为中心,专注于Python/C++/CUDA、ML/DL/RL和NLP/KG/DS/LLM领域的技术分享。
2.本公众号Roadmap可查看飞书文档:https://z0yrmerhgi8.feishu.cn/wiki/Zpewwe2T2iCQfwkSyMOcgwdInhf

NLP工程化

飞书文档

标签:25,term,BM25,doc,self,文档,query,Matching
From: https://www.cnblogs.com/shengshengwang/p/17964409

相关文章

  • 吴师兄学算法day07 双指针 125. 验证回文串
    题目:125. 验证回文串易错点:isaplha()isdigit()lower()要熟悉,挺有用的。我的代码:classSolution:defisPalindrome(self,s:str)->bool:ans=''foriins:ifi.isalpha()ori.isdigit():ans+=i.lower()#......
  • [刷题班] LeetCode125. 验证回文串
    题目描述思路:左右指针只考虑数字和字母字母的话需要全部转化为小写然后使用左右指针判断是否是回文串方法一:classSolution{publicbooleanisPalindrome(Strings){List<Character>list=newArrayList<>();for(charc:s.toCharArray()){......
  • 网工内推 | 信息安全主管,CISP/CISSP认证优先,最高25K
    01武汉华康世纪医疗股份有限公司招聘岗位:网络安全主管职责描述:1、推进公司信息/网络安全管理体系规划、建设、持续改进,促进信息安全管理的推行落地,保障网络、系统与数据安全;2、维护管理信息/网络管理软件,设备如:防火墙、IPS、堡垒机、AD域等;3、负责公司信息/网络安全(风险预防、安......
  • AT_arc125_c [ARC125C] LIS to Original Sequence 题解
    题目传送门前置知识贪心|构造解法对于任意一个未加入序列\(P\)的数\(x<A_{i}(1\lei\lek-1)\),如果其放在了\(A_{i}\)的前面,会导致最长上升子序列长度加一,从而不符合题目要求。因此我们需要把\(x\)放在\(A_{i}\)后面,同理,为符合题目要求,我们仅选择放最小的那一个......
  • 多项式定积分计算软件2025 64位WIN版下载Polynomial definite integral calculation s
    本软件功能强大,价格实惠,欢迎试用本软件的WIN64位版本。本软件能计算如a0+a1*x+a2*x^2+......+an*a^n的式子的对b1和b2的积分的结果。具体的方法就是在多多项式系数区输入a0到an的值,然后点击计算积分结果即可在结果栏算出结果。最大项数为1000项。多项式系数输入时1项1行,从上......
  • Linux的进程管理 [补档-2023-07-25]
    Linux进程管理9-1并发与并行:​并发:在同一个cpu上,并且在一个时间段时,同时运行多个程序。比如在1000毫秒内,我们有5个程序需要执行,所以我们可以将1000毫秒分为5个200毫秒,让每个程序都占用200毫秒的cpu使用权,这样在1000毫秒内就可以执行5个程序。​并行:大于等......
  • 解题报告P2501 [HAOI2006] 数字序列
    P2501[HAOI2006]数字序列题目描述现在我们有一个长度为\(n\)的整数序列\(a\)。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。输入格式第一行是一个整数,表示序列长度\(n\)。第二行有\(n\)个整数,第\(......
  • D25XB100-ASEMI家用电器整流桥D25XB100
    编辑:llD25XB100-ASEMI家用电器整流桥D25XB100型号:D25XB100品牌:ASEMI封装:GBJ-5(带康铜丝)平均正向整流电流(Id):25A最大反向击穿电压(VRM):1000V产品引线数量:5产品内部芯片个数:4产品内部芯片尺寸:72MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:450A正向压降:1.05V恢复时......
  • D25XB100-ASEMI家用电器整流桥D25XB100
    编辑:llD25XB100-ASEMI家用电器整流桥D25XB100型号:D25XB100品牌:ASEMI封装:GBJ-5(带康铜丝)平均正向整流电流(Id):25A最大反向击穿电压(VRM):1000V产品引线数量:5产品内部芯片个数:4产品内部芯片尺寸:72MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:450A正向压降:1.05V恢复时间:工作结温:-40℃~......
  • D25XB80-ASEMI开关电源桥堆D25XB80
    编辑:llD25XB80-ASEMI开关电源桥堆D25XB80型号:D25XB80品牌:ASEMI封装:GBJ-5(带康铜丝)特性:插件、整流桥平均正向整流电流(Id):25A最大反向击穿电压(VRM):800V恢复时间:>2000ns最大RMS电压:引脚数量:5芯片个数:4最大正向压降:1.05V芯片尺寸:110MIL安装扭矩:推荐使用0.6N.m正向浪涌电流(IFSM):450A漏电流:10u......