评估

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)[源代码][源代码]

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

结果被写入一个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) -- 如果为真,则打印进度条。默认为 False。

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

  • truncate_dim (Optional[int], optional) -- 要截断句子嵌入的维度。None 使用模型当前的截断维度。默认为 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

Accuracy with Dot-Product:           81.60  (Threshold: 0.8352)
F1 with Dot-Product:                 75.27  (Threshold: 0.7715)
Precision with Dot-Product:          65.81
Recall with Dot-Product:             87.89
Average Precision with Dot-Product:  76.03

Accuracy with Manhattan-Distance:           81.50   (Threshold: 12.0727)
F1 with Manhattan-Distance:                 74.97   (Threshold: 15.2269)
Precision with Manhattan-Distance:          63.89
Recall with Manhattan-Distance:             90.68
Average Precision with Manhattan-Distance:  75.66

Accuracy with Euclidean-Distance:           81.60   (Threshold: 0.5741)
F1 with Euclidean-Distance:                 75.27   (Threshold: 0.6760)
Precision with Euclidean-Distance:          65.81
Recall with Euclidean-Distance:             87.89
Average Precision with Euclidean-Distance:  76.03
'''
print(binary_acc_evaluator.primary_metric)
# => "quora-duplicates-dev_max_ap"
print(results[binary_acc_evaluator.primary_metric])
# => 0.760277070888393

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

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

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, 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)[源代码][源代码]

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

示例

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"],
    main_similarity=SimilarityFunction.COSINE,
    name="sts-dev",
)
dev_evaluator(model)
'''
EmbeddingSimilarityEvaluator: Evaluating the model on the sts-dev dataset:
Cosine-Similarity :       Pearson: 0.7874 Spearman: 0.8004
Manhattan-Distance:       Pearson: 0.7823 Spearman: 0.7827
Euclidean-Distance:       Pearson: 0.7824 Spearman: 0.7827
Dot-Product-Similarity:   Pearson: 0.7192 Spearman: 0.7126
'''
# => {'sts-dev_pearson_cosine': 0.880607226102985, 'sts-dev_spearman_cosine': 0.881019449484294, ...}

构建一个基于数据集的评估器。

参数:
  • sentences1 (List[str]) -- 列表中每对的第一句话。

  • sentences2 (List[str]) -- List with the second sentence in a pair.

  • scores (List[float]) -- 句子1[i] 和 句子2[i] 之间的相似度得分。

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

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

信息检索评估器

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, ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor]] = {'cosine': <function cos_sim>, 'dot': <function dot_score>}, main_score_function: str | ~sentence_transformers.similarity_functions.SimilarityFunction | None = None)[源代码][源代码]

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

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

示例

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

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

# Load the Quora IR dataset (https://huggingface.co/datasets/BeIR/quora, https://huggingface.co/datasets/BeIR/quora-qrels)
corpus = load_dataset("BeIR/quora", "corpus", split="corpus")
queries = load_dataset("BeIR/quora", "queries", split="queries")
relevant_docs_data = load_dataset("BeIR/quora-qrels", split="validation")

# Shrink the corpus size heavily to only the relevant documents + 10,000 random documents
required_corpus_ids = list(map(str, relevant_docs_data["corpus-id"]))
required_corpus_ids += random.sample(corpus["_id"], k=10_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-quora-dev",
)
results = ir_evaluator(model)
'''
Information Retrieval Evaluation of the model on the BeIR-quora-dev dataset:
Queries: 5000
Corpus: 17476

