NDCG原理和實現

1. 原理

對於搜索引擎,本質是用戶搜一個query, 引擎返回一個結果列表,那麼如何衡量這個結果列表的好壞?

  1. 我們希望把最相關的結果放到排名最靠前的位置,因爲大部分用戶都是從上往下閱讀的, 那麼最相關的前面可以最大程度減少用戶的閱讀時間。

  2. 我們希望整個列表的結果儘可能的和query相關。

第一個條件的滿足是首要的,而第二個條件的加入是保證整體結果質量,而這兩個條件都體現在了NDCG裏面,首先,計算NDCG,需要計算Gain,這個gain即是每條結果的質量的定義,NDCG把所有結果相加最終相加保證,整體質量越高的列表NDCG值越大。同時,Discounted的設計使得越靠前的結果權重越大,這保證了第一條,更相關的排在靠前的結果會有更大的NDCG值。從這兩點看,以NDCG爲優化目標,保證了搜索引擎在返回結果總體質量好的情況下,把更高質量結果排在更前面。

計算公式如下:

https://images0.cnblogs.com/blog/115277/201401/282051166874413.png

CG的實現, 即將所有的打分進行累加, 如下:

https://images0.cnblogs.com/blog/115277/201401/282051173595041.png

其是個不斷累加的值,gain可以使自己定義的一種獲得,用來衡量網頁的相關性程度:

https://images0.cnblogs.com/blog/115277/201401/282051177507455.png

DCG(Discounted Cumulative Gain),Discounted的factor爲:

https://images0.cnblogs.com/blog/115277/201401/282051180781656.png

那麼,NDCG就是被IDEA DCG規格化的值,即DCG/IDCG。

2. 實現

改造自github的代碼, 輸入即是 label, qid, score----樣本,查詢id,分數。實現的功能是計算多個query的平均ncdg。

import sys, math

topK = int(sys.argv[1])

def DCG(label_list):
    dcgsum = 0
    for i in range(len(label_list)):
        dcg = (2**label_list[i] - 1)/math.log(i+2, 2)
        dcgsum += dcg
    return dcgsum

def NDCG(label_list):
    global topK
    dcg = DCG(label_list[0:topK])
    ideal_list = sorted(label_list, reverse=True)
    ideal_dcg = DCG(ideal_list[0:topK])
    if ideal_dcg == 0:
        return 0
    return dcg/ideal_dcg

def queryNDCG(label_qid_score):
    tmp = sorted(label_qid_score, key = lambda x:-x[2])
    label_list = []
    for label,q,s in tmp:
        label_list.append(label)
    return NDCG(label_list)
    
last_qid = ""
l_q_s = []

ndcg = 0
cnt = 0

for line in sys.stdin:
    label, qid, score = line.rstrip().split(" ")
    if last_qid != "" and qid != last_qid:
        ndcg += queryNDCG(l_q_s)
        cnt += 1
        l_q_s= []
    last_qid = qid
    l_q_s.append([int(label),qid, float(score)])

if last_qid != "":
    ndcg += queryNDCG(l_q_s)
    cnt += 1

#print cnt
print ndcg/cnt

3. 應用

主要是應用評價搜索引擎的排序是否合理。應用主要有三種不同的方案:

  1. 最精準的方案是,用人工標註的方案,如何doc的數據量較少的時候,可以採用這種方案。
  2. 拉取競品的排序數據,可以爲一個排序打分參考, 如果競品做得比較好的,還是值得參考的。
  3. 拉取用戶點擊行爲進行評估。

有了排序的分值,即可實現NDCG的評估和計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章