| from collections import defaultdict | |
| def rrf(rank_lists, k=10, K=60): | |
| scores = defaultdict(float) | |
| id2doc = {} | |
| for rl in rank_lists: | |
| for r, (doc, _) in enumerate(rl): | |
| id2doc[doc.id] = doc | |
| scores[doc.id] += 1.0 / (K + r + 1) | |
| ranked = sorted(scores.items(), key=lambda x: x[1], reverse=True)[:k] | |
| return [(id2doc[i], s) for i, s in ranked] | |