评估

sentence_transformers.evaluation 定义了不同的类,这些类可用于在训练期间评估模型。

BinaryClassificationEvaluator

class sentence_transformers.evaluation.BinaryClassificationEvaluator(sentences1: list[str], sentences2: list[str], labels: list[int], name: str = '', batch_size: int = 32, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None)[source]

通过计算识别相似和不相似句子的准确率,基于嵌入的相似性来评估模型。指标包括余弦相似度、点积、欧几里得距离和曼哈顿距离。返回的分数是使用指定指标的准确率。

结果写入 CSV 文件。如果 CSV 文件已存在,则追加值。

标签对于不相似的对需要为 0,对于相似的对需要为 1。

参数:
  • sentences1 (List[str]) – 第一列句子。

  • sentences2 (List[str]) – 第二列句子。

  • labels (List[int]) – labels[i] 是对 (sentences1[i], sentences2[i]) 的标签。必须为 0 或 1。

  • name (str, optional) – 输出的名称。默认为 “”。

  • batch_size (int, optional) – 用于计算嵌入的批次大小。默认为 32。

  • show_progress_bar (bool, optional) – 如果为 true,则打印进度条。默认为 False。

  • write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。

  • similarity_fn_names (Optional[List[Literal["cosine", "dot", "euclidean", "manhattan"]]], optional) – 要使用的相似度函数。如果未指定,则默认为模型的 similarity_fn_name 属性。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import BinaryClassificationEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load a dataset with two text columns and a class label column (https://huggingface.co/datasets/sentence-transformers/quora-duplicates)
eval_dataset = load_dataset("sentence-transformers/quora-duplicates", "pair-class", split="train[-1000:]")

# Initialize the evaluator
binary_acc_evaluator = BinaryClassificationEvaluator(
    sentences1=eval_dataset["sentence1"],
    sentences2=eval_dataset["sentence2"],
    labels=eval_dataset["label"],
    name="quora_duplicates_dev",
)
results = binary_acc_evaluator(model)
'''
Binary Accuracy Evaluation of the model on the quora_duplicates_dev dataset:
Accuracy with Cosine-Similarity:             81.60  (Threshold: 0.8352)
F1 with Cosine-Similarity:                   75.27  (Threshold: 0.7715)
Precision with Cosine-Similarity:            65.81
Recall with Cosine-Similarity:               87.89
Average Precision with Cosine-Similarity:    76.03
Matthews Correlation with Cosine-Similarity: 62.48
'''
print(binary_acc_evaluator.primary_metric)
# => "quora_duplicates_dev_cosine_ap"
print(results[binary_acc_evaluator.primary_metric])
# => 0.760277070888393

EmbeddingSimilarityEvaluator

class sentence_transformers.evaluation.EmbeddingSimilarityEvaluator(sentences1: list[str], sentences2: list[str], scores: list[float], batch_size: int = 16, main_similarity: str | SimilarityFunction | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, name: str = '', show_progress_bar: bool = False, write_csv: bool = True, precision: Literal['float32', 'int8', 'uint8', 'binary', 'ubinary'] | None = None, truncate_dim: int | None = None)[source]

通过计算与黄金标准标签相比的 Spearman 和 Pearson 等级相关性,基于嵌入的相似性来评估模型。指标包括余弦相似度以及欧几里得距离和曼哈顿距离。返回的分数是使用指定指标的 Spearman 相关性。

参数:
  • sentences1 (List[str]) – 包含句子对中第一个句子的列表。

  • sentences2 (List[str]) – 包含句子对中第二个句子的列表。

  • scores (List[float]) – sentences1[i] 和 sentences2[i] 之间的相似度分数。

  • batch_size (int, optional) – 处理句子的批次大小。默认为 16。

  • main_similarity (Optional[Union[str, SimilarityFunction]], optional) – 要使用的主要相似度函数。可以是字符串(例如“cosine”、“dot”)或 SimilarityFunction 对象。默认为 None。

  • similarity_fn_names (List[str], optional) – 要使用的相似度函数名称列表。如果为 None,则使用模型的 similarity_fn_name 属性。默认为 None。

  • name (str, optional) – 评估器的名称。默认为 “”。

  • show_progress_bar (bool, optional) – 是否在评估期间显示进度条。默认为 False。

  • write_csv (bool, optional) – 是否将评估结果写入 CSV 文件。默认为 True。

  • precision (Optional[Literal["float32", "int8", "uint8", "binary", "ubinary"]], optional) – 用于嵌入的精度。可以是 “float32”、“int8”、“uint8”、“binary” 或 “ubinary”。默认为 None。

  • truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。

示例

from datasets import load_dataset
from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import EmbeddingSimilarityEvaluator, SimilarityFunction

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load the STSB dataset (https://huggingface.co/datasets/sentence-transformers/stsb)
eval_dataset = load_dataset("sentence-transformers/stsb", split="validation")

# Initialize the evaluator
dev_evaluator = EmbeddingSimilarityEvaluator(
    sentences1=eval_dataset["sentence1"],
    sentences2=eval_dataset["sentence2"],
    scores=eval_dataset["score"],
    name="sts_dev",
)
results = dev_evaluator(model)
'''
EmbeddingSimilarityEvaluator: Evaluating the model on the sts-dev dataset:
Cosine-Similarity :  Pearson: 0.8806 Spearman: 0.8810
'''
print(dev_evaluator.primary_metric)
# => "sts_dev_pearson_cosine"
print(results[dev_evaluator.primary_metric])
# => 0.881019449484294

InformationRetrievalEvaluator

class sentence_transformers.evaluation.InformationRetrievalEvaluator(queries: dict[str, str], corpus: dict[str, str], relevant_docs: dict[str, set[str]], corpus_chunk_size: int = 50000, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, Callable[[Tensor, Tensor], Tensor]] | None = None, main_score_function: str | SimilarityFunction | None = None, query_prompt: str | None = None, query_prompt_name: str | None = None, corpus_prompt: str | None = None, corpus_prompt_name: str | None = None)[source]

此类评估信息检索 (IR) 设置。

给定一组查询和一个大型语料库集。它将为每个查询检索前 k 个最相似的文档。它测量平均倒数排名 (MRR)、Recall@k 和归一化折损累积增益 (NDCG)

参数:
  • queries (Dict[str, str]) – 将查询 ID 映射到查询的字典。

  • corpus (Dict[str, str]) – 将文档 ID 映射到文档的字典。

  • relevant_docs (Dict[str, Set[str]]) – 将查询 ID 映射到一组相关文档 ID 的字典。

  • corpus_chunk_size (int) – 每个语料库块的大小。默认为 50000。

  • mrr_at_k (List[int]) – 一个整数列表,表示 MRR 计算的 k 值。默认为 [10]。

  • ndcg_at_k (List[int]) – 一个整数列表,表示 NDCG 计算的 k 值。默认为 [10]。

  • accuracy_at_k (List[int]) – 一个整数列表,表示准确率计算的 k 值。默认为 [1, 3, 5, 10]。

  • precision_recall_at_k (List[int]) – 一个整数列表,表示精确率和召回率计算的 k 值。默认为 [1, 3, 5, 10]。

  • map_at_k (List[int]) – 一个整数列表,表示 MAP 计算的 k 值。默认为 [100]。

  • show_progress_bar (bool) – 是否在评估期间显示进度条。默认为 False。

  • batch_size (int) – 评估的批次大小。默认为 32。

  • name (str) – 评估的名称。默认为 “”。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 截断嵌入的维度。默认为 None。

  • score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 将评分函数名称映射到评分函数的字典。默认为 model 中的 similarity 函数。

  • main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。

  • query_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。

  • query_prompt_name (str, optional) – 编码语料库时要使用的提示的名称。默认为 None。

  • corpus_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。

  • corpus_prompt_name (str, optional) – 编码语料库时要使用的提示的名称。默认为 None。

示例

import random
from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import InformationRetrievalEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-MiniLM-L6-v2')

# Load the Touche-2020 IR dataset (https://huggingface.co/datasets/BeIR/webis-touche2020, https://huggingface.co/datasets/BeIR/webis-touche2020-qrels)
corpus = load_dataset("BeIR/webis-touche2020", "corpus", split="corpus")
queries = load_dataset("BeIR/webis-touche2020", "queries", split="queries")
relevant_docs_data = load_dataset("BeIR/webis-touche2020-qrels", split="test")

# For this dataset, we want to concatenate the title and texts for the corpus
corpus = corpus.map(lambda x: {'text': x['title'] + " " + x['text']}, remove_columns=['title'])

# Shrink the corpus size heavily to only the relevant documents + 30,000 random documents
required_corpus_ids = set(map(str, relevant_docs_data["corpus-id"]))
required_corpus_ids |= set(random.sample(corpus["_id"], k=30_000))
corpus = corpus.filter(lambda x: x["_id"] in required_corpus_ids)

# Convert the datasets to dictionaries
corpus = dict(zip(corpus["_id"], corpus["text"]))  # Our corpus (cid => document)
queries = dict(zip(queries["_id"], queries["text"]))  # Our queries (qid => question)
relevant_docs = {}  # Query ID to relevant documents (qid => set([relevant_cids])
for qid, corpus_ids in zip(relevant_docs_data["query-id"], relevant_docs_data["corpus-id"]):
    qid = str(qid)
    corpus_ids = str(corpus_ids)
    if qid not in relevant_docs:
        relevant_docs[qid] = set()
    relevant_docs[qid].add(corpus_ids)

# Given queries, a corpus and a mapping with relevant documents, the InformationRetrievalEvaluator computes different IR metrics.
ir_evaluator = InformationRetrievalEvaluator(
    queries=queries,
    corpus=corpus,
    relevant_docs=relevant_docs,
    name="BeIR-touche2020-subset-test",
)
results = ir_evaluator(model)
'''
Information Retrieval Evaluation of the model on the BeIR-touche2020-test dataset:
Queries: 49
Corpus: 31923

Score-Function: cosine
Accuracy@1: 77.55%
Accuracy@3: 93.88%
Accuracy@5: 97.96%
Accuracy@10: 100.00%
Precision@1: 77.55%
Precision@3: 72.11%
Precision@5: 71.43%
Precision@10: 62.65%
Recall@1: 1.72%
Recall@3: 4.78%
Recall@5: 7.90%
Recall@10: 13.86%
MRR@10: 0.8580
NDCG@10: 0.6606
MAP@100: 0.2934
'''
print(ir_evaluator.primary_metric)
# => "BeIR-touche2020-test_cosine_map@100"
print(results[ir_evaluator.primary_metric])
# => 0.29335196224364596

NanoBEIREvaluator

class sentence_transformers.evaluation.NanoBEIREvaluator(dataset_names: list[~typing.Literal['climatefever', 'dbpedia', 'fever', 'fiqa2018', 'hotpotqa', 'msmarco', 'nfcorpus', 'nq', 'quoraretrieval', 'scidocs', 'arguana', 'scifact', 'touche2020']] | None = None, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor]] | None = None, main_score_function: str | ~sentence_transformers.similarity_functions.SimilarityFunction | None = None, aggregate_fn: ~typing.Callable[[list[float]], float] = <function mean>, aggregate_key: str = 'mean', query_prompts: dict[str, str] | str | None = None, corpus_prompts: dict[str, str] | str | None = None)[source]

