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 SentenceTransformermodel = 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 monkey is playing drums.","A cheetah is running behind its prey.",
]# 对句子进行排名
ranks = model.rank(query, corpus)print("Query: ", query)
for rank in ranks:print(f"{rank['score']:.2f}\t{corpus[rank['corpus_id']]}")import numpy as np
# 使用 NumPy 进行排序
sentence_combinations = [[query, sentence] for sentence in corpus]
scores = model.predict(sentence_combinations)ranked_indices = np.argsort(scores)[::-1]
print("Scores:", scores)
print("Indices:", ranked_indices)

输出:

Sentence Transformer模型用法 

  1. 计算给定文本或图像的固定大小的向量表示(嵌入)

  2. 嵌入计算往往是高效的,嵌入相似度计算非常快

  3. 适用于广泛的任务,例如语义文本相似度、语义搜索、聚类、分类、释义挖掘等。

  4. 通常用作两步检索过程的第一步,其中使用Cross-Encoder模型对双编码器的前 k 个结果进行重新排序。

语义文本相似度

💫对于语义文本相似度 (STS),我们希望为所有相关文本生成嵌入并计算它们之间的相似度。相似度得分最高的文本对在语义上最相似

from sentence_transformers import SentenceTransformermodel = SentenceTransformer("all-MiniLM-L6-v2")sentences1 = ["The new movie is awesome","The cat sits outside","A man is playing guitar",
]sentences2 = ["The dog plays in the garden","The new movie is so great","A woman watches TV",
]embeddings1 = model.encode(sentences1)
embeddings2 = model.encode(sentences2)similarities = model.similarity(embeddings1, embeddings2)for idx_i, sentence1 in enumerate(sentences1):print(sentence1)for idx_j, sentence2 in enumerate(sentences2):print(f" - {sentence2: <30}: {similarities[idx_i][idx_j]:.4f}")
  • 返回一个 3x3 矩阵,其中包含embeddings1embeddings2之间所有可能对的相应余弦相似度分数 

💫输出:

相似度计算 

可以通过多种方式改变此值:

1. 通过使用所需的相似度函数初始化 SentenceTransformer 实例:

from sentence_transformers import SentenceTransformer, SimilarityFunctionmodel = SentenceTransformer("all-MiniLM-L6-v2", similarity_fn_name=SimilarityFunction.DOT_PRODUCT)

2. 通过直接在 SentenceTransformer 实例上设置值:

from sentence_transformers import SentenceTransformer, SimilarityFunctionmodel = SentenceTransformer("all-MiniLM-L6-v2")
model.similarity_fn_name = SimilarityFunction.DOT_PRODUCT

Sentence Transformers 实现了两种方法来计算嵌入之间的相似度

from sentence_transformers import SentenceTransformer, SimilarityFunction
model = SentenceTransformer("all-MiniLM-L6-v2")sentences = ["The weather is lovely today.","It's so sunny outside!","He drove to the stadium.",
]
embeddings = model.encode(sentences)similarities = model.similarity(embeddings, embeddings)
print(similarities)model.similarity_fn_name = SimilarityFunction.MANHATTAN
print(model.similarity_fn_name)similarities = model.similarity(embeddings, embeddings)
print(similarities)

 输出:

语义搜索 

🧊语义搜索旨在通过理解搜索查询的语义含义和要搜索的语料库来提高搜索准确率。与只能根据词汇匹配查找文档的关键字搜索引擎不同,语义搜索在给定同义词、缩写和拼写错误的情况下也能表现良好。

语义搜索背后的理念是将语料库中的所有条目(无论是句子、段落还是文档)嵌入到向量空间中。在搜索时,查询被嵌入到相同的向量空间中,并从语料库中找到最接近的嵌入。这些条目应该与查询具有较高的语义相似度。

对称与非对称语义搜索

🧊我们设置的一个关键区别对称非对称语义搜索

  • 对于对称语义搜索:搜索类似问题:您的查询可能是“如何在线学习 Python?”想查找“如何在网上学习 Python?”这样的条目
  • 对于非对称语义搜索:我们通常会有一个简短的查询(例如问题或一些关键字)并且想要找到一个较长的段落来回答该查询。例如,查询“什么是 Python”,并且您想要找到段落“Python 是一种解释型、高级和通用的编程语言。Python 的设计理念……”。对于非对称任务,翻转查询和语料库中的条目通常没有意义。

对于小型语料库(最多约 100 万个条目),我们可以通过手动实现语义搜索,即计算语料库和查询的嵌入

import torchfrom sentence_transformers import SentenceTransformerembedder = SentenceTransformer("all-MiniLM-L6-v2")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 monkey is playing drums.","A cheetah is running behind its prey.",
]corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)queries = ["A man is eating pasta.","Someone in a gorilla costume is playing a set of drums.","A cheetah chases prey on across a field.",
]top_k = min(5, len(corpus))
for query in queries:query_embedding = embedder.encode(query, convert_to_tensor=True)similarity_scores = embedder.similarity(query_embedding, corpus_embeddings)[0]scores, indices = torch.topk(similarity_scores, k=top_k)print("\nQuery:", query)print("Top 5 most similar sentences in corpus:")for score, idx in zip(scores, indices):print(corpus[idx], f"(Score: {score:.4f})")