Score-Function: cosine
Accuracy@1: 96.26%
Accuracy@3: 99.38%
Accuracy@5: 99.74%
Accuracy@10: 99.94%
Precision@1: 96.26%
Precision@3: 43.01%
Precision@5: 27.66%
Precision@10: 14.58%
Recall@1: 82.93%
Recall@3: 96.28%
Recall@5: 98.38%
Recall@10: 99.55%
MRR@10: 0.9782
NDCG@10: 0.9807
MAP@100: 0.9732
Score-Function: dot
Accuracy@1: 96.26%
Accuracy@3: 99.38%
Accuracy@5: 99.74%
Accuracy@10: 99.94%
Precision@1: 96.26%
Precision@3: 43.01%
Precision@5: 27.66%
Precision@10: 14.58%
Recall@1: 82.93%
Recall@3: 96.28%
Recall@5: 98.38%
Recall@10: 99.55%
MRR@10: 0.9782
NDCG@10: 0.9807
MAP@100: 0.9732
'''
print(ir_evaluator.primary_metric)
# => "BeIR-quora-dev_cosine_map@100"
print(results[ir_evaluator.primary_metric])
# => 0.9732046108457585

初始化 InformationRetrievalEvaluator。

参数:
  • 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]]) -- 一个将评分函数名称映射到评分函数的字典。默认为 {SimilarityFunction.COSINE.value: cos_sim, SimilarityFunction.DOT_PRODUCT.value: dot_score}。

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

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)[源代码][源代码]

计算计算出的句子嵌入与某些目标句子嵌入之间的均方误差(乘以100)。

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

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

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

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)[源代码][源代码]

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

示例

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

初始化 ParaphraseMiningEvaluator。

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

  • duplicates_list (List[Tuple[str, str]], optional) -- 一个包含id对的列表[(id1, id2), (id1, id5)],用于标识句子映射中的重复/释义。默认为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) -- 如果为真,则添加一个传递闭包,即如果 dup[a][b] 和 dup[b][c],则 dup[a][c]。默认为 False。

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

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

  • max_pairs (int, optional) -- 我们只会提取最多 max_pairs 个潜在的释义候选。默认为 500000。

  • top_k (int, optional) -- 对于每个查询,我们提取 top_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。

RerankingEvaluator

class sentence_transformers.evaluation.RerankingEvaluator(samples, 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)[源代码][源代码]

此类评估用于重新排序任务的 SentenceTransformer 模型。

给定一个查询和一组文档,它会计算所有可能文档的分数 [query, doc_i] 并按降序排列。然后,计算 MRR@10、NDCG@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) -- 是否对查询和文档进行批量编码以提高速度,还是逐个编码以节省内存。默认为 True。

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

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

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

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

SentenceEvaluator

class sentence_transformers.evaluation.SentenceEvaluator[源代码][源代码]

所有评估器的基类

扩展此类并实现 call 以创建自定义评估器。

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

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

SequentialEvaluator

class sentence_transformers.evaluation.SequentialEvaluator(evaluators: ~typing.Iterable[~sentence_transformers.evaluation.SentenceEvaluator.SentenceEvaluator], main_score_function=<function SequentialEvaluator.<lambda>>)[源代码][源代码]

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

所有分数都传递给 'main_score_function',该函数导出一个最终的分数值

初始化一个 SequentialEvaluator 对象。

参数:
  • 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)[源代码][源代码]

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

示例

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

构建一个基于数据集的评估器

标签需要表明句子之间的相似性。

参数:
  • source_sentences (List[str]) -- toctree 是一个 reStructuredText :dfn:指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。

  • 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。

TripletEvaluator

class sentence_transformers.evaluation.TripletEvaluator(anchors: list[str], positives: list[str], negatives: list[str], main_distance_function: str | SimilarityFunction | None = None, name: str = '', batch_size: int = 16, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = 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 Distance:        95.60
Accuracy Dot Product:            4.40
Accuracy Manhattan Distance:     95.40
Accuracy Euclidean Distance:     95.60
'''
print(triplet_evaluator.primary_metric)
# => "all-nli-dev_max_accuracy"
print(results[triplet_evaluator.primary_metric])
# => 0.956

初始化一个 TripletEvaluator 对象。

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

  • positives (List[str]) -- 积极句子的列表

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

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

  • name (str) -- 输出名称。默认为 ""。

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

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

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

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