此类评估 SentenceTransformer 模型在 NanoBEIR 信息检索数据集集合上的性能。

该集合是基于 BEIR 集合的一组数据集,但规模要小得多,因此可以在进行全面评估之前,用于快速评估模型的检索性能。这些数据集在 Hugging Face 上以 NanoBEIR 集合的形式提供。此评估器将返回与 InformationRetrievalEvaluator 相同的指标(即,MRR、nDCG、Recall@k),针对每个数据集和平均值。

参数:
  • dataset_names (List[str]) – 要评估的数据集名称列表。默认为所有数据集。

  • mrr_at_k (List[int]) – 一个整数列表,表示 MRR 计算的 k 值。默认为 [10]。

  • ndcg_at_k (List[int]) – 一个整数列表,表示 NDCG 计算的 k 值。默认为 [10]。

  • accuracy_at_k (List[int]) – 一个整数列表,表示准确率计算的 k 值。默认为 [1, 3, 5, 10]。

  • precision_recall_at_k (List[int]) – 一个整数列表,表示精确率和召回率计算的 k 值。默认为 [1, 3, 5, 10]。

  • map_at_k (List[int]) – 一个整数列表,表示 MAP 计算的 k 值。默认为 [100]。

  • show_progress_bar (bool) – 是否在评估期间显示进度条。默认为 False。

  • batch_size (int) – 评估的批次大小。默认为 32。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 截断嵌入的维度。默认为 None。

  • score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 一个字典,将评分函数名称映射到评分函数。默认为 {SimilarityFunction.COSINE.value: cos_sim, SimilarityFunction.DOT_PRODUCT.value: dot_score}。

  • main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。

  • aggregate_fn (Callable[[list[float]], float]) – 用于聚合分数的函数。默认为 np.mean。

  • aggregate_key (str) – 用于聚合分数的键。默认为 “mean”。

  • query_prompts (str | dict[str, str], optional) – 要添加到查询的提示。如果为字符串,则将相同的提示添加到所有查询。如果为字典,则期望 dataset_names 中的所有数据集都是键。

  • corpus_prompts (str | dict[str, str], optional) – 要添加到语料库的提示。如果为字符串,则将相同的提示添加到所有语料库。如果为字典,则期望 dataset_names 中的所有数据集都是键。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import NanoBEIREvaluator

