搜索之BM25和BM25F模型

本文介绍了文本检索中的BM25与BM25F模型,BM25模型基于二元假设模型(BIM)进行了改进,考虑了词汇在文档中的频率和文档长度等因素;BM25F则进一步针对文档结构化后的各字段赋予不同权重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引子 BIM(二元假设模型)        

最近在优化文本相关性,使用到BM25和BM25F模型,但是发现网络上关于BM25和BM25F模型的介绍比较少,在此总结一下,方便记忆,另一方面搜了一下相关的资料,发现比较少,写下来欢迎大家查阅。

介绍BM25模型首先要介绍二元独立模型BIM。

假设一:二元假设

    所谓二元假设,类似于布尔模型的表示方法,一篇文章在由特征表示的时候,以特征“出现”和“不出现”两种情况来表示,也可以理解为相关不相关。

假设二:词汇独立性假设

    所谓独立性假设,是指文档里出现的单词之间没有任何关联,任一个单词在文章中的分布率不依赖于另一个单词是否出现,这个假设明显与事实不符,但是为了简化计算,很多地方需要做出独立性假设,这种假设是普遍的。

    在以上两个假设的前提下,二元独立模型即可以对两个因子P(D|R)和P(D|NR)进行估算(条件概率),举个简单的例子,文档D中五个单词的出现情况如下:{1,0,1,0,1} 0表示不出现,1表示出现。用Pi表示第i个单词在相关文档中出现的概率,在已知相关文档集合的情况下,观察到文档D的概率为:

对于因子P(D|NR),我们假设用Si表示第i个单词在在不相关文档集合中出现的概率,于是在已知不相关文档集合的情况下,观察到文档D的概率为:


于是我们可以得到下面的估算


可以将各个因子规划为两个部分,一部分是在文档D中出现的各个单词的概率乘积,另一部分是没在文档D中出现的各个单词的概率乘积,于是公式可以理解为下面的形式


对公式进行一下等价的变换,可得:


第一部分代表在文章中出现过的单词所计算得到的单词概率乘积,第二部分表示所有特征词计算得到单词概率乘积,它与具体的文档无关,所有文档该项的得分一致,所以在排序中不起作用,可以抹除掉。得到最终的估算公式:


为了方便计算,对上述公式两边取log,得到:


那么如何估算概率Si和Pi呢,如果给定用户查询,我们能确定哪些文档集合构成了相关文档集合,哪些文档构成了不相关文档集合,那么就可以用如下的数据对概率进行估算:


根据上表可以计算出Pi和Si的概率估值,为了避免log(0),对估值公式进行平滑操作,分子+0.5,分母+1.0



代入估值公式得到:


        这个公式代表的含义就是,对于同时出现在查询Q和文档D中的单词,累加每个单词的估值结果就是文档D和查询Q的相关性度量,在预先不知道哪些文档相关哪些文档不相关的情况下,可以使用固定值代替,这种情况下该公式等价于向量空间模型(VSM)中的IDF因子,实际证明该模型的实际使用结果不好,但是它是BM25模型的基础。

二、BM25模型

BIM(二元假设模型)对于单词特征,只考虑单词是否在doc中出现过,并没有考虑单词本身的相关特征,BM25在BIM的基础上引入单词在查询中的权值,单词在doc中的权值,以及一些经验参数,所以BM25在实际应用中效果要远远好于BIM模型。


        BM25由3部分组成,第一部分是BIM模型得分,上面也提到了,在一定的情况下该部分等价于IDF,第二部分是查询词在文档D中的权值,f是查询词在文档中的频率,K1和K是经验参数,第三部分是查询词自身的特征,qf是查询词在用户查询中的频率,但一般用户查询都比较短,qf一般是1,K2是经验参数,从上面的公式可以看出BM25是查询中单词的分值叠加得到,每个单词是一个个体,而整个文档被作为一个整体。

    在第二部分中K因子代表了文档长度的考虑,dl是文档的长度,avdl是文档的平均长度,k1和b是调整参数,b为0时即不考虑文档长度的影响,经验表明b=0.75左右效果比较好。但是也要根据相应的场景进行调整。b越大对文档长度的惩罚越大,k1因子用于调整词频,极限情况下k1=0,则第二部分退化成1,及词频特征失效,可以证明k1越大词频的作用越大。

       在我们不知道哪些文档相关,哪些文档不相关的情况下,将相关文档数R及包含查询词相关文档数r设为0,那么第一部分的BIM公式退化成:


