Sentence Transformers 教程!

Sentence Transformers专注于句子和文本嵌入,支持超过100种语言。利用深度学习技术,特别是Transformer架构的优势,将文本转换为高维向量空间中的点,使得相似的文本在几何意义上更接近。 

  1. 语义搜索:构建高效的语义搜索系统,找到最相关的查询结果。
  2. 信息检索与重排:在大规模文档集合中查找相关文档并重新排序。
  3. 聚类分析:将文本自动分组,发现隐藏的主题或模式。
  4. 摘要挖掘:识别和提取文本的主要观点。
  5. 平行句对挖掘:在多语言数据中找出对应的翻译句子。

💥pip安装:

pip install -U sentence-transformers

💥conda安装:

conda install -c conda-forge sentence-transformers

快速使用:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L6-v2")
# 加载all-MiniLM-L6-v2,这是一个在超过 10 亿个训练对的大型数据集上微调的 MiniLM 模型

sentences = [
    "The weather is lovely today.",
    "It's so sunny outside!",
    "He drove to the stadium.",
]


embeddings = model.encode(sentences)
print(embeddings.shape)

# 计算所有句子对之间的相似度
similarities = model.similarity(embeddings, embeddings)
print(similarities)

输出:

 

Cross Encoder

  • 计算给定文本对的相似度得分

  • 通常比Sentence Transformer模型慢,因为它需要对每一对而不是每个文本进行计算

  • 交叉编码器(Cross Encoder)经常被用来对Sentence Transformer模型的top-k个结果进行重新排序。

💯Cross Encoder (又名 reranker) 模型的用法与 Sentence Transformers 类似:

from sentence_transformers.cross_encoder import CrossEncoder
# 我们选择要加载的CrossEncoder模型
model = CrossEncoder("cross-encoder/stsb-distilroberta-base")

# 定义查询句子和语料库
query = "A man is eating pasta."
corpus = [
    "A man is eating food.",
    "A man is eating a piece of bread.",
    "The girl is carrying a baby.",
    "A man is riding a horse.",
    "A woman is playing violin.",
    "Two men pushed carts through the woods.",
    "A man is riding a white horse on an enclosed ground.",
    "A mo
<think>嗯,用户现在问的是关于SentenceTransformer的用途,之前他们已经在问如何用Faiss对中文文本进行向量化和查询了。所以用户可能是在继续深入理解他们之前项目中的某个组件,也就是SentenceTransformer。 首先,我需要确认用户已经了解Faiss的基本用途,现在可能在使用过程中遇到了SentenceTransformer,想知道它具体是做什么的。他们可能在使用过程中需要优化文本向量化的步骤,或者在选择模型时遇到困惑。 用户可能是开发者或者数据科学家,正在处理中文文本的相似性搜索或语义匹配任务。他们可能对自然语言处理有一定的了解,但需要更详细的信息来选择合适的模型和工具。比如,他们可能想知道为什么选择SentenceTransformer而不是其他模型,比如普通的BERT。 接下来,我需要解释SentenceTransformer的基本功能,即它将句子或文本转换为向量表示。需要强调它的优势,比如专门为句子嵌入设计,支持多语言模型,适合处理相似性任务。还要对比传统的BERT模型,说明SentenceTransformer在计算句子相似度时的改进,比如使用孪生网络结构和更好的池化方法。 另外,用户之前提到了中文文本,所以需要特别提到SentenceTransformer支持多语言模型,比如他们之前用的paraphrase-multilingual-MiniLM-L12-v2,这样用户知道在处理中文时应该选择哪些模型。可能还需要举例说明应用场景,比如语义搜索、聚类、信息检索等,帮助用户更好地理解如何将其应用到实际项目中。 还要注意用户可能的潜在需求,比如性能优化。比如,他们可能关心模型的大小、推理速度,或者如何在不同语言之间处理文本。需要提到不同的预训练模型选择,以及如何根据任务需求调整模型。 最后,确保回答结构清晰,分点说明,让用户能快速抓住重点。可能需要避免过于技术化的术语,但考虑到用户之前已经使用过相关工具,适当的术语是可以接受的。同时,提供代码示例或安装步骤可能对他们有帮助,但在这个问题中可能更倾向于解释概念而非具体实现。</think>**Sentence Transformer** 是一种专门用于生成**句子或文本嵌入向量**(Embedding)的模型,能够将文本转换为高维向量,从而用于衡量句子之间的语义相似度。它在自然语言处理(NLP)任务中广泛应用,尤其适合需要语义匹配、相似性搜索或聚类的场景。 --- ### **1. 核心功能** - **文本向量化**:将句子、段落或文档转换为固定长度的稠密向量(例如 384 维或 768 维)。 - **语义相似度计算**:通过向量距离(如余弦相似度)衡量两段文本的语义相关性。 -- ### **2. 与普通 BERT 的区别** - **传统 BERT**:输出的是词级别的向量(Token Embeddings),需手动聚合(如取词向量的平均值)才能得到句子向量,效果较差。 - **Sentence Transformer**: - 直接优化句子级别的向量表示,通过**孪生网络(Siamese Network)**或**三重态损失(Triplet Loss)**训练,使语义相似的句子向量在空间中更接近。 - 内置高效的池化方法(如 `mean-pooling`、`max-pooling`),直接生成高质量的句子向量。 --- ### **3. 典型应用场景** | 场景 | 说明 | |--|------| | **语义搜索** | 根据查询语句,从海量文本中快速找到语义最相关的结果(如 Faiss + Sentence Transformer)。 | | **文本聚类** | 将相似文本自动分组(如新闻分类、用户评论分析)。 | | **问答系统** | 匹配问题与候选答案的相似度。 | | **去重/消歧** | 识别重复内容或语义冲突的文本。 | | **多语言任务** | 支持跨语言的语义匹配(需使用多语言预训练模型)。 | --- ### **4. 关键特性** - **预训练模型丰富**:提供多种预训练模型,支持多语言(如 `paraphrase-multilingual-*` 系列)、特定领域(如法律、医学)的模型。 - **高效推理**:优化模型结构(如 `MiniLM`、`DistilBERT`),在保持性能的同时降低计算成本。 - **简单易用**:通过几行代码即可完成文本向量化: ```python from sentence_transformers import SentenceTransformer model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2") sentences = ["你好,世界!", "深度学习的应用非常广泛"] embeddings = model.encode(sentences) # 输出 shape: (2, 384) ``` --- ### **5. 常用预训练模型** | 模型名称 | 特点 | |--| | `paraphrase-multilingual-MiniLM-L12-v2` | 多语言通用模型,支持中文,平衡精度与速度 | | `all-mpnet-base-v2` | 英文高精度模型,向量维度 768 | | `distiluse-base-multilingual-cased-v2` | 多语言轻量模型,适合低资源场景 | | `stsb-xlm-r-multilingual` | 跨语言语义相似度任务专用 | -- ### **6. 性能优化建议** - **轻量化模型**:若需低延迟,选择 `MiniLM` 或 `DistilBERT` 架构的模型。 - **批量处理**:使用 `model.encode(texts, batch_size=64)` 加速大规模数据推理。 - **多语言场景**:优先选择名称包含 `multilingual` 的模型。 --- ### **7. 简单示例(语义相似度计算)** ```python from sentence_transformers import SentenceTransformer, util model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2") # 输入两组句子 sentences1 = ["今天天气很好", "我爱编程"] sentences2 = ["今天阳光明媚", "我喜欢写代码"] # 生成向量 embeddings1 = model.encode(sentences1) embeddings2 = model.encode(sentences2) # 计算余弦相似度 similarities = util.cos_sim(embeddings1, embeddings2) # 输出结果 print("相似度矩阵:") print(similarities) # 输出示例: # tensor([[0.9215, 0.1032], # [0.2140, 0.8567]]) ``` --- ### **总结** Sentence Transformer 是处理**文本语义表示**的核心工具,特别适合需要将文本转化为向量并量化语义关系的任务。与 Faiss、Milvus 等向量数据库结合,可轻松构建高性能的语义搜索系统。
评论 79
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值