BM25算法

BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document, regardless of the inter-relationship between the query terms within a document (e.g., their relative proximity). It is not a single function, but actually a whole family of scoring functions, with slightly different components and parameters. One of the most prominent instantiations of the function is as follows.

BM25算法,通常用来作搜索相关性平分。一句话概况其主要思想:对Query进行语素解析,生成语素qi;然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加权求和,从而得到Query与D的相关性得分。

BM25算法的一般性公式如下:


其中,Q表示Query,qi表示Q解析之后的一个语素(对中文而言,我们可以把对Query的分词作为语素分析,每个词看成语素qi。);d表示一个搜索结果文档;Wi表示语素qi的权重;R(qi,d)表示语素qi与文档d的相关性得分。

下面我们来看如何定义Wi。判断一个词与一个文档的相关性的权重,方法有多种,较常用的是IDF。这里以IDF为例,公式如下:


其中,N为索引中的全部文档数,n(qi)为包含了qi的文档数。

根据IDF的定义可以看出,对于给定的文档集合,包含了qi的文档数越多,qi的权重则越低。也就是说,当很多文档都包含了qi时,qi的区分度就不高,因此使用qi来判断相关性时的重要度就较低。

我们再来看语素qi与文档d的相关性得分R(qi,d)。首先来看BM25中相关性得分的一般形式:



其中,k1,k2,b为调节因子,通常根据经验设置,一般k1=2,b=0.75;fi为qi在d中的出现频率,qfi为qi在Query中的出现频率。dl为文档d的长度,avgdl为所有文档的平均长度。由于绝大部分情况下,qi在Query中只会出现一次,即qfi=1,因此公式可以简化为:


从K的定义中可以看到,参数b的作用是调整文档长度对相关性影响的大小。b越大,文档长度的对相关性得分的影响越大,反之越小。而文档的相对长度越长,K值将越大,则相关性得分会越小。这可以理解为,当文档较长时,包含qi的机会越大,因此,同等fi的情况下,长文档与qi的相关性应该比短文档与qi的相关性弱。

综上,BM25算法的相关性得分公式可总结为:


从BM25的公式可以看到,通过使用不同的语素分析方法、语素权重判定方法,以及语素与文档的相关性判定方法,我们可以衍生出不同的搜索相关性得分计算方法,这就为我们设计算法提供了较大的灵活性。

-----------------------------------------------

 BM25算法

BM25是二元独立模型的扩展,其得分函数有很多形式,最普通的形式如下:

∑ ‍

其中,k1,k2,K均为经验设置的参数,fi是词项在文档中的频率,qfi是词项在查询中的频率。

K1通常为1.2,通常为0-1000

K的形式较为复杂

K=‍

上式中,dl表示文档的长度,avdl表示文档的平均长度,b通常取0.75

2.       BM25具体实现

由于在典型的情况下,没有相关信息,即r和R都是0,而通常的查询中,不会有某个词项出现的次数大于1。因此打分的公式score变为

∑‍

3. 使用Lucene实现BM25

Lucene本身的打分函数集中体现在tf·idf

为了简化实现过程,直接将代码中tf和idf函数的返回值修改为BM25打分公式的两部分。

文档的平均长度在索引建立的时候取得,同时在建立索引的过程中,将每个文档的docID与其长度,保存在一个hashMap中。

具体的函数实现如下(DefaulSimilarity类):



其中TermScore.temp为公式中K+fi的值

Temp的计算在TermScore类中进行计算:

   public float score() {

    assert doc != -1;

    int f = freqs[pointer];

    temp=(float)(1.2*(0.25+0.75*FileSearch.docToken.get(doc))+f);

   

    System.out.println("weightValue: "+weightValue);

    float raw = getSimilarity().tf(f)*weightValue;                                 // compute tf(f)*weight

      //f < SCORE_CACHE_SIZE                        // check cache

      //? scoreCache[f]*temp                          // cache hit

      //: getSimilarity().tf(f)*weightValue*temp;        // cache miss

     

      System.out.println("score func doc id :"+doc+" "+temp+" "+f+" "+ getSimilarity().tf(f));

      System.out.println("raw value is"+raw);

      return norms == null ? raw : raw * SIM_NORM_DECODER[norms[doc] & 0xFF];

}

