需求:对文本检索结果进行nDcg指标评估

一、数据集

从检索系统中选择一组查询和相应的真实相关性评分或点赞量。确保每个查询都有相关性评分或点赞量作为参考。

二、具体步骤

  1. 对于每个查询,使用检索系统进行检索,并按照相关性评分或点赞量进行排序。
  2. 为每个查询计算相关性的 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 之前,你需要为每个结果分配一个权重。可以将点赞量作为权重,例如,使用点赞量的对数来衡量权重。
  1. 计算 nDCG:将 DCG 和 IDCG 的计算结果应用于每个查询,计算每个查询的 nDCG 值。
  • 计算公式:nDCG§ = DCG§ / IDCG§。
  1. 计算平均 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)