model = SentenceTransformer('intfloat/multilingual-e5-large-instruct')

datasets = ["QuoraRetrieval", "MSMARCO"]
query_prompts = {
    "QuoraRetrieval": "Instruct: Given a question, retrieve questions that are semantically equivalent to the given question\nQuery: ",
    "MSMARCO": "Instruct: Given a web search query, retrieve relevant passages that answer the query\nQuery: "
}

evaluator = NanoBEIREvaluator(
    dataset_names=datasets,
    query_prompts=query_prompts,
)

results = evaluator(model)
'''
NanoBEIR Evaluation of the model on ['QuoraRetrieval', 'MSMARCO'] dataset:
Evaluating NanoQuoraRetrieval
Information Retrieval Evaluation of the model on the NanoQuoraRetrieval dataset:
Queries: 50
Corpus: 5046

Score-Function: cosine
Accuracy@1: 92.00%
Accuracy@3: 98.00%
Accuracy@5: 100.00%
Accuracy@10: 100.00%
Precision@1: 92.00%
Precision@3: 40.67%
Precision@5: 26.00%
Precision@10: 14.00%
Recall@1: 81.73%
Recall@3: 94.20%
Recall@5: 97.93%
Recall@10: 100.00%
MRR@10: 0.9540
NDCG@10: 0.9597
MAP@100: 0.9395

Evaluating NanoMSMARCO
Information Retrieval Evaluation of the model on the NanoMSMARCO dataset:
Queries: 50
Corpus: 5043

Score-Function: cosine
Accuracy@1: 40.00%
Accuracy@3: 74.00%
Accuracy@5: 78.00%
Accuracy@10: 88.00%
Precision@1: 40.00%
Precision@3: 24.67%
Precision@5: 15.60%
Precision@10: 8.80%
Recall@1: 40.00%
Recall@3: 74.00%
Recall@5: 78.00%
Recall@10: 88.00%
MRR@10: 0.5849
NDCG@10: 0.6572
MAP@100: 0.5892
Average Queries: 50.0
Average Corpus: 5044.5

Aggregated for Score Function: cosine
Accuracy@1: 66.00%
Accuracy@3: 86.00%
Accuracy@5: 89.00%
Accuracy@10: 94.00%
Precision@1: 66.00%
Recall@1: 60.87%
Precision@3: 32.67%
Recall@3: 84.10%
Precision@5: 20.80%
Recall@5: 87.97%
Precision@10: 11.40%
Recall@10: 94.00%
MRR@10: 0.7694
NDCG@10: 0.8085
'''
print(evaluator.primary_metric)
# => "NanoBEIR_mean_cosine_ndcg@10"
print(results[evaluator.primary_metric])
# => 0.8084508771660436