值得注意的是:在lucene的得分计算中,使用explain函数可以看出,除了tf、idf的乘积之外,还有一个fieldNorm值,这个值的计算是基于索引的建立过程,与文档以及field的长度有关,综合考虑,这个值对于查询的过程还是比较有效的,因此在具体实现中,依然保存了fieldNorm的值。


<think>好的,我现在需要详细解释BM25算法的介绍及实现原理。首先,用户提供了三个引用资料,我需要仔细分析这些内容,确保回答的准确性。 根据引用[2],BM25是基于概率检索框架的算法,由Robertson等人提出,最初在OKapi系统中实现。所以开头应该介绍BM25的基本概念和应用场景,比如信息检索中的文档相关性评分。 接下来,引用[3]提到BM25计算query和文档相关性的三个部分:单词与文档的相关性、单词与query的相关性、单词权重。需要将这些部分拆解开来,逐一说明。比如,词频(TF)、逆文档频率(IDF)、文档长度归一化这些要素。 然后,引用[1]详细列出了BM25的四个组成部分:词频、逆文档频率、长度归一化和评分公式。我需要将这些技术点整合到回答中,可能需要用数学公式展示,并解释每个参数的作用,比如k1和b的意义。 在实现原理部分,需要分步骤说明,比如预处理、计算各组件、综合评分。这里要结合引用中的示例,可能需要用LaTeX公式展示BM25公式,确保格式正确,如使用$$...$$。 然后,关于在ElasticSearch中的应用,引用[1]提到参数调整和混合搜索,这里需要简要说明如何调整k1和b,以及与其他算法的结合使用。 最后,生成相关问题时要覆盖原理、优化、应用、对比等,参考用户示例中的结构,确保问题有针对性且相关。 需要检查是否所有数学表达式都正确使用$或$$,比如词频部分可能用行内公式,而BM25公式用独立公式。同时,确保回答结构清晰,分点阐述,引用标识正确添加。</think>### BM25算法介绍及实现原理 #### 一、BM25算法简介 BM25(Best Match 25)是一种基于概率检索模型的相关性评分算法,主要用于信息检索系统中评估搜索词(query)与文档(document)之间的相关性[^2]。它由Stephen E. Robertson等人提出,并在OKapi系统中首次实现,因此也称为**OKapi BM25**。该算法结合了词频(TF)、逆文档频率(IDF)和文档长度归一化,能够有效平衡搜索结果的准确性与多样性。 --- #### 二、BM25实现原理 BM25的核心思想是通过以下三个组件计算相关性得分: 1. **词频(TF)** 衡量单词在文档中的出现频率,词频越高得分越高,但增长趋势会通过饱和函数控制,公式为: $$\text{TF}_{\text{BM25}} = \frac{(k_1 + 1) \cdot \text{tf}}{k_1 \cdot \left(1 - b + b \cdot \frac{\text{dl}}{\text{avgdl}}\right) + \text{tf}}$$ 其中: - $\text{tf}$:单词在文档中的词频 - $\text{dl}$:文档长度 - $\text{avgdl}$:语料库中文档的平均长度 - $k_1$(默认1.2)和$b$(默认0.75)为可调参数,控制词频饱和度和长度归一化强度[^1]。 2. **逆文档频率(IDF)** 衡量单词在整个语料库中的区分能力,公式为: $$\text{IDF} = \log\left(\frac{N - n + 0.5}{n + 0.5} + 1\right)$$ - $N$:文档总数 - $n$:包含该单词的文档数 3. **长度归一化** 通过参数$b$调节文档长度对得分的影响,避免长文档因包含更多单词而天然占优。 **最终BM25评分公式**: $$\text{BM25}(D, Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \cdot \text{TF}_{\text{BM25}}(q_i, D)$$ --- #### 三、BM25算法实现步骤 1. **预处理** - 对文档和query进行分词、停用词过滤。 2. **计算IDF值** 统计每个单词的$n$(包含该词的文档数)和$N$(总文档数)。 3. **计算词频与长度归一化** 根据文档长度和参数$k_1, b$调整词频权重。 4. **综合得分** 对query中的每个单词计算$\text{IDF} \cdot \text{TF}$,并累加得到最终相关性得分。 --- #### 四、BM25在ElasticSearch中的应用 在ElasticSearch中,BM25是默认的相似度评分算法: - **参数调整**:通过修改`k1`和`b`优化结果(例如`"similarity": {"type": "BM25", "k1": 1.5}`)。 - **混合搜索**:结合布尔模型或语义搜索模型提升效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值