BERT应用——文本相似度计算

  本文展示了如何利用BERT模型计算两个文本字符串之间的余弦相似度。BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的预训练模型,广泛应用于自然语言处理领域。BERT的核心创新在于其双向训练的机制,使得模型能够同时考虑到输入数据的左右两侧的上下文信息,从而获得更为丰富的语义表示。

在这里插入图片描述

一、技术思路

  本代码段的技术思路是:首先使用BERT的分词器对输入的单词进行编码,然后将编码后的数据输入到BERT模型中获取嵌入向量。随后,对这些向量进行平均池化处理以获得更加稳定的特征表示,最后通过余弦相似度函数计算两个嵌入向量之间的相似度。这种方法结合了BERT的深层语义理解能力和余弦相似度的直观度量方式,能有效地评估两个文本之间的语义接近程度。

  1. 文本编码原理

  在BERT中,文本首先通过一个分词器(Tokenizer)处理,该分词器将原始输入文本转换为模型可以理解的格式,包括将单词转换为词汇表中的索引、添加特殊的分隔符(如[CLS]和[SEP]),以及生成对应的注意力掩码(Attention Mask)。这一步是处理文本数据的关键,它直接关系到后续模型能否正确理解和处理输入数据。

  1. 嵌入向量的获取

  通过BERT模型对编码后的文本进行处理后,可以获取到每个输入token的嵌入表示。这些表示是在模型的多层网络结构中生成的,其中每一层都通过自注意力机制和前馈网络计算得到新的表示。在自然语言处理任务中,通常使用模型最后一层的输出作为最终的特征表示,因为它们包含了经过多层处理后的高级语义信息。

  1. 余弦相似度的计算

  余弦相似度是一种常用的相似度度量方式,它通过计算两个向量的夹角余弦值来评估它们的相似度。在文本处理中,将两个文本的嵌入向量进行余弦相似度计算,可以得到一个介于-1和1之间的标量值,表示这两个文本在语义上的接近程度。值越接近1,表示语义相似度越高;值越接近-1,表示语义差异越大。

二、代码实现

from transformers import BertTokenizer, BertModel
import torch
import torch.nn.functional as F# 定义要比较的单词
Text_1 = "Apple"
Text_2 = "Red"# 初始化 BERT tokenizer 和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')# 对单词进行编码
tokens_a = tokenizer(Text_1, return_tensors='pt')
tokens_b = tokenizer(Text_2, return_tensors='pt')# 获取单词的嵌入
with torch.no_grad():embeddings_a = model(**tokens_a).last_hidden_state.mean(dim=1)embeddings_b = model(**tokens_b).last_hidden_state.mean(dim=1)# 计算余弦相似度
cosine_similarity = F.cosine_similarity(embeddings_a, embeddings_b)
cosine_similarity.item()
print(cosine_similarity)

结果

Text_1Text_2cosine_similarity
AppleRed0.8330
AppleEat0.8428
I like applesThe weather is cold0.4977
I like applesI don’t like bananas0.7750

参考资料

[1] Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arxiv preprint arxiv:1810.04805, 2018.
[2] bert-base-uncased

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cartographer学习笔记

Cartographer 是一个跨多个平台和传感器配置提供 2D 和 3D 实时同步定位和地图绘制 (SLAM) 的系统。 1. 文件关系 2. 代码框架 common: 定义了基本数据结构和一些工具的使用接口。例如,四舍五入取整的函数、时间转化相关的一些函数、数值计算的函数、互斥锁工具等…

【必会面试题】快照读的原理

目录 前言知识点一个例子 前言 快照读(Snapshot Read)是数据库管理系统中一种特殊的读取机制,主要用于实现多版本并发控制(MVCC, Multi-Version Concurrency Control)策略,尤其是在MySQL的InnoDB存储引擎中…

特征优化+模型优化

一、优化思路梳理 课前准备   在昨天的内容中,我们通过使用更强的集成模型以及模型融合的方法,已经顺利将比赛分数提高至前20%。但正如此前所说,之前的一系列操作只不过是遵循了常规操作流程进行的数据处理与建模,若希望能够更进…

界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…

笔记-Python中的struct模块