MSEEvaluator

class sentence_transformers.evaluation.MSEEvaluator(source_sentences: list[str], target_sentences: list[str], teacher_model=None, show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]

计算计算出的句子嵌入与一些目标句子嵌入之间的均方误差 (x100)。

MSE 在 ||teacher.encode(source_sentences) - student.encode(target_sentences)|| 之间计算。

对于多语言知识蒸馏 (https://arxiv.org/abs/2004.09813),source_sentences 是英语,而 target_sentences 是不同的语言,如德语、中文、西班牙语...

参数:
  • source_sentences (List[str]) – 要使用教师模型嵌入的源句子。

  • target_sentences (List[str]) – 要使用学生模型嵌入的目标句子。

  • teacher_model (SentenceTransformer, optional) – 用于计算源句子嵌入的教师模型。

  • show_progress_bar (bool, optional) – 计算嵌入时显示进度条。默认为 False。

  • batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 32。

  • name (str, optional) – 评估器的名称。默认为 “”。

  • write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入要截断到的维度。None 使用模型的当前截断维度。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import MSEEvaluator
from datasets import load_dataset

# Load a model
student_model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
teacher_model = SentenceTransformer('all-mpnet-base-v2')

# Load any dataset with some texts
dataset = load_dataset("sentence-transformers/stsb", split="validation")
sentences = dataset["sentence1"] + dataset["sentence2"]

# Given queries, a corpus and a mapping with relevant documents, the InformationRetrievalEvaluator computes different IR metrics.
mse_evaluator = MSEEvaluator(
    source_sentences=sentences,
    target_sentences=sentences,
    teacher_model=teacher_model,
    name="stsb-dev",
)
results = mse_evaluator(student_model)
'''
MSE evaluation (lower = better) on the stsb-dev dataset:
MSE (*100):  0.805045
'''
print(mse_evaluator.primary_metric)
# => "stsb-dev_negative_mse"
print(results[mse_evaluator.primary_metric])
# => -0.8050452917814255

ParaphraseMiningEvaluator

class sentence_transformers.evaluation.ParaphraseMiningEvaluator(sentences_map: dict[str, str], duplicates_list: list[tuple[str, str]] | None = None, duplicates_dict: dict[str, dict[str, bool]] | None = None, add_transitive_closure: bool = False, query_chunk_size: int = 5000, corpus_chunk_size: int = 100000, max_pairs: int = 500000, top_k: int = 100, show_progress_bar: bool = False, batch_size: int = 16, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]

给定大量的句子,此评估器执行释义(重复)挖掘,并识别具有最高相似度的句子对。它将提取的释义对与一组黄金标签进行比较,并计算 F1 分数。

参数:
  • sentences_map (Dict[str, str]) – 一个字典,将句子 ID 映射到句子。例如,sentences_map[id] => 句子。

  • duplicates_list (List[Tuple[str, str]], optional) – 一个包含 ID 对 [(id1, id2), (id1, id5)] 的列表,用于标识 sentences_map 中的重复项/释义。默认为 None。

  • duplicates_dict (Dict[str, Dict[str, bool]], optional) – 一个默认字典,将 [id1][id2] 映射到 true,如果 id1 和 id2 是重复项。必须是对称的,即,如果 [id1][id2] => True,则 [id2][id1] => True。默认为 None。

  • add_transitive_closure (bool, optional) – 如果为 true,则添加传递闭包,即,如果 dup[a][b] 和 dup[b][c],则 dup[a][c]。默认为 False。

  • query_chunk_size (int, optional) – 为了识别释义,将计算所有句子对之间的余弦相似度。由于这可能需要大量内存,我们执行批量计算。query_chunk_size 句子将与最多 corpus_chunk_size 句子进行比较。在默认设置中,5000 个句子将被分组在一起,并与最多 10 万个其他句子进行比较。默认为 5000。

  • corpus_chunk_size (int, optional) – 语料库将被分批处理,以减少内存需求。默认为 100000。

  • max_pairs (int, optional) – 我们将仅提取最多 max_pairs 个潜在的释义候选对。默认为 500000。

  • top_k (int, optional) – 对于每个查询,我们提取前 k 个最相似的句子对,并将其添加到排序列表中。即,对于一个句子,我们最多只能找到 top_k 个释义。默认为 100。

  • show_progress_bar (bool, optional) – 输出进度条。默认为 False。

  • batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 16。

  • name (str, optional) – 实验名称。默认为 “”。

  • write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。

示例

from datasets import load_dataset
from sentence_transformers.SentenceTransformer import SentenceTransformer
from sentence_transformers.evaluation import ParaphraseMiningEvaluator

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load the Quora Duplicates Mining dataset
questions_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "questions", split="dev")
duplicates_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "duplicates", split="dev")

