pipeline_tag: 句子相似度
lang:
- 瑞典语
tags:
- 句子转换器
- 特征提取
- 句子相似度
- 转换器
widget:
- source_sentence: 男人在吃饭。
sentences:
- 他享用了一顿营养丰富的餐食。
- 那是个环境一般但食物不错的小店。
- 他一边吃晚餐一边喝了一杯红酒。
- 薯片非常美味。
- 按下按钮联系客服支持。
example_title: 食物
- source_sentence: 我可以在国外进行电子报税吗?
sentences:
- 身处国外的您可以通过多种方式进行电子报税。
- 如果您有税款需要补缴,应向您的税务账户进行支付。
- 在您提交申报后,我们会审核您的申报信息并计算应缴税款。
- 我们已在您收到的申报表中计算出您应支付或可退还的金额。
- 按下按钮联系客服支持。
example_title: 税务局常见问题
- source_sentence: 她能做后空翻。
sentences:
- 她运动能力很强。
- 她擅长体操。
- 她运动能力不强。
- 她无法完成向后翻转。
example_title: 体操
license: apache-2.0
language:
- 瑞典语
KBLab/sentence-bert-swedish-cased
这是一个sentence-transformers模型:它将瑞典语句子和段落映射到768维的密集向量空间,可用于聚类或语义搜索等任务。该模型是一个瑞典语-英语双语模型,根据论文《利用知识蒸馏使单语句子嵌入多语言化》及其配套Python包的文档中的说明进行训练。我们使用了当前最强的预训练英语双编码器(all-mpnet-base-v2)作为教师模型,预训练的瑞典语KB-BERT作为学生模型。
关于该模型的更详细描述,可参阅我们在KBLab博客上发布的文章此处以及更新版模型此处。
更新:自初始发布以来,我们已推出模型的更新版本。博客文章中描述的原始模型为v1.0。当前版本为v2.0。新版模型训练于更长的段落,并具有更长的最大序列长度。v2.0采用了更强的教师模型训练,是当前的默认版本。
使用方法(Sentence-Transformers)
安装sentence-transformers后,使用此模型非常简单:
pip install -U sentence-transformers
然后可以如下使用模型:
from sentence_transformers import SentenceTransformer
sentences = ["这是一个示例句子", "每个示例都会被转换"]
model = SentenceTransformer('KBLab/sentence-bert-swedish-cased')
embeddings = model.encode(sentences)
print(embeddings)
加载旧版模型(Sentence-Transformers)
目前,加载旧版模型最简单的方法是克隆模型仓库并从本地加载。例如,克隆v1.0模型:
git clone --depth 1 --branch v1.0 https://huggingface.co/KBLab/sentence-bert-swedish-cased
然后通过指向克隆模型的本地文件夹加载模型:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("path_to_model_folder/sentence-bert-swedish-cased")
使用方法(HuggingFace Transformers)
若不使用sentence-transformers,可以如下使用模型:首先将输入通过转换器模型,然后对上下文化的词嵌入应用正确的池化操作。
from transformers import AutoTokenizer, AutoModel
import torch
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0]
input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
sentences = ['这是一个示例句子', '每个示例都会被转换']
tokenizer = AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased')
model = AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased')
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
with torch.no_grad():
model_output = model(**encoded_input)
sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
print("句子嵌入:")
print(sentence_embeddings)
加载旧版模型(HuggingFace Transformers)
要加载旧版模型,使用revision
参数指定版本标签。例如,加载v1.0模型:
AutoTokenizer.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0")
AutoModel.from_pretrained('KBLab/sentence-bert-swedish-cased', revision="v1.0")
评估结果
模型在SweParaphrase v1.0和SweParaphrase v2.0上进行了评估。该测试集是SuperLim的一部分——一个用于自然语言理解任务的瑞典语评估套件。我们计算了预测模型相似度分数与人工相似度标签之间的皮尔逊和斯皮尔曼相关性。SweParaphrase v1.0的结果如下。
模型版本 |
皮尔逊 |
斯皮尔曼 |
v1.0 |
0.9183 |
0.9114 |
v1.1 |
0.9183 |
0.9114 |
v2.0 |
0.9283 |
0.9130 |
以下代码片段可用于复现上述结果:
from sentence_transformers import SentenceTransformer
import pandas as pd
df = pd.read_csv(
"sweparaphrase-dev-165.csv",
sep="\t",
header=None,
names=[
"original_id",
"source",
"type",
"sentence_swe1",
"sentence_swe2",
"score",
"sentence1",
"sentence2",
],
)
model = SentenceTransformer("KBLab/sentence-bert-swedish-cased")
sentences1 = df["sentence_swe1"].tolist()
sentences2 = df["sentence_swe2"].tolist()
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2, convert_to_tensor=True)
embeddings1 /= embeddings1.norm(dim=-1, keepdim=True)
embeddings2 /= embeddings2.norm(dim=-1, keepdim=True)
cosine_scores = embeddings1 @ embeddings2.t()
sentence_pair_scores = cosine_scores.diag()
df["model_score"] = sentence_pair_scores.cpu().tolist()
print(df[["score", "model_score"]].corr(method="spearman"))
print(df[["score", "model_score"]].corr(method="pearson"))
Sweparaphrase v2.0
总体而言,v1.1在SweParaphrase v2.0上与人类对文本相似度的评估相关性最高。下面展示了所有数据分割上的零样本评估结果,展示了模型未经微调的即用性能。
模型版本 |
数据分割 |
皮尔逊 |
斯皮尔曼 |
v1.0 |
训练集 |
0.8355 |
0.8256 |
v1.1 |
训练集 |
0.8383 |
0.8302 |
v2.0 |
训练集 |
0.8209 |
0.8059 |
v1.0 |
开发集 |
0.8682 |
0.8774 |
v1.1 |
开发集 |
0.8739 |
0.8833 |
v2.0 |
开发集 |
0.8638 |
0.8668 |
v1.0 |
测试集 |
0.8356 |
0.8476 |
v1.1 |
测试集 |
0.8393 |
0.8550 |
v2.0 |
测试集 |
0.8232 |
0.8213 |
SweFAQ v2.0
在检索任务方面,v2.0表现最佳,优势明显。相比v1.1和v1.0,它能更好地将正确答案与问题匹配。
模型版本 |
数据分割 |
准确率 |
v1.0 |
训练集 |
0.5262 |
v1.1 |
训练集 |
0.6236 |
v2.0 |
训练集 |
0.7106 |
v1.0 |
开发集 |
0.4636 |
v1.1 |
开发集 |
0.5818 |
v2.0 |
开发集 |
0.6727 |
v1.0 |
测试集 |
0.4495 |
v1.1 |
测试集 |
0.5229 |
v2.0 |
测试集 |
0.5871 |
评估模型在SuperLim套件部分测试集上的示例代码可参考以下链接:evaluate_faq.py(瑞典语FAQ)、evaluate_swesat.py(SweSAT同义词)、evaluate_supersim.py(SuperSim)。
训练过程
关于数据和模型v1.0的更多细节,可参阅KBLab博客上的文章。
训练模型使用了约1460万句来自英语-瑞典语平行语料库的句子。数据来源于Open Parallel Corpus(OPUS),通过Python包opustools下载。使用的数据集包括:JW300、Europarl、DGT-TM、EMEA、ELITR-ECA、TED2020、Tatoeba和OpenSubtitles。
模型训练参数如下:
数据加载器:
torch.utils.data.dataloader.DataLoader
,长度180513,参数:
{'batch_size': 64, 'sampler': 'torch.utils.data.sampler.RandomSampler', 'batch_sampler': 'torch.utils.data.sampler.BatchSampler'}
损失函数:
sentence_transformers.losses.MSELoss.MSELoss
fit()方法的参数:
{
"epochs": 2,
"evaluation_steps": 1000,
"evaluator": "sentence_transformers.evaluation.S