了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理。而在网络通信当中,大多传递的数据是以二进制流(binary …

【简报】VITA 74 (VNX)B

1 为什么向AMSAT社区提及VPX / VNX 1.1VPX是包括卫星在内的最新一代军用车辆增长最快的标准 VITA 65 – 面向地面车辆的 OpenVPX文献检索将揭示在许多商业和军事坚固型系统应用中的广泛应用VITA 78 – AFRL和工业界正在开发用于卫星的“SpaceVPX”和“Space VPX Lite” 1.2 …

人工智能_机器学习097_PCA数据降维算法_数据去中心化_特征值_特征向量_EVD特征值分解原来和代码实现---人工智能工作笔记0222

降维算法的原理,一会咱们再看,现在先看一下,算法 可以看到PCA算法的,原理和过程,我们先看一下代码 为了说明PCA原理,这里,我们,先来计算一下X的方差,可以看到 先把数据进行去中心化,也就是用数据,减去数据的平均值. B = X-X.mean(axis=0) 这段代码是用于计算矩阵X的每一列减去该…

EE trade:通货膨胀对老百姓意味着什么

通货膨胀,是经济领域中的一个常见现象,对社会各阶层尤其是普通老百姓的生活产生了深远影响。理解通货膨胀对老百姓的真实含义,可以帮助我们更好地应对日常生活的变化与挑战。 1. 生活成本的上升 最直接的影响体现在生活成本上。通货膨胀会导致…

Linux操作系统:Redis在虚拟环境下的安装与部署

Redis下载方法 最近部署项目的时候用到了Redis,自己在安装的时候也碰到了一些列问题最终安装成功,记录一下自己的安装历程。前期准备: 服务器Linux版本:Centos8.4 64位(http://isoredirect.centos.org/centos/8/isos/…

如何使用Python提取Excel中固定单元格的内容

正文共:1234 字 31 图,预估阅读时间:1 分钟 之前转载了颜总的Python环境搭建文章(Python办公自动化—环境搭建),很久过去了,颜总也没有再更新。现在我有一个需求,就是我手上有大量格…

Android Studio 下载 | 安装 | 下载 SDK | 中文插件 | 卸载

文章目录 下载安装包安装下载 SDK中文插件卸载 下载安装包 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 点击下载 Android Studio。 在协议最下方勾选同意(第一次用最好还是看一眼),再点击 Dowload Android Stu…

css文字超出元素省略,单行、多行省略

通用CSS .box {width: 500px;border: 1px solid red;padding: 10px;line-height: 24px;} 1.单行省略 .singe-line {text-overflow: ellipsis;overflow: hidden;word-break: break-all;white-space: nowrap;}<p>单行省略</p><div class"singe-line box&qu…

GraphQL(5):使用Mutations修改数据

GraphQL中的使用Mutation查询&#xff0c;下面介绍详细操作&#xff0c;新建一个mutation.js文件。 1 定义schema 1.1 定义模型对象 &#xff08;1&#xff09;定义输入模型 input AccountInput {name: Stringage: Intsex: Stringdepartment: String} &#xff08;2&#xf…

攻防世界---misc---Ditf

1、题目描述&#xff0c;下载附件&#xff0c;是一张图片 2、打开图片&#xff0c;发现宽高不一样&#xff0c;猜测可能是需要修改宽高&#xff0c;用winhex分析&#xff0c;没有发现奇怪的地方 3、用kali中的binwalk命令&#xff0c;分析图片&#xff0c;发现有个压缩包&#…

基于SpringBoot+Vue二手家电管理平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

va_start和va_end使用介绍

一 概述 采用C语言编程的时候&#xff0c;函数中形式参数的数目通常是确定的&#xff0c;在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎…

基于jeecgboot-vue3的Flowable流程-待办任务(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、ToDo.data.ts的数据信息如下 import {BasicColumn} from //components/Table; import {FormSchema} from //components/Table; import { rules} from //utils/helper/validator; impor…

c# iText使用

引入包 用nuget安装itext和itext.bouncy-castle-adapter包&#xff1a; 创建pdf string path "a.pdf"; PdfWriter writer new PdfWriter(path); PdfDocument pdfDoc new PdfDocument(writer); var docnew Document(pdfDoc); Paragraph p new Paragraph(&quo…

Python03:python代码初体验2

1、变量命名规范 1&#xff09;字母&#xff08;Unicode字符&#xff09;、数字、下划线&#xff0c;不能使用特殊字符&#xff0c;数字不能开头 2&#xff09;变量名是区分大小写的&#xff08;大小写敏感&#xff0c;x和X是两个不同的变量名&#xff09; 3&#xff09;不能使…

【打印功能】js简单实现表格样式的数据打印,按样式打印出来

效果图 代码部分&#xff0c;简单三步 1&#xff0c;html部分&#xff1a;写一个表格&#xff0c;然后数据填进去 <div id"printable-area" v-show"false"><div><div style"text-align: center;height: 40px;line-height: 40px;font…