需求:对文本检索结果进行nDcg指标评估
一、数据集
从检索系统中选择一组查询和相应的真实相关性评分或点赞量。确保每个查询都有相关性评分或点赞量作为参考。
二、具体步骤
- 对于每个查询,使用检索系统进行检索,并按照相关性评分或点赞量进行排序。
- 为每个查询计算相关性的 DCG(Discounted Cumulative Gain)和 IDCG(Ideal DCG)。
- 首先,计算 DCG:将每个检索结果的相关性评分与相关性的折扣系数进行相加,然后按照位置进行累积求和。计算公式:DCG§ = rel_1 + rel_2/log2(2) + rel_3/log2(3) + … + rel_p/log2§,其中 p 是结果的位置。
- 然后,计算 IDCG:按照真实相关性评分或点赞量的降序排序,按照相同的方法计算 IDCG。
- 在计算 nDCG 之前,你需要为每个结果分配一个权重。可以将点赞量作为权重,例如,使用点赞量的对数来衡量权重。
- 计算 nDCG:将 DCG 和 IDCG 的计算结果应用于每个查询,计算每个查询的 nDCG 值。
- 计算公式:nDCG§ = DCG§ / IDCG§。
- 计算平均 nDCG:对所有查询的 nDCG 值进行平均计算,得到整体数据集的平均 nDCG。
三、代码
import numpy as np
def compute_nDCG(ranked_results, true_relevance_scores):
# 计算 DCG
def compute_DCG(scores):
dcg = 0
for i, score in enumerate(scores):
dcg += score / np.log2(i + 2)
return dcg
nDCG = []
for i in range(len(ranked_results)):
ranked_list = ranked_results[i]
relevance_scores = true_relevance_scores[i]
# 按照相关性评分或点赞量进行排序
sorted_indices = np.argsort(ranked_list)[::-1]
sorted_scores = np.array(relevance_scores)[sorted_indices]
# 计算 DCG 和 IDCG
DCG = compute_DCG(sorted_scores)
ideal_sorted_scores = np.sort(relevance_scores)[::-1]
IDCG = compute_DCG(ideal_sorted_scores)
# 计算 nDCG
nDCG.append(DCG / IDCG if IDCG != 0 else 0)
# 计算平均 nDCG
avg_nDCG = np.mean(nDCG)
return avg_nDCG
# 示例数据
queries = ['query1', 'query2', 'query3']
ranked_results = [
[3, 2, 5, 1, 4], # 检索结果的相关性评分或点赞量
[2, 4, 1, 3, 5],
[5, 4, 3, 2, 1]
]
true_relevance_scores = [
[5, 4, 3, 2, 1], # 真实相关性评分或点赞量
[4, 2, 1, 3, 5],
[5, 3, 1, 2, 4]
]
# 计算 nDCG
avg_nDCG = compute_nDCG(ranked_results, true_relevance_scores)
print("Average nDCG:", avg_nDCG)