clusd-search / src /fusion.py
Ishika-max
CluSD end-to-end app
4b3b4fa
Raw
History Blame Contribute Delete
625 Bytes
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)