我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

环境设置:

  • SentenceTransformer
  • transformers

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

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

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

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

pip install -U sentence-transformerspip 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 cosineimport numpy as npa=np.array([1,2,3])b=np.array([2,2,3])print(1-cosine(a,b))#cosin() 中参数可以直接是 list# 在sklearn库中计算矩阵import numpy as npfrom sklearn.metrics.pairwise import cosine_similaritya=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 modelmodel = SentenceTransformer('paraphrase-MiniLM-L6-v2')# The sentences we'd like to encodesentences = ['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 sentencesembeddings = model.encode(sentences)# Print the embeddingsfor 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, utilmodel = 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']# 计算embeddingsembeddings = 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, utilmodel = 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)

来源地址:https://blog.csdn.net/weixin_44649780/article/details/129922982

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录