NLP | SentenceTransformer将句子进行编码并计算句子语义相似度

news/2024/7/7 22:54:50

环境设置:

  • SentenceTransformer
  • transformers

SentenceTransformers Documentation — Sentence-Transformers documentation (sbert.net)

Sentence Transformer是一个Python框架,用于句子、文本和图像嵌入Embedding。

这个框架计算超过100种语言的句子或文本嵌入。然后,这些嵌入可以进行比较,例如与余弦相似度进行比较,以找到具有相似含义的句子,这对于语义文本相似、语义搜索或释义挖掘非常有用。
该框架基于PyTorch和Transformer,并提供了大量预训练的模型集合,用于各种任务,此外,很容易微调自己的模型。

如果没有的话,利用pip安装

pip install -U sentence-transformers
pip install -U transformers

 如果是conda的虚拟环境时,使用 conda 安装

可以使用以下命令安装句子转换器conda

conda install -c conda-forge sentence-transformers

关键知识点:余弦相似度计算

余弦相似度是判断两个向量相似度常用的算法,是一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。
总之,相似度越小,距离越大。相似度越大,距离越小。

数学计算公式:

 a,b,c 是三个边的长度

在NLP计算中,常用来计算词语的相似度,因为词,或者文本表示成分布式向量之后,可以很方便的计算他们的余弦相似度来评估他们的语义相似性。可以表示为

简单代码实现

# 在scipy库中计算
from scipy.spatial.distance import cosine
import numpy as np
a=np.array([1,2,3])
b=np.array([2,2,3])
print(1-cosine(a,b))#cosin() 中参数可以直接是 list

# 在sklearn库中计算矩阵
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
a=np.array([1,2,3]).reshape(1,3)#[[1 2 3]]
b=np.array([2,2,3]).reshape(1,3)#[[2 2 3]]
c=cosine_similarity(a,b)   
print('相似度结果为 : ',c)

a=np.arange(15).reshape(3,5)
b=np.arange(20).reshape(4,5)
print(a)
print(b)
c=cosine_similarity(a,b)   #第一行的值是a中的每第一个行向量与b中每一个行向量之间的余弦相似度
d=cosine_similarity(a)# a 中的行向量之间的两两余弦相似度
print('c : ',c,'d : ',d)

 结果如下

 

 

句子向量化表示

from sentence_transformers import SentenceTransformer

# Download model
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# The sentences we'd like to encode
sentences = ['Python is an interpreted high-level general-purpose programming language.',
    'Python is dynamically-typed and garbage-collected.',
    'The quick brown fox jumps over the lazy dog.']

# Get embeddings of sentences
embeddings = model.encode(sentences)

# Print the embeddings
for sentence, embedding in zip(sentences, embeddings):
    print("Sentence:", sentence)
    print("Embedding:", embedding)
    print("")

对句子进行编码,结果如下

提供各种预训练模型。使用这些模型很容易:

其中模型可更改为

model = SentenceTransformer('all-MiniLM-L6-v2')

 所有模型都托管在HuggingFace模型中心。

也可更改为以下预训练模型

计算语义相似度

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('all-MiniLM-L6-v2')

# 文本列表
sentences = ['The cat sits outside',
             'A man is playing guitar',
             'I love pasta',
             'The new movie is awesome',
             'The cat plays in the garden']

# 计算embeddings
embeddings = model.encode(sentences, convert_to_tensor=True)

# 计算不同文本之间的相似度
cosine_scores = util.cos_sim(embeddings, embeddings)

# 保存结果
pairs = []
for i in range(len(cosine_scores)-1):
    for j in range(i+1, len(cosine_scores)):
        pairs.append({'index': [i, j], 'score': cosine_scores[i][j]})

# 按照相似度分数进行排序打印
pairs = sorted(pairs, key=lambda x: x['score'], reverse=True)

for pair in pairs:
    i, j = pair['index']
    print("{:<30} \t\t {:<30} \t\t Score: {:.4f}".format(sentences[i], sentences[j], pair['score']))

 结果如下

cos相似度计算

from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('all-MiniLM-L6-v2')

#Sentences are encoded by calling model.encode()
emb1 = model.encode("This is a red cat with a hat.")
emb2 = model.encode("Have you seen my red cat?")

cos_sim = util.cos_sim(emb1, emb2)
print("Cosine-Similarity:", cos_sim)

 结果

 

详情请参考:

Pretrained Models — Sentence-Transformers documentation (sbert.net)


http://lihuaxi.xjx100.cn/news/1001951.html

相关文章

兆芯最新X86 CPU曝光:性能与英特尔/AMD相比,没落后10年

众所周知&#xff0c;在PC领域&#xff0c;X86完全是处于垄断地全的&#xff0c;至少占了90%以上的份额。其它的像MIPS、ARM、RISC-V等等&#xff0c;都不是X86的对手。 这与X86是复杂指令集有关&#xff0c;更与X86绑定了windows操作系统&#xff0c;有坚固的intel联盟有关&am…

《iTOP-3568开发板快速测试手册》第6章 Ubuntu系统功能测试 (5)

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

LeetCode:455. 分发饼干——贪心算法

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 贪心算法是在每个阶段选取局部最优解&#xff0c;最终得到全局最优解的一种思想。贪心算法…

算法 DAY20 二叉树 || 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树 蛮简单的&#xff0c;逻辑跟构造树基本一致 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : …

医学影像系统弱监督语义分割集成的探索

Exploring Weakly Supervised Semantic Segmentation Ensembles for Medical Imaging Systems 摘要 利用复杂数据集的低质量CAM预测来提高结果的准确性使用低阈值CAMs以高确定性覆盖目标对象通过组合多个低阈值cam&#xff0c;在突出显示目标对象的同时均匀地消除它们的错误 …

【通过redis生成编码】生成不重复的序列号

/*** 生成一个序列号&#xff0c;每天从0开始自增* yyyyMMdd0001* Param leftCode编号特定前缀* */public String getSequence(String leftCode){SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyyMMdd");String dateTime simpleDateFormat.format(ne…

STM32F103引脚输入输出模式详解

目录 一&#xff1a;输入模式 1.1&#xff1a;模拟输入 1.2&#xff1a; 浮空输入 1.3&#xff1a;上拉输入 1.4&#xff1a;下拉输入 1.5&#xff1a; 为什么没有复用输入配置模式 二&#xff1a;输出模式 2.1&#xff1a;推挽输出 2.2&#xff1a;开漏输出 2.3&#xf…

并发情况下, 必须对iterator 进行加锁

java集合操作中, remove 元素请使用 Iterator 方式&#xff0c;如果并发操作&#xff0c;需要对 Iterator 对象加锁, 为什么并发情况下, 必须对iterator 进行加锁 在并发环境下&#xff0c;如果多个线程同时尝试访问同一个集合并且其中某个线程正在使用Iterator遍历该集合&…