# Create a mapping from qid to question & a list of duplicates (qid1, qid2)
qid_to_questions = dict(zip(questions_dataset["qid"], questions_dataset["question"]))
duplicates = list(zip(duplicates_dataset["qid1"], duplicates_dataset["qid2"]))

# Initialize the paraphrase mining evaluator
paraphrase_mining_evaluator = ParaphraseMiningEvaluator(
    sentences_map=qid_to_questions,
    duplicates_list=duplicates,
    name="quora-duplicates-dev",
)
results = paraphrase_mining_evaluator(model)
'''
Paraphrase Mining Evaluation of the model on the quora-duplicates-dev dataset:
Number of candidate pairs: 250564
Average Precision: 56.51
Optimal threshold: 0.8325
Precision: 52.76
Recall: 59.19
F1: 55.79
'''
print(paraphrase_mining_evaluator.primary_metric)
# => "quora-duplicates-dev_average_precision"
print(results[paraphrase_mining_evaluator.primary_metric])
# => 0.5650940787776353

RerankingEvaluator

class sentence_transformers.evaluation.RerankingEvaluator(samples: list[dict[str, str | list[str]]], at_k: int = 10, name: str = '', write_csv: bool = True, similarity_fct: ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor] = <function cos_sim>, batch_size: int = 64, show_progress_bar: bool = False, use_batched_encoding: bool = True, truncate_dim: int | None = None, mrr_at_k: int | None = None)[source]

