Published on

review rerank_by_model

方法签名

    def rerank_by_model(self, rerank_mdl, sres, query, tkweight=0.3,
                        vtweight=0.7, cfield="content_ltks",
                        rank_feature: dict | None = None):
        _, keywords = self.qryr.question(query)

        for i in sres.ids:
            if isinstance(sres.field[i].get("important_kwd", []), str):
                sres.field[i]["important_kwd"] = [sres.field[i]["important_kwd"]]
        ins_tw = []
        for i in sres.ids:
            content_ltks = sres.field[i][cfield].split()
            title_tks = [t for t in sres.field[i].get("title_tks", "").split() if t]
            important_kwd = sres.field[i].get("important_kwd", [])
            tks = content_ltks + title_tks + important_kwd
            ins_tw.append(tks)

        tksim = self.qryr.token_similarity(keywords, ins_tw)
        vtsim, _ = rerank_mdl.similarity(query, [remove_redundant_spaces(" ".join(tks)) for tks in ins_tw])
        ## For rank feature(tag_fea) scores.
        rank_fea = self._rank_feature_scores(rank_feature, sres)

        return tkweight * np.array(tksim) + vtweight * vtsim + rank_fea, tksim, vtsim

参数说明

  • rerank_mdl: 重排序模型实例,用于计算向量相似度
  • sres: 初步检索结果对象,包含文档片段及其元数据
  • query: 用户查询语句
  • tkweight: 词元相似度权重,默认为 0.3
  • vtweight: 向量相似度权重,默认为 0.7
  • cfield: 内容词元字段名,默认为 "content_ltks"
  • rank_feature: 排名特征字典,可选参数

实现细节

1. 提取关键词

_, keywords = self.qryr.question(query)

首先从用户查询中提取关键词,为后续的词元相似度计算做准备。

2. 处理重要关键词数据类型

for i in sres.ids:
    if isinstance(sres.field[i].get("important_kwd", []), str):
        sres.field[i]["important_kwd"] = [sres.field[i]["important_kwd"]]

将字符串形式的重要关键词转换为列表形式,确保数据格式统一。

3. 构建词元集合

ins_tw = []
for i in sres.ids:
    content_ltks = sres.field[i][cfield].split()
    title_tks = [t for t in sres.field[i].get("title_tks", "").split() if t]
    important_kwd = sres.field[i].get("important_kwd", [])
    tks = content_ltks + title_tks + important_kwd
    ins_tw.append(tks)

对于每个检索结果,收集以下三类词元:

  • 内容词元 (content_ltks)
  • 标题词元 (title_tks)
  • 重要关键词 (important_kwd)

然后将它们组合成一个综合词元列表。

4. 计算词元相似度

tksim = self.qryr.token_similarity(keywords, ins_tw)

使用 token_similarity 方法计算查询关键词与每个检索结果的词元相似度。

5. 计算向量相似度

vtsim, _ = rerank_mdl.similarity(query, [remove_redundant_spaces(" ".join(tks)) for tks in ins_tw])

使用重排序模型计算查询与每个检索结果之间的向量相似度。这里将词元重新组合成文本,然后传给模型计算相似度。

6. 计算排名特征分数

rank_fea = self._rank_feature_scores(rank_feature, sres)

计算其他排名特征的分数(如果有提供)。

7. 加权融合得到最终分数: 最终得分 = 词元相似度得分 × 词元权重 + 向量相似度得分 × 向量权重 + 排名特征得分

return tkweight * np.array(tksim) + vtweight * vtsim + rank_fea, tksim, vtsim

最后,按照权重将词元相似度和向量相似度进行加权融合,再加上排名特征分数,得到最终的排序分数。

8. 返回结果

最终得分 = 0.3 * [0.8, 0.6, 0.4] + 0.7 * [0.9, 0.7, 0.5] + [0.1, 0.05, 0.02]
         = [0.24, 0.18, 0.12] + [0.63, 0.49, 0.35] + [0.1, 0.05, 0.02]
         = [0.97, 0.72, 0.49]

THE END