Rerank相似度
时间: 2025-03-28 11:18:24 浏览: 58
### Rerank 相似度计算方法概述
Rerank 是一种用于重新排列检索到的文档列表的技术,通常基于更复杂的模型来优化排名顺序。其核心目标是通过多种信号(如向量相似度、关键词匹配等)综合评估查询与文档之间的相关性。
#### 综合得分公式解析
综合得分可以通过加权的方式结合多个相似度指标得出。具体而言:
\[ \text{综合得分} = (\text{向量相似度权重} \times \text{文档和 query 向量相似度得分}) + (\text{关键词相似度权重} \times \text{文档和 query 关键词相似度得分}) \]
其中:
- **向量相似度**:利用嵌入表示(embeddings),衡量两个向量间的余弦距离或其他相似度函数[^1]。
- **关键词相似度**:通过对齐文本中的关键字频率或位置信息,量化两者的语义关联程度。
以下是两种主要相似度计算的具体实现方式及其代码示例。
---
### 向量相似度计算
向量相似度通常是通过预训练的语言模型生成文本嵌入后得到的结果。常见的做法如下:
1. 使用 Sentence-BERT 或其他句编码器获取 `query` 和 `document` 的嵌入表示;
2. 应用余弦相似度作为两者间的关系强度测量工具。
```python
from sentence_transformers import SentenceTransformer, util
def calculate_vector_similarity(query_embedding, document_embeddings):
"""
计算 query 与多篇文档之间基于向量的相似度分数。
参数:
query_embedding (np.ndarray): 查询的嵌入向量.
document_embeddings (list[np.ndarray]): 多篇文档对应的嵌入向量列表.
返回:
list[float]: 每篇文档相对于查询的相似度分数.
"""
scores = []
for doc_emb in document_embeddings:
score = util.cos_sim(query_embedding, doc_emb).item()
scores.append(score)
return scores
```
此部分实现了如何从已有的嵌入数据出发快速求解余弦相似度。
---
### 关键词相似度计算
对于关键词相似度,则可以采用 BM25 或 TF-IDF 这样的传统 IR 技术完成初步筛选后再进一步精调。下面展示了一个简单的例子说明过程:
```python
import math
from sklearn.feature_extraction.text import TfidfVectorizer
class KeywordSimilarityCalculator:
def __init__(self, documents):
self.vectorizer = TfidfVectorizer()
self.tfidf_matrix = self.vectorizer.fit_transform(documents)
def compute_similarity(self, query):
"""
基于 TF-IDF 转换后的矩阵计算 Query 对每篇文章的关键字匹配分值
参数:
query (str): 用户输入的问题或者请求字符串
返回:
np.array: 表明各文章针对当前提问的重要性评分数组形式呈现出来
"""
query_tfidf = self.vectorizer.transform([query])
cosine_similarities = util.cosine_similarity(query_tfidf, self.tfidf_matrix)[0]
return cosine_similarities.tolist()
# Example Usage
calculator = KeywordSimilarityCalculator(["doc1 content", "another article text"])
print(calculator.compute_similarity("example search term"))
```
上述脚本定义了一种机制用来估算给定条件下不同资源文件里所含主题元素彼此接近的程度。
---
### 权重调整策略
为了平衡两类特征的作用效果,在实际应用过程中往往还需要引入超参数调节各自贡献比例大小关系。例如设置默认情况下二者重要性的相对高低为7:3即意味着更加侧重考量前者因素的影响力度;当然也可以依据实验结果动态修改这些数值直至达到最佳性能表现为止。
最终完整的 reranking 函数可能看起来像这样:
```python
def rerank_documents(query, documents, vector_model, keyword_calculator, weight_vec=0.7, weight_key=0.3):
"""
根据 query 和 documents 列表执行 re-ranking 并返回排序后的索引
参数:
query (str): 输入查询串
documents (list[str]): 待处理的文章集合
vector_model (...): 句子嵌入模型实例化对象
keyword_calculator (...) : 已初始化好的关键词计算器类实体
weight_vec (float): 向量相似度占比,默认值设为 0.7
weight_key (float): 关键词相似度占比,默认值设定成 0.3
返回:
tuple[list[int], list[float]]: 排序后的文档索引以及对应总分
"""
# 获取 Embedding 版本下的比较成果
embeddings = [vector_model.encode(d) for d in documents]
vec_scores = calculate_vector_similarity(vector_model.encode(query), embeddings)
# 执行 Keywords 方面的操作流程
key_scores = keyword_calculator.compute_similarity(query)
combined_scores = [(i, wv*vec_score + wk*key_score)
for i,(wv,wk),(vec_score,key_score)
in zip(range(len(documents)),[(weight_vec,weight_key)]*len(documents),
zip(vec_scores,key_scores))]
sorted_indices_and_scores = sorted(combined_scores, key=lambda x:x[1], reverse=True)
ranked_indices = [idx for idx,_ in sorted_indices_and_scores]
final_scores = [score for _,score in sorted_indices_and_scores]
return ranked_indices ,final_scores
```
该版本不仅考虑到了原始检索阶段获得的信息同时也加入了额外层次上的判断从而提高了整体质量水平.
---
阅读全文
相关推荐


