此类评估 SentenceTransformer 模型在重排序任务中的表现。

给定一个查询和文档列表,它计算所有可能的文档的得分 [query, doc_i],并按降序对其进行排序。然后,计算 MRR@10NDCG@10 和 MAP 以衡量排序的质量。

参数:
  • samples (list) – 字典列表,其中每个字典代表一个样本,并具有以下键:- ‘query’:搜索查询。- ‘positive’:正面(相关)文档的列表。- ‘negative’:负面(不相关)文档的列表。

  • at_k (int, optional) – 仅考虑每个查询的前 k 个最相似的文档进行评估。默认为 10。

  • name (str, optional) – 评估器的名称。默认为 “”。

  • write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。

  • similarity_fct (Callable[[torch.Tensor, torch.Tensor], torch.Tensor], optional) – 句子嵌入之间的相似度函数。默认情况下,为余弦相似度。默认为 cos_sim。

  • batch_size (int, optional) – 用于计算句子嵌入的批大小。默认为 64。

  • show_progress_bar (bool, optional) – 计算嵌入时显示进度条。默认为 False。

  • use_batched_encoding (bool, optional) – 是否批量编码查询和文档以提高速度,或者 1 对 1 编码以节省内存。默认为 True。

  • truncate_dim (Optional[int], optional) – 截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 None。

  • mrr_at_k (Optional[int], optional) – 已弃用的参数。请改用 at_k。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import RerankingEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer("all-MiniLM-L6-v2")

