模型概述
模型特點
模型能力
使用案例
🚀 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。