输出:


🍹我们也可以不用自己实现语义搜索 ,可以使用util.semantic_search函数

sentence_transformers.util.semantic_search(query_embeddings: Tensor, corpus_embeddings: Tensor, query_chunk_size: int = 100, corpus_chunk_size: int = 500000, top_k: int = 10, score_function: Callable[[Tensor, Tensor], Tensor] = <function cos_sim>) →列表[列表[字典[ str , int | float ] ] ]
  • query_embeddingsTensor)– 具有查询嵌入的二维张量。

  • corpus_embeddings张量)– 具有语料库嵌入的二维张量。

  • query_chunk_sizeint 可选)– 同时处理 100 个查询。增加该值可以提高速度,但需要更多内存。默认为 100。

  • corpus_chunk_sizeint 可选) – 一次扫描语料库中的 100k 个条目。增加该值可以提高速度,但需要更多内存。默认为 500000。

  • top_k ( int 可选) – 检索前 k 个匹配条目。默认为 10。

  • score_functionCallable Tensor Tensor Tensor 可选)– 用于计算分数的函数。默认情况下,余弦相似度。

  • 返回:每个查询对应一个条目的列表。每个条目都是一个字典列表,其中包含键“corpus_id”和“score”,按余弦相似度得分降序排序。

速度优化

corpus_embeddings = corpus_embeddings.to("cuda")
corpus_embeddings = util.normalize_embeddings(corpus_embeddings)query_embeddings = query_embeddings.to("cuda")
query_embeddings = util.normalize_embeddings(query_embeddings)
hits = util.semantic_search(query_embeddings, corpus_embeddings, score_function=util.dot_score)

检索和重新排序 

对于复杂的搜索任务,例如问答检索,使用检索和重新排名可以显著提高搜索质量。

 

给定一个搜索查询,我们首先使用一个检索系统来检索一个大列表,例如 100 个可能与该查询相关的结果。对于检索,我们可以使用词汇搜索,例如使用 Elasticsearch 之类的矢量引擎,或者我们可以使用双编码器进行密集检索。但是,检索系统可能会检索与搜索查询不太相关的文档。 

🌤️双编码器会为段落和搜索查询独立生成嵌入 

from sentence_transformers import SentenceTransformermodel = SentenceTransformer("multi-qa-mpnet-base-dot-v1")docs = ["My first paragraph. That contains information","Python is a programming language.",
]
document_embeddings = model.encode(docs)
print('document_embeddings:',document_embeddings)
query = "What is Python?"
query_embedding = model.encode(query)
print('query_embedding:',query_embedding)

 输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547134.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果

我们写这道题的时候需要俩变量接受&#xff0c;一个总数一个分母&#xff0c;我们发现分母变化是有规律的从1~100循环。 #include<stdio.h> int main() {int i 0;int tag 1;double sum 0.0;for (i 1; i < 101; i){if (i % 2 0){sum sum - 1.0 / i;}else{sum s…

与转录组结合,开发下一代诊断技术,或许是医学AI领域的下一个热点|个人观点·24-09-21

小罗碎碎念 观点分享&#xff1a;科研本身是一件枯燥的事情&#xff0c;所以我们尽可能的去寻找一些同伴&#xff0c;也许前路的风景又会焕然一新。 今天所有的推文都围绕一个人展开——Faisal Mahmood。说实话&#xff0c;今天的状态并不好&#xff0c;写推文的感觉很不对&…

解决Typora图片复制到CSDN无法查看问题

下载安装picgo 山东大学镜像源&#xff1a;https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo 开通阿里云对象存储oss 选择创建 填入内容 购买资源包 创建AccessKey 配置PicGo 设定bucket填入创建bucket名称 注意&#xff1a;设定存储区域只需要填写到区域前缀即…

数字化AI直播革命:无人直播新纪元,真AI赋能未来!

数字化AI直播革命&#xff1a;无人直播新纪元&#xff0c;真AI赋能未来&#xff01; 在数字化浪潮的汹涌澎湃中&#xff0c;一场前所未有的直播革命正悄然兴起&#xff0c;它以AI为核心驱动力&#xff0c;颠覆了传统直播行业的格局&#xff0c;引领我们步入了一个无人直播的新纪…

即插即用篇 | DenseNet卷土重来! YOLOv8 引入全新密集连接卷积网络 | ECCV 2024

本改进已同步到YOLO-Magic框架! 本文重新审视了密集连接卷积网络(DenseNets),并揭示了其在主流的ResNet风格架构中被低估的有效性。我们认为,由于未触及的训练方法和传统设计元素没有完全展现其能力,DenseNets的潜力被忽视了。我们的初步研究表明,通过连接实现的密集连接…

Keil5安装arm和C51共存环境

一、安装前准备 ①Keil5 mdk安装包 ②Keil5 C51安装包 ③注册机 如下 二、安装步骤 ①建立两个文件夹用于存放Keil5 C51安装程序和keil5 mdk安装程序 如下图 ②点击c51v95a.exe进行安装&#xff0c;一路next&#xff0c;安装在Keil5_C51目录下 ③点击MDK539.ext进行安装…

