33 lines
975 B
Python
33 lines
975 B
Python
import math
|
|
|
|
|
|
def hit_rate(retrieved_ids: list[str], relevant_ids: list[str]) -> float:
|
|
if not relevant_ids:
|
|
return 0.0
|
|
return 1.0 if any(r in set(relevant_ids) for r in retrieved_ids) else 0.0
|
|
|
|
|
|
def mrr(retrieved_ids: list[str], relevant_ids: list[str]) -> float:
|
|
if not relevant_ids:
|
|
return 0.0
|
|
relevant_set = set(relevant_ids)
|
|
for rank, rid in enumerate(retrieved_ids, start=1):
|
|
if rid in relevant_set:
|
|
return 1.0 / rank
|
|
return 0.0
|
|
|
|
|
|
def ndcg(retrieved_ids: list[str], relevant_ids: list[str], k: int = 10) -> float:
|
|
if not relevant_ids:
|
|
return 0.0
|
|
relevant_set = set(relevant_ids)
|
|
top_k = retrieved_ids[:k]
|
|
dcg = sum(
|
|
1.0 / math.log2(i + 2)
|
|
for i, rid in enumerate(top_k)
|
|
if rid in relevant_set
|
|
)
|
|
ideal_hits = min(len(relevant_set), k)
|
|
idcg = sum(1.0 / math.log2(i + 2) for i in range(ideal_hits))
|
|
return round(dcg / idcg, 4) if idcg > 0 else 0.0
|