标签:
- 句子转换器
- 特征提取
- 句子相似度
- 转换器
数据集: NbAiLab/mnli-norwegian
流水线标签: 句子相似度
小部件:
- 源句子: 这是一个挪威男孩
句子:
- 这是一个挪威男孩
- 这是一个英国男孩
- 这是一只狗
示例标题: 跨语言
- 源句子: 窗外有一些动物
句子:
- 在外面我能听到一些狗叫声
- 窗外有人在交谈
- 每个人都应该养宠物
示例标题: 释义
- 源句子: 一位女士坐在椅子上
句子:
- 一位女士正坐在椅子上
- 她正在放松并阅读一本书
- 她正在跑马拉松
示例标题: 跨语言释义
许可证: apache-2.0
语言:
- 'no'
NB-SBERT-基础版
NB-SBERT-基础版是一个基于SentenceTransformers的模型,从nb-bert-base开始,在机器翻译的MNLI数据集版本上训练而成。
该模型将句子和段落映射到一个768维的密集向量空间。这个向量可以用于聚类和语义搜索等任务。下面我们给出一些如何使用该模型的例子。最简单的方法是简单地测量两个句子之间的余弦距离。意义相近的句子会有较小的余弦距离和接近1的相似度。该模型训练的方式使得不同语言中的相似句子也应该彼此接近。理想情况下,一个英语-挪威语句子对应有较高的相似度。
嵌入和句子相似度(Sentence-Transformers)
如上所述,使用库sentence-transformers使得这些模型的使用非常方便:
pip install -U sentence-transformers
然后你可以像这样使用模型:
from sentence_transformers import SentenceTransformer, util
sentences = ["这是一个挪威男孩", "这是一个挪威男孩"]
model = SentenceTransformer('NbAiLab/nb-sbert-base')
embeddings = model.encode(sentences)
print(embeddings)
cosine_scores = util.cos_sim(embeddings[0],embeddings[1])
print(cosine_scores)
from scipy import spatial
scipy_cosine_scores = 1 - spatial.distance.cosine(embeddings[0],embeddings[1])
print(scipy_cosine_scores)
嵌入和句子相似度(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('NbAiLab/nb-sbert-base')
model = AutoModel.from_pretrained('NbAiLab/nb-sbert-base')
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
with torch.no_grad():
model_output = model(**encoded_input)
embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
print(embeddings)
from scipy import spatial
scipy_cosine_scores = 1 - spatial.distance.cosine(embeddings[0],embeddings[1])
print(scipy_cosine_scores)
SetFit - 少样本分类
SetFit是一种使用句子转换器来解决所有NLP研究人员面临的主要问题之一的方法:标记的训练示例太少。'nb-sbert-base'可以直接插入到SetFit库中。请参阅本教程了解如何使用此技术。
关键词提取
该模型可用于从文本中提取关键词。基本技术是找到与文档最相似的词。有多种框架可以做到这一点。一个简单的方法是使用KeyBERT。这个例子展示了如何做到这一点。
pip install keybert
from keybert import KeyBERT
from sentence_transformers import SentenceTransformer
sentence_model = SentenceTransformer("NbAiLab/nb-sbert-base")
kw_model = KeyBERT(model=sentence_model)
doc = """
第一批国家图书馆起源于皇家收藏或其他显赫的权威或国家元首。
英格兰第一个国家图书馆的计划之一是由威尔士数学家和神秘学家约翰·迪提出的,
他在1556年为英格兰的玛丽一世女王提出了一个关于古老书籍、手稿和记录的国家图书馆的愿景计划。
他的建议没有被采纳。
"""
kw_model.extract_keywords(doc, stop_words=None)
KeyBERT主页提供了其他几个有趣的例子:将KeyBERT与停用词结合,提取更长的短语,或直接生成高亮文本。
主题建模
分析一组文档并确定主题有很多用途。BERTopic结合了句子转换器的力量与c-TF-IDF来创建易于解释的主题集群。
在这里解释主题建模会花费太多时间。相反,我们建议你查看上面的链接,以及文档。使用挪威语nb-sbert-base的主要调整是添加以下内容:
topic_model = BERTopic(embedding_model='NbAiLab/nb-sbert-base').fit(docs)
相似性搜索
SentenceTransformers模型的另一个常见用例是找到与给定查询文本相关的文档或文档段落。在这种情况下,通常会有一个向量数据库存储所有文档的嵌入向量。然后,在运行时,生成查询文本的嵌入,并高效地与向量数据库进行比较。
虽然存在生产级的向量数据库,但快速实验的方法是使用autofaiss
:
pip install autofaiss sentence-transformers
from autofaiss import build_index
import numpy as np
from sentence_transformers import SentenceTransformer, util
sentences = ["这是一个挪威男孩", "这是一个挪威男孩", "一座红色的房子"]
model = SentenceTransformer('NbAiLab/nb-sbert-base')
embeddings = model.encode(sentences)
index, index_infos = build_index(embeddings, save_on_disk=False)
query = model.encode(["一个年轻的男孩"])
_, index_matches = index.search(query, 1)
print(index_matches)