就是IDF因子的定义,N是总文档数,n是查询词的tf信息,0.5是平滑因子。以上就是BM25的定义




三、BM25F

   BM25F是典型BM25的改进算法,BM25在计算相关性时把文档当做整体来考虑,但随着搜索技术的发展,文档慢慢的被结构化数据所代替,没个文档都会被切分成多个独立的域,尤其是垂直化的搜索。例如网页有可能被切分成标题,内容,主题词等域,这些域对文章主题的贡献不能同等对待,所以权重就要有所偏重,BM25没有考虑这点,所以BM25F在此基础上做了一些改进,就是不再单单的将单词作为个体考虑,而且将文档也按照field划分为个体二考虑,所以BM25F是每个单词在各个field中分值的加权求和。



boost是相应域的权值,Lc是field的长度,AVLc是field的平均长度,Bc是调节因子。最后BM25F的最终值就是各个field分值的加权求和。


引用:张俊林《这就是搜索引擎》

Integrating the Probabilistic Model BM25/BM25F into Lucene.


BM25F是一种基于概率模型的信息检索算法,用于评估文档对于查询的相关度。它通过考虑词汇频率、文档长度以及查询的出现次数等信息来进行评分。Python 中实现 BM25F 算法的一种常见方式是利用`sklearn`库中的`TfidfVectorizer`功能,并自定义相关函数对公式进行调整,使其符合 BM25F 的计算逻辑。 ### Python 实现步骤: #### 步骤 1: 导入所需库 ```python from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np ``` #### 步骤 2: 准备数据集 首先,创建一个包含一系列文档的数据列表,用于训练测试搜索模型。 ```python documents = [ "这个产品非常棒,质量好。", "他们的服务态度很好,让人感到宾至如归。", "价格有点贵,但是性价比高。", "他们提供的售后服务很及时。", "产品设计独特,颜色丰富,很有创意。" ] queries = ["产品质量", "服务质量", "价格", "售后", "设计"] ``` #### 步骤 3: 使用 TF-IDF 进行向量化 `TfidfVectorizer` 可以将文本转换成矩阵形式,便于后续处理。 ```python vectorizer = TfidfVectorizer(use_idf=True) X_documents = vectorizer.fit_transform(documents) ``` #### 步骤 4: 调整为 BM25F 样式 为了适应 BM25F 的需求,需要自行实现相关逻辑。这里提供一种简化的版本实现,注意这只是一个示例,实际应用中可能需要更详细的参数调整。 ```python def bm25f_score(doc_vector, query): doc_length = len(documents) # 总文档数 avg_doc_len = X_documents.mean(axis=0).A1 # 平均文档长度 idf = np.log((doc_length - query.count(" ") + 0.5) / (query.count(" ") + 0.5)) if query.count(" ") > 0 else 0 numerator = (idf * (query.count(query.split()) + 0.5)) * ((doc_vector.data * (query.count(query.split())) + 0.5)) denominator = doc_vector.sum() + 0.5 + (1.5 * (doc_vector.nnz + 0.5)) return numerator / denominator # 对每个查询计算分数并排序 scores = [] for q in queries: scores.append(bm25f_score(X_documents, q)) sorted_indices = sorted(range(len(scores)), key=lambda k: scores[k], reverse=True) print("最高得分:", queries[sorted_indices]) print("次高得分:", queries[sorted_indices]) print("第三高得分:", queries[sorted_indices]) ``` 以上就是使用 Python 实现 BM25F 算法的基本步骤。请注意,实际使用中可能需要考虑更多的细节,比如参数调整、错误处理等。 --- ## 相关问题: 1. 在上述例子中,如何调整 `bm25f_score` 函数中的参数以优化搜索结果的质量? 2. BM25F 与其他相似的文本匹配算法相比,有何优缺点? 3. 在构建大型文档集合的情况下,如何高效地进行 BM25F 计算?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值