计算平均倒数排名

时间:2018-04-09 12:35:36

标签: python

我正试图找到一种计算搜索引擎MRR的方法。 我知道互惠等级计算如下:

RR = 1 /第一个相关结果的位置

但是,当我知道哪个是我的查询词(我的意思是“问题”)时,这就有用了! 就我而言,我只有结果: 。 。

我有以下数据格式: 查询n.1的正确结果: GT = [doc1,doc2,doc3] 我的查询n.1搜索引擎的结果: SE = [DOC2,doc7,DOC1]

在这种情况下我应该如何计算RR? 直到现在我正按照以下方式进行:

 all_rr=[]
 for i in queries:
     for j in queries_results:
         pos=j.index(i[0])+1
         RR=1/pos
         all_rr.append(RR)
 MRR=np.mean(all_rr)

这是一种正确的方法吗? (p.s.查询是我的GT的数据框,queries_result是我的SE结果数据框)

1 个答案:

答案 0 :(得分:0)

如果您可以负担得起的结果和事实的真相:

import pandas as pd

gts = pd.DataFrame.from_dict([
    {'query': 'q1', 'document': 'doc2'},
    {'query': 'q1', 'document': 'doc3'},
    {'query': 'q2', 'document': 'doc7'},
])

results = pd.DataFrame.from_dict([
    {'query': 'q1', 'document': 'doc1', 'rank': 1},
    {'query': 'q1', 'document': 'doc2', 'rank': 2},
    {'query': 'q1', 'document': 'doc3', 'rank': 3},
    {'query': 'q2', 'document': 'doc4', 'rank': 1},
    {'query': 'q2', 'document': 'doc5', 'rank': 2},
    {'query': 'q2', 'document': 'doc6', 'rank': 3},
])

MAX_RANK = 100000

hits = pd.merge(gts, results,
    on=["query", "document"],
    how="left").fillna(MAX_RANK)

mrr = (1 / hits.groupby('query')['rank'].min()).mean()
相关问题