# Load a dataset with queries, positives, and negatives
eval_dataset = load_dataset("microsoft/ms_marco", "v1.1", split="validation")

samples = [
    {
        "query": sample["query"],
        "positive": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if is_selected],
        "negative": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if not is_selected],
    }
    for sample in eval_dataset
]

# Initialize the evaluator
reranking_evaluator = RerankingEvaluator(
    samples=samples,
    name="ms-marco-dev",
)
results = reranking_evaluator(model)
'''
RerankingEvaluator: Evaluating the model on the ms-marco-dev dataset:
Queries: 9706      Positives: Min 1.0, Mean 1.1, Max 5.0   Negatives: Min 1.0, Mean 7.1, Max 9.0
MAP: 56.07
MRR@10: 56.70
NDCG@10: 67.08
'''
print(reranking_evaluator.primary_metric)
# => ms-marco-dev_ndcg@10
print(results[reranking_evaluator.primary_metric])
# => 0.6708042171399308

SentenceEvaluator

class sentence_transformers.evaluation.SentenceEvaluator[source]

所有评估器的基类。值得注意的是,此类引入了 greater_is_betterprimary_metric 属性。前者是一个布尔值,指示更高的评估分数是否更好,用于在训练参数中将 load_best_model_at_end 设置为 True 时选择最佳检查点。

后者是一个字符串,指示评估器的主要指标。每当评估器返回指标字典时,都必须定义此指标,并且主要指标是指向主要指标的键,即用于模型选择和/或日志记录的指标。

扩展此类并实现 __call__ 以进行自定义评估器。

SequentialEvaluator

class sentence_transformers.evaluation.SequentialEvaluator(evaluators: ~collections.abc.Iterable[~sentence_transformers.evaluation.SentenceEvaluator.SentenceEvaluator], main_score_function=<function SequentialEvaluator.<lambda>>)[source]

此评估器允许多个子评估器被传递。当评估模型时,数据会按顺序传递给所有子评估器。

所有分数都传递给 ‘main_score_function’,它导出一个最终的分数值

参数:
  • evaluators (Iterable[SentenceEvaluator]) – SentenceEvaluator 对象的集合。

  • main_score_function (function, optional) – 一个函数,它接受一个分数列表并返回主要分数。默认为选择列表中的最后一个分数。

示例

evaluator1 = BinaryClassificationEvaluator(...)
evaluator2 = InformationRetrievalEvaluator(...)
evaluator3 = MSEEvaluator(...)
seq_evaluator = SequentialEvaluator([evaluator1, evaluator2, evaluator3])

TranslationEvaluator

class sentence_transformers.evaluation.TranslationEvaluator(source_sentences: list[str], target_sentences: list[str], show_progress_bar: bool = False, batch_size: int = 16, name: str = '', print_wrong_matches: bool = False, write_csv: bool = True, truncate_dim: int | None = None)[source]

给定两组不同语言的句子,例如(en_1, en_2, en_3...)和(fr_1, fr_2, fr_3, ...),并假设 fr_i 是 en_i 的翻译。检查 vec(en_i) 是否与 vec(fr_i) 具有最高的相似度。计算两个方向的准确率

