文章目录
- Reciprocal Rank Fusion 简介
- 核心原理
- 算法特点
- 应用场景
- 示例代码
- 注意事项
Reciprocal Rank Fusion 简介
Reciprocal Rank Fusion (RRF) 是一种用于融合多个排序列表的算法,常用于信息检索、推荐系统或搜索引擎中。它通过结合不同排序结果的排名信息,生成一个更优的最终排序。RRF 的核心思想是利用排名的倒数加权求和,使得高排名项在融合结果中更具优势。
核心原理
RRF 的公式如下:
RRFscore ( d ) = ∑ i = 1 k 1 r i ( d ) + c \text{RRFscore}(d) = \sum_{i=1}^{k} \frac{1}{r_i(d) + c}RRFscore(d)=i=1∑kri(d)+c1
其中:
- d dd表示待排序的文档或项。
- k kk表示参与融合的排序列表数量。
- r i ( d ) r_i(d)ri(d)表示文档d dd在第i ii个排序列表中的排名(从 1 开始)。
- c cc是一个常数(通常设为 60),用于平滑低排名项的影响。
算法特点
- 无需归一化:RRF 直接利用排名信息,无需对原始分数进行归一化处理。
- 高排名优先:排名越靠前的项对最终分数的贡献越大,倒数加权强化了头部效应。
- 鲁棒性:对部分列表的噪声或偏差具有一定容错能力。
应用场景
- 多模型融合:结合不同检索模型(如 BM25、深度学习模型)的结果。
- 跨领域排序:合并来自文本、图像等多模态数据的排序列表。
- 推荐系统:聚合用户历史行为、协同过滤等多种推荐策略的输出。
示例代码
以下是一个简单的 Python 实现:
defreciprocal_rank_fusion(rank_lists,c=60):scores={}forr,rank_listinenumerate(rank_lists):forrank,docinenumerate(rank_list,1):scores[doc]=scores.get(doc,0)+1/(rank+c)# 按分数降序排序sorted_docs=sorted(scores.keys(),key=lambdax:-scores[x])returnsorted_docs# 示例输入:两个排序列表list1=["docA","docB","docC"]list2=["docB","docC","docA"]result=reciprocal_rank_fusion([list1,list2])print(result)# 输出融合后的排序注意事项
常数 (c) 的选择会影响低排名项的权重,需根据实际场景调整。
若某些列表未包含全部项,缺失项的排名可按固定值(如列表长度 +1)处理。
RRF 更关注排名相对位置,而非绝对分数,适合异构排序列表的融合。
示例
defrrf_rescore(lists,k=60):rrf_scores={}forrank_listinlists:forrank,iteminenumerate(rank_list,start=1):rrf_scores[item]=rrf_scores.get(item,0)+1/(k+rank)sorted_items=sorted(rrf_scores.items(),key=lambdax:x[1],reverse=True)return[{"score":score,"document":item,"index":i}fori,(item,score)inenumerate(sorted_items)]if__name__=="__main__":lists=[["a","b","c","d"],["b","c","e"],["c","f"],["a","c","g"]]result=rrf_rescore(lists)print(result)