#combine #ranking #information-retrieval #rbc #rank-fusion

rank_biased_centroids

排序偏置中心(RBC):一种通过偏置高秩一致性的排序融合方法,将多个排序列表合并为一个

4个版本 (2个重大更新)

0.3.1 2022年9月8日
0.2.2 2022年8月21日
0.2.0 2022年8月21日
0.1.0 2022年8月21日

#5 in #ranking

MIT许可证

21KB
122

排序偏置中心(RBC) Crates.io Docs.rs MIT licensed

排序偏置中心(RBC)排序融合方法,用于将多个对象的多个排序合并。

此代码实现了RBC排序融合方法,如

@inproceedings{DBLP:conf/sigir/BaileyMST17,
  author    = {Peter Bailey and
               Alistair Moffat and
               Falk Scholer and
               Paul Thomas},
  title     = {Retrieval Consistency in the 
               Presence of Query Variations},
  booktitle = {Proc of {ACM} {SIGIR} Conference on
               Research and Development in Information Retrieval,
  pages     = {395--404},
  publisher = {{ACM}},
  year      = {2017},
  url       = {https://doi.org/10.1145/3077136.3080839},
  doi       = {10.1145/3077136.3080839},
  timestamp = {Wed, 25 Sep 2019 16:43:14 +0200},
  biburl    = {https://dblp.org/rec/conf/sigir/BaileyMST17.bib},
}

RBC工作的基本步骤是使用一个持久性参数(pphi)来融合多个排序列表,仅基于排序信息。较大的p值给每个排序顶部的元素更高的权重。根据论文

考虑极端值,例如p = 0p = 1。当p = 0时,代理只检查输入排序中的第一个项目,融合的输出按降序分数优先级排列;这有点像一种过半即得的全票选举制度。当p = 1时,每个代理检查每个列表的全部内容,融合的顺序由包含每个项目的列表数量决定——这是一种跨输入集的每个项目的“受欢迎度计数”。在这两个极端之间,代理查看排序时预期达到的深度由1/(1 − p)给出。例如,当p = 0.9时,平均使用每个排序的前10个项目来为融合顺序做出贡献;当然,在整个代理群体中,每个排序中的所有项目都为总体结果做出贡献。

更多论文内容

当排名超过 n 项时,对于排名第 1 的每一项 x ≤ n,我们建议使用几何衰减权重函数,其中 d 在深度 x 的分布由 (1 − p) p^{x-1} 给出,p 的取值范围为 0 ≤ p ≤ 1,由构建融合排名的目的决定。

示例融合

例如(也来自论文)对于 A-G 项目的不同排名顺序(R1-R4)

排名 R1 R2 R3 R4
1 A B A G
2 D D B D
3 B E D E
4 C C C A
5 G - G F
6 F - F C
7 - - E -

根据持久性参数 p,将根据每个项目的累积权重产生不同的输出顺序

排名 p=0.6 p=0.8 p=0.9
1 A(0.89) D(0.61) D(0.35)
2 D(0.86) A(0.50) C(0.28)
3 B(0.78) B(0.49) A(0.27)
4 G(0.50) C(0.37) B(0.27)
5 E(0.31) G(0.37) G(0.23)
6 C(0.29) E(0.31) E(0.22)
7 F(0.11) F(0.21) F(0.18)

代码示例

非加权运行

use rank_biased_centroids::rbc;
let r1 = vec!['A', 'D', 'B', 'C', 'G', 'F'];
let r2 = vec!['B', 'D', 'E', 'C'];
let r3 = vec!['A', 'B', 'D', 'C', 'G', 'F', 'E'];
let r4 = vec!['G', 'D', 'E', 'A', 'F', 'C'];
let p = 0.9;
let res = rbc(vec![r1, r2, r3, r4], p).unwrap();
let exp = vec![
    ('D', 0.35),
    ('C', 0.28),
    ('A', 0.27),
    ('B', 0.27),
    ('G', 0.23),
    ('E', 0.22),
    ('F', 0.18),
];
for ((c, s), (ec, es)) in res.into_ranked_list_with_scores().into_iter().zip(exp.into_iter()) {
    assert_eq!(c, ec);
    approx::assert_abs_diff_eq!(s, es, epsilon = 0.005);
}

加权运行

use rank_biased_centroids::rbc_with_weights;
let r1 = vec!['A', 'D', 'B', 'C', 'G', 'F'];
let r2 = vec!['B', 'D', 'E', 'C'];
let r3 = vec!['A', 'B', 'D', 'C', 'G', 'F', 'E'];
let r4 = vec!['G', 'D', 'E', 'A', 'F', 'C'];
let p = 0.9;
let run_weights = vec![0.3, 1.3, 0.4, 1.4];
let res = rbc_with_weights(vec![r1, r2, r3, r4],run_weights, p).unwrap();
let exp = vec![
    ('D', 0.30),
    ('E', 0.24),
    ('C', 0.23),
    ('B', 0.19),
    ('G', 0.19),
    ('A', 0.17),
    ('F', 0.13),
];
for ((c, s), (ec, es)) in res.into_ranked_list_with_scores().into_iter().zip(exp.into_iter()) {
    assert_eq!(c, ec);
    approx::assert_abs_diff_eq!(s, es, epsilon = 0.005);
}

许可证

MIT

依赖项

~265–720KB
~17K SLoC