标签需要指示句子之间的相似度。

参数:
  • source_sentences (List[str]) – 源语言的句子列表。

  • target_sentences (List[str]) – 目标语言的句子列表。

  • show_progress_bar (bool) – 计算嵌入时是否显示进度条。默认为 False。

  • batch_size (int) – 用于计算句子嵌入的批大小。默认为 16。

  • name (str) – 评估器的名称。默认为空字符串。

  • print_wrong_matches (bool) – 是否打印不正确的匹配项。默认为 False。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入要截断到的维度。如果为 None,将使用模型的当前截断维度。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import TranslationEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')

# Load a parallel sentences dataset
dataset = load_dataset("sentence-transformers/parallel-sentences-news-commentary", "en-nl", split="train[:1000]")

# Initialize the TranslationEvaluator using the same texts from two languages
translation_evaluator = TranslationEvaluator(
    source_sentences=dataset["english"],
    target_sentences=dataset["non_english"],
    name="news-commentary-en-nl",
)
results = translation_evaluator(model)
'''
Evaluating translation matching Accuracy of the model on the news-commentary-en-nl dataset:
Accuracy src2trg: 90.80
Accuracy trg2src: 90.40
'''
print(translation_evaluator.primary_metric)
# => "news-commentary-en-nl_mean_accuracy"
print(results[translation_evaluator.primary_metric])
# => 0.906

TripletEvaluator

class sentence_transformers.evaluation.TripletEvaluator(anchors: list[str], positives: list[str], negatives: list[str], main_similarity_function: str | SimilarityFunction | None = None, margin: float | dict[str, float] | None = None, name: str = '', batch_size: int = 16, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, main_distance_function: str | SimilarityFunction | None = 'deprecated')[source]

基于三元组评估模型:(句子、正面示例、负面示例)。检查 similarity(sentence, positive_example) < similarity(sentence, negative_example) + margin 是否成立。

参数:
  • anchors (List[str]) – 要检查相似度的句子。(例如,查询)

  • positives (List[str]) – 正面句子列表

  • negatives (List[str]) – 负面句子列表

  • main_similarity_function (Union[str, SimilarityFunction], optional) – 要使用的相似度函数。如果未指定,则使用余弦相似度、点积、欧几里得和曼哈顿相似度。默认为 None。

  • margin (Union[float, Dict[str, float]], optional) – 各种相似度指标的边距。如果提供浮点数,它将用作所有相似度指标的边距。如果提供字典,则键应为“cosine”、“dot”、“manhattan”和“euclidean”。该值指定负样本应比正样本更远离锚点的最小边距。默认为 None。

  • name (str) – 输出的名称。默认为 “”。

  • batch_size (int) – 用于计算嵌入的批大小。默认为 16。

  • show_progress_bar (bool) – 如果为 true,则打印进度条。默认为 False。

  • write_csv (bool) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入要截断到的维度。None 使用模型的当前截断维度。默认为 None。

  • similarity_fn_names (List[str], optional) – 要评估的相似度函数名称列表。如果未指定,则使用 model.similarity_fn_name 进行评估。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import TripletEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load a dataset with (anchor, positive, negative) triplets
dataset = load_dataset("sentence-transformers/all-nli", "triplet", split="dev")

# Initialize the TripletEvaluator using anchors, positives, and negatives
triplet_evaluator = TripletEvaluator(
    anchors=dataset[:1000]["anchor"],
    positives=dataset[:1000]["positive"],
    negatives=dataset[:1000]["negative"],
    name="all_nli_dev",
)
results = triplet_evaluator(model)
'''
TripletEvaluator: Evaluating the model on the all-nli-dev dataset:
Accuracy Cosine Similarity:        95.60%
'''
print(triplet_evaluator.primary_metric)
# => "all_nli_dev_cosine_accuracy"
print(results[triplet_evaluator.primary_metric])
# => 0.956