def min_max_norm(scores): if not scores: return [] mn, mx = min(scores), max(scores) return [(s - mn) / (mx - mn) if mx > mn else 0.0 for s in scores] def fuse_results(sparse_res, dense_res, alpha): s_dict = dict(zip([r[0] for r in sparse_res], min_max_norm([r[1] for r in sparse_res]))) d_dict = dict(zip([r[0] for r in dense_res], min_max_norm([r[1] for r in dense_res]))) fused = {doc_i: alpha * s_dict.get(doc_i, 0.0) + (1 - alpha) * d_dict.get(doc_i, 0.0) for doc_i in set(s_dict.keys()) | set(d_dict.keys())} return sorted(fused.items(), key=lambda x: x[1], reverse=True)