模型简介
模型特点
模型能力
使用案例
🚀 NB-SBERT-BASE
NB-SBERT-BASE是一个基于SentenceTransformers的模型,它从nb-bert-base开始,在MNLI数据集的机器翻译版本上进行训练。该模型可将句子和段落映射到一个768维的密集向量空间,其向量可用于聚类和语义搜索等任务。下面将介绍该模型的使用方法,最简单的方式是直接测量两个句子之间的余弦距离。语义相近的句子,其余弦距离较小,相似度接近1。该模型经过训练,不同语言中的相似句子也应彼此接近。理想情况下,英语 - 挪威语句子对应具有较高的相似度。
🚀 快速开始
本模型可用于多种自然语言处理任务,如句子相似度计算、关键词提取、主题建模等。下面将详细介绍其使用方法。
✨ 主要特性
- 多语言支持:能够处理不同语言的句子,使不同语言的相似句子在向量空间中接近。
- 向量映射:将句子和段落映射到768维的密集向量空间,方便进行聚类和语义搜索等任务。
- 多种应用场景:可用于句子相似度计算、关键词提取、主题建模、少样本分类等多种自然语言处理任务。
📦 安装指南
安装Sentence-Transformers库
pip install -U sentence-transformers
安装KeyBERT库(用于关键词提取)
pip install keybert
安装autofaiss库(用于相似度搜索)
pip install autofaiss sentence-transformers
💻 使用示例
基础用法
使用Sentence-Transformers计算句子相似度
from sentence_transformers import SentenceTransformer, util
sentences = ["This is a Norwegian boy", "Dette er en norsk gutt"]
model = SentenceTransformer('NbAiLab/nb-sbert-base')
embeddings = model.encode(sentences)
print(embeddings)
# Compute cosine-similarities with sentence transformers
cosine_scores = util.cos_sim(embeddings[0],embeddings[1])
print(cosine_scores)
# Compute cosine-similarities with SciPy
from scipy import spatial
scipy_cosine_scores = 1 - spatial.distance.cosine(embeddings[0],embeddings[1])
print(scipy_cosine_scores)
# Both should give 0.8250 in the example above.
不使用Sentence-Transformers计算句子相似度
from transformers import AutoTokenizer, AutoModel
import torch
#Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
token_embeddings = model_output[0] #First element of model_output contains all token embeddings
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 we want sentence embeddings for
sentences = ["This is a Norwegian boy", "Dette er en norsk gutt"]
# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('NbAiLab/nb-sbert-base')
model = AutoModel.from_pretrained('NbAiLab/nb-sbert-base')
# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
model_output = model(**encoded_input)
# Perform pooling. In this case, mean pooling.
embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
print(embeddings)
# Compute cosine-similarities with SciPy
from scipy import spatial
scipy_cosine_scores = 1 - spatial.distance.cosine(embeddings[0],embeddings[1])
print(scipy_cosine_scores)
# This should give 0.8250 in the example above.
高级用法
关键词提取
from keybert import KeyBERT
from sentence_transformers import SentenceTransformer
sentence_model = SentenceTransformer("NbAiLab/nb-sbert-base")
kw_model = KeyBERT(model=sentence_model)
doc = """
De første nasjonale bibliotek har sin opprinnelse i kongelige samlinger eller en annen framstående myndighet eller statsoverhode.
Et av de første planene for et nasjonalbibliotek i England ble fremmet av den walisiske matematikeren og mystikeren John Dee som
i 1556 presenterte en visjonær plan om et nasjonalt bibliotek for gamle bøker, manuskripter og opptegnelser for dronning Maria I
av England. Hans forslag ble ikke tatt til følge.
"""
kw_model.extract_keywords(doc, stop_words=None)
# [('nasjonalbibliotek', 0.5242), ('bibliotek', 0.4342), ('samlinger', 0.3334), ('statsoverhode', 0.33), ('manuskripter', 0.3061)]
主题建模
topic_model = BERTopic(embedding_model='NbAiLab/nb-sbert-base').fit(docs)
相似度搜索
from autofaiss import build_index
import numpy as np
from sentence_transformers import SentenceTransformer, util
sentences = ["This is a Norwegian boy", "Dette er en norsk gutt", "A red house"]
model = SentenceTransformer('NbAiLab/nb-sbert-base')
embeddings = model.encode(sentences)
index, index_infos = build_index(embeddings, save_on_disk=False)
# Search for the closest matches
query = model.encode(["A young boy"])
_, index_matches = index.search(query, 1)
print(index_matches)
📚 详细文档
评估
在sts - test数据集上的评估结果如下:
属性 | 皮尔逊相关系数 | 斯皮尔曼相关系数 |
---|---|---|
余弦相似度 | 0.8275 | 0.8245 |
曼哈顿距离 | 0.8193 | 0.8182 |
欧几里得距离 | 0.8190 | 0.8180 |
点积相似度 | 0.8039 | 0.7951 |
训练
模型的训练参数如下:
数据加载器
sentence_transformers.datasets.NoDuplicatesDataLoader.NoDuplicatesDataLoader
,长度为16471,参数如下:
{'batch_size': 32}
损失函数
sentence_transformers.losses.MultipleNegativesRankingLoss.MultipleNegativesRankingLoss
,参数如下:
{'scale': 20.0, 'similarity_fct': 'cos_sim'}
fit()方法的参数
{
"epochs": 1,
"evaluation_steps": 1647,
"evaluator": "sentence_transformers.evaluation.EmbeddingSimilarityEvaluator.EmbeddingSimilarityEvaluator",
"max_grad_norm": 1,
"optimizer_class": "<class 'torch.optim.adamw.AdamW'>",
"optimizer_params": {
"lr": 2e-05
},
"scheduler": "WarmupLinear",
"steps_per_epoch": null,
"warmup_steps": 1648,
"weight_decay": 0.01
}
完整模型架构
SentenceTransformer(
(0): Transformer({'max_seq_length': 75, 'do_lower_case': False}) with Transformer model: BertModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
)
引用与作者
该模型由Rolv - Arild Braaten和Per Egil Kummervold训练,文档由Javier de la Rosa、Rov - Arild Braaten和Per Egil Kummervold编写。
🔧 技术细节
模型基于SentenceTransformers框架,从nb - bert - base开始训练,在MNLI数据集的机器翻译版本上进行微调。通过将句子和段落映射到768维的密集向量空间,实现了语义相似度的计算。在训练过程中,使用了特定的数据加载器和损失函数,并对优化器、学习率调度器等参数进行了调整。
📄 许可证
本模型使用的许可证为apache - 2.0。







