- 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.3vtweight: 向量相似度权重,默认为 0.7cfield: 内容词元字段名,默认为 "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