『功能项目』装备齐全特效【78】

本章项目成果展示 我们打开上一篇77鼠标悬停物品显示信息的项目&#xff0c; 本章要做的事情是实现当穿戴六件装备时主角身上显示一个特效功能 首先在资源文件夹中放置一个预制体 编写脚本&#xff1a;PlayerRayClickNavigation.cs 编写脚本&#xff1a;PlayerRayClickNavigat…

2024.9.26 作业 +思维导图

一、作业 1、什么是虚函数&#xff1f;什么是纯虚函数 虚函数&#xff1a;函数前加关键字virtual&#xff0c;就定义为虚函数&#xff0c;虚函数能够被子类中相同函数名的函数重写 纯虚函数&#xff1a;把虚函数的函数体去掉然后加0&#xff1b;就能定义出一个纯虚函数。 2、基…

STL-map/multimap关联式容器

目录 一、基本概念 1.1 简介 1.2 本质 1.3 库原型 二、使用 2.0 迭代器 2.1 构造函数 2.2 插入删除 2.3 查找统计 2.4 数据修改 三、multimap 一、基本概念 1.1 简介 map中所有元素都是pairpair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引…

Redis篇(环境搭建)

目录 一、安装包 1. Windows版下载地址 2. Linux版下载地址 二、安装Redis 1. 在Linux中安装Redis 2. 在Windows中安装Redis 3. 细节问题 三、Redis服务启动 1. 默认启动 2. 指定配置启动 3. 开机自启 四、Redis服务停止 1. Linux系统中启动和停止Redis 2. Window…

2024准备去面试软件测试岗,高频面试题预测?

金九银十已经到了&#xff0c;想要找工作&#xff0c;或者是想要跳槽的小伙伴们可要做好准备了&#xff0c;给大家总结了软测面试必问的20到面试题&#xff0c;背完面试不用慌&#xff01; 1.项目测试流程你是怎么开展的&#xff1f; 【参考回答】 首先&#xff0c;需求分析…

tauri程序加载本地图片或者文件在前端页面展示

要想在前端页面中展示本地文件或者文件夹&#xff0c;需要使用convertfilesrc这个api&#xff0c;可以非常方便的展示内容&#xff0c;官方文档&#xff1a;tauri | Tauri Apps convertFileSrc甚至位于invoke之前&#xff0c;但我却一直没有注意到它&#xff0c;一方面是因为&…

【最新华为OD机试E卷-支持在线评测】出租车计费(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

shell中对xargs命令传参进行编辑

以文件解压为例&#xff0c;将当前路径下的所有gz文件解压到同名的log文件中&#xff0c;解压命令如下所示&#xff1a; ls *.gz| xargs -n 1 -P 4 -I {} bash -c zcat "{}" > $(echo "{}" | sed "s/gz$/log/g") 执行结果如下图所示&#x…

物联网网络中集中式与分布式SDN环境的比较分析

论文标题&#xff1a;Comparative Analysis of Centralized and Distributed SDN Environments for IoT Networks 中文标题&#xff1a;物联网网络中集中式与分布式SDN环境的比较分析 作者信息&#xff1a; Khirota G. Yalda, Diyar J. Hamad, Nicolae Tapus罗马尼亚布加勒斯…

KVM 安装 Windows11

在 KVM 安装 Windows 比安装 Ubuntu 会复杂一些&#xff0c;去微软官网下载 Win11&#xff0c;同时要下载 Virtio 可以从 Fedora 下载 &#xff08;https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/&#xff09;。 安装Window 命令行输入以下命令&#xf…

YOLOv8-pose+streamlit 实现人体关键点检测/姿态估计系统(后续可用于健身时的姿态估计,训练纠正等....)

人体关键点检测系统 一、安装与配置1.1 安装 Streamlit1.2 配置文件1.3 运行Streamlit应用1.4 找模板 二、人体关键点检测算法2.1 关键点序号2.2 YOLOv8-pose图像推理 三、将YOLOv8-pose算法内置到streamlit中3.1 整体结构3.2 常见问题- RGB通道颠倒- Numpy与OpenCV之间的转换 …

个人信息安全,从这一课(CISAW-PIS)开始!

近年来&#xff0c;我国个人信息保护力度不断加大&#xff0c;个人信息的合法处理、跨境流动和安全保护变得更加复杂和严格。企业和管理者面临着如何执行个人信息保护相关法律、标准规范的挑战&#xff0c;员工则需要有效学习和应用个人信息保护策略&#xff0c;以确保个人信息…

8.11 矢量图层线要素单一符号使用一(简单线)

8.11 矢量图层线要素单一符号使用一(简单线)_qgis标记如何添加简单线-CSDN博客 目录 前言 简单线&#xff08;Simple line&#xff09;符号的使用 QGis中的使用 二次开发代码实现 总结 前言 本章介绍矢量图层线要素单一符号中简单线&#xff08;Simple line&#xff09;…

【Python报错已解决】TypeError: can only concatenate str (not “int“) to str

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…