NLP:BERT的介绍并使用该模型计算文本相似度

news2024/12/23 10:54:23

1. BERT

1.1 Transformer

  Transformer架构是一种基于自注意力机制(self-attention)的神经网络架构,它代替了以前流行的循环神经网络和长短期记忆网络,已经应用到多个自然语言处理方向。
  Transformer架构由两个主要部分组成:编码器(Encoder)和解码器(Decoder)。编码器和解码器均是由多个层(layer)堆叠而成,其中每层均由多个子层组成:比如自注意力机制和前馈神经网络。(本篇先不介绍解码器部分。)
在这里插入图片描述

1.1.1 编码器

  Transformer中的编码器的作用是提取原句中的特征值。Transformer的编码器不止一个,而是由一组 N N N个编码器串联而成。一个编码器的输出作为下一个编码器的输入。编码器由两部分组成:多头注意力层和前馈网络层。

1.1.1.1 多头注意力层

  要理解Transformer的多头注意力层,就必须先理解Transformer中的自注意力机制(self-attention)。Transformer中的自注意力机制一种能够使模型在处理序列数据时,通过计算序列中每个元素与其他所有元素之间的相关性,并据此对元素进行加权求和,从而生成包含所有元素信息但更侧重于重要部分的表示的机制。多头注意力机制就是自注意力机制的扩展,它通过并行计算多个自注意力头来捕捉不同子空间中的信息,最终将这些头的输出进行拼接和线性变换。
  自注意力机制的计算过程如下图。其中 Q Q Q为查询矩阵、 K K K为键矩阵、 V V V为值矩阵。
在这里插入图片描述

1.1.1.2 位置编码

  Transformer中的位置编码用于为输入序列中的每个词提供位置信息,以弥补模型中缺少顺序感的缺陷,使模型能够捕捉词汇的相对顺序和位置信息。

1.1.1.3 前馈网络层

  Transformer架构中的前馈网络由两个有ReLU激活函数的全连接层组成。前馈网络的参数在句子的不同位置上是相同的,但在不同的编码器模块上是不同的。

1.1.1.4 叠加和归一化组件

  叠加和归一组件实际上包含一个残差连接与层的归一化。层的归一化可以防止每层的值剧烈变化,从而提高了模型的训练速度。

至此,完整的编码器框架如下:
在这里插入图片描述

1.2 BERT模型

  BERT(Bidirectional Encoder Representations from Transformers,多Transformer的双向编码器表示法)模型是由谷歌发布的预训练语言模型。

1.2.1 预训练的BERT

  谷歌对外公开了其预训练的BERT模型,用户可以直接下载使用。其下载地址如下:https://huggingface.co/google-bert
在这里插入图片描述
BERT模型名称中的的uncased表示不区分大小写,cased表示区分大小写。在不区分大小写时,所有标记都转化为小写;在区分大小写时,标记大小写不变,直接用于训练。不区分大小写的模型是最常用的模型,但如果我们正在执行某些任务,比如命名实体识别(named entity recognition, NER),则必须保留大小写,使用区分大小写的模型。

1.2.2 Bert架构

  完整的BERT架构可以分为三大部分:输入层、中间层(Transformer编码器层)和输出层。这里重点介绍输入层和输出层。

1.2.2.1 输入层

  输入层将文本转换为 BERT 能够处理的形式,主要包括以下三个部分:

  • Token Embeddings: 将输入的每个词或子词(通过WordPiece分词)映射为对应的词向量;
  • Segment Embeddings:会分别给第一个句子的所有Token都分配0作为ID,用来标记它们属于第一个句子。给第二个句子的所有Token都分配1作为ID,用来标记它们属于第二个句子。
  • Position Embeddings:因为BERT不使用传统的RNN或CNN结构,而是基于自注意力机制,所以需要显式添加位置编码,表示词的相对位置,帮助模型捕捉词序信息。
    在这里插入图片描述
1.2.2.2 输出层

  BERT的输出层根据不同任务进行调整。BERT本身是一个通用的预训练模型,通过微调来适应各种下游任务。常见的任务主要包含以下几种:

  • 文本分类任务:使用[CLS]的输出,添加一个全连接层,将[CLS]的输出传入该层,再通过softmax进行分类。
  • 序列标注任务:在每个token的输出上添加全连接层,对每个token进行分类。
  • 问答任务:模型的输出是两个位置预测,一个表示答案的起始位置,另一个表示答案的结束位置,分别对每个token进行位置预测。

2. BERT的使用

2.1 计算文本相似度

   Bert在大量语料库上进行预训练,学到了丰富的语言知识,并能为单词、短语、句子生成深层次的语义表示。通过使用 BERT 输出的[CLS]标记来表示整个句子的语义信息,所以我们可以用Bert向量来计算文本语义相似度。具体代码如下:

from transformers import BertTokenizer, BertModel
import torch
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# 1. 加载 BERT 模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertModel.from_pretrained('bert-base-chinese')

# 2. 定义计算文本相似度的函数
def get_sentence_embedding(sentence):
    # 对输入句子进行编码
    inputs = tokenizer(sentence, return_tensors='pt', max_length=128, 
                       truncation=True, padding='max_length')
    # 使用 BERT 模型获取输出
    with torch.no_grad():
        outputs = model(**inputs)
    
    # 提取 [CLS] 标记的向量(句子级别向量)
    cls_embedding = outputs.last_hidden_state[:, 0, :].numpy()
    return cls_embedding

def calculate_similarity(text1, text2):
    # 计算两个文本的嵌入向量
    embedding1 = get_sentence_embedding(text1)
    embedding2 = get_sentence_embedding(text2)
    
    # 计算余弦相似度
    similarity = cosine_similarity(embedding1, embedding2)
    return similarity[0][0]

# 3. 示例文本
text1 = "这个商品挺好用的"
text2 = "这个商品一点也不好用"

# 4. 计算相似度
similarity_score = calculate_similarity(text1, text2)
print(f"Similarity: {similarity_score:.4f}")

运行上述代码你会发现text1和text2这两个语义完全相反的文本的相似度却高达0.91(即使在GPT系列的embedding模型上也会出现类似情况)。这可能是由以下几个原因导致的:

  • 模型无法捕捉否定关系:BERT 等预训练模型的主要任务是捕捉词语和句子中的语义关系,但它们在处理语义反转(如“我喜欢”与“我不喜欢”)时,可能难以充分理解否定词的影响,导致两者生成的嵌入向量仍然较为接近。
  • 语义结构相似性:即便两个句子的语义相反,它们可能在结构上非常相似,例如“我喜欢苹果”和“我讨厌苹果”在句法和词汇上只有否定词的不同,因此生成的嵌入向量仍然较接近。
  • 预训练数据的局限:BERT 在大量通用语料上进行预训练,未必对所有语境中的细微差异或否定词有足够的敏感性,这会导致某些反向语义的文本仍有较高的相似度。

  Bert提供了一个变体模型sentence-bert来专门生成句子的特征,计算句子的文本相似度。其用法举例如下:

from sentence_transformers import SentenceTransformer, util

# 加载Sentence-BERT模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# 定义两个文本
text1 = "这个商品挺好用的"
text2 = "这个商品一点也不好用"

# 使用模型生成文本的embedding
embedding1 = model.encode(text1, convert_to_tensor=True)
embedding2 = model.encode(text2, convert_to_tensor=True)
# 计算两个文本的余弦相似度
similarity_score = util.pytorch_cos_sim(embedding1, embedding2)
# 输出相似度结果
print(f"文本相似度: {similarity_score.item():.4f}") #0.8351

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

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

相关文章

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景

前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数,展示用户评分的效果,用户可以通过点击星星或滑动星星的方式进行评分。同时,uni-rate组件也支持自定义星星图标、星星…

关于CSS Grid布局

关于CSS Grid布局 实际效果参考 参考代码 <template><view class"baseInfo"><up-image class"cover" height"160rpx" width"120rpx" :src"bookInfo.cover"><template #error><view style"…

疾风大模型气象,基于气象数据打造可视化平台

引言 随着气象数据的广泛应用&#xff0c;越来越多的行业依赖天气预报与气候分析来做出决策。从农业、航空、能源到物流&#xff0c;气象信息无时不刻影响着各行各业的运作。然而&#xff0c;气象数据本身复杂且多样&#xff0c;如何将这些数据转化为直观、易于理解的图形和信…

MetaJUI v0.4 遇到的一些问题及解决办法记录

1、Unity3d 版本 2022.3.29f1。 2、MetaJUI v0.4 的下载&#xff0c;https://download.csdn.net/download/xingchengaiwei/89334848 3、将MetaJUI v0.4解压&#xff0c;用Unity3d 打开项目&#xff0c;会出现如下问题&#xff0c;按照图中提示操作即可。 4、打开工程后会出现…

第三人称射击游戏人物瞄准仰角的控制方案

这个功能有多种方案实现&#xff0c;总体可以分为两类&#xff1a; 1.改变腰的旋转&#xff1b; 2.改变手臂和头的旋转&#xff1b; 其中方案1&#xff1a; 只要转动腰一个骨骼&#xff0c;比较简单&#xff1b; 但是因为腰以上的部分都不动&#xff0c;第三人称比较僵硬&…

tk.mapper框架使用

说明&#xff1a;tk.mapper是一款DAO框架&#xff0c;也是基于Mybatis的&#xff0c;个人感觉&#xff0c;他是基于MyBatis和MyBatis-plus、MyBatis-Flex之间的过渡框架——能调用DAO的API&#xff0c;不手写SQL&#xff0c;但功能没有后面这两款框架多。本文介绍tk.mapper框架…

PyInstaller打包并设置图标

PyInstaller 是一个用于将 Python 代码打包成独立可执行文件的工具。如果你的 Python 代码中使用了一些资源文件&#xff08;如图片、音频、配置文件等&#xff09;&#xff0c;那么你需要将这些资源文件一起打包到可执行文件中&#xff0c;以便在运行时能够访问这些资源。 以…

STM32新建工程-基于库函数

一、创建一个新工程 我这里选择STM32F103C8的型号&#xff0c;然后点击OK。 keil5里面的小助手&#xff0c;暂时不用&#xff0c;叉掉 二、为工程添加文件和路径 在工程模板中还需要添加启动文件、系统头文件、系统时钟文件&#xff0c;创建一个文件夹start&#xff0c;将下面…

【韩顺平Java笔记】第5章:程序控制结构

文章目录 102. 回顾上一章节103. 顺序控制103.1 顺序控制 104. 单分支使用104.1 分支控制 if-else 介绍104.2 单分支 105. 单分支流程图106. 双分支使用107. 双分支流程图108. 双分支练习题109. 多分支使用109.1 多分支的流程图 110. 多分支练习1111. 多分支练习2112. 嵌套分支…

Fibonacci数列最小步数

1.题目&#xff1a; 2.解析&#xff1a; 让a,b,c回滚构造斐波那契数列 &#xff1a;ab, bc, cab; 输入的数 n小于c,在b,c之间&#xff0c;只要 n1 或者 n-1&#xff08;贪心思想&#xff1a;n只加一或者只减一&#xff09; 最后再求n-b,c-n的最小值&#xff0c;获得最小步数 …

《Linux从小白到高手》理论篇(八):Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识&#xff0c;并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如Oracle DB&#xff0c;启动Oracle实例服务后&#xff0c;就会有多个进程。 Linux进程分类 在 Linux…

csp-j模拟一补题报告

前言 又要开始写补题报告了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; &#xff08;“关于二进制中1的个数的研究”这篇文章可能会延期&#xff09; 第一题 题目 交替出场 (alter.cpp/c) 问题描述 给定一个字符串&#xff0c…

DC00024基于ssm实验室预约管理系统java web项目web教师预约jsp预约管理系统

1、项目功能演示 DC00024基于web实验室预约管理系统ssm教室预约实验室预约管理系统java web项目MySQL 2、项目功能描述 基于ssm实验室预约管理系统分为用户和系统管理员两个角色。 2.1 系统管理员 1、系统登录 2、用户管理&#xff1a;修改个人信息、修改个人密码、教师管理…

Forrester 报告揭示 2024 年十大云市场趋势:AI 与边缘计算融合带来机遇与挑战

云计算de小白 Forrester 在其“2024 年十大云计算趋势”报告中表示&#xff1a;“2024 年&#xff0c;基于云端的 AI 产品的市场采用和普及度将达到高潮。” Forrester 表示&#xff1a;“企业用户已经投资了微软 M365 Copilot 等人工智能服务作为提高生产力的工具&#xff0…

2024新淘宝镜像地址下载【vue-cli】

需要先安装NodeJS&#xff0c;然后再安装Vue-cli NodeJS下载 nodejs下载&#xff0c;直接搜官网 网址&#xff1a;https://nodejs.org/zh-cn LTS为长期稳定版本&#xff1a; 安装过程 只需要配置一下安装目录&#xff0c;其他都点下一步next 注意安装目录无中文无空格 验证…

vulnhub-Basic Pentesting 2靶机

vulnhub&#xff1a;https://www.vulnhub.com/entry/basic-pentesting-2,241/ 导入靶机(建议VirtualBox&#xff0c;VMWare扫不到)&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.81.3&#xff0c;扫描端口 很多端口&#xff0c;存在网站服务&#xff0c;访问 啥也…

加密与安全_HTOP 一次性密码生成算法

文章目录 HOTP 的基础原理HOTP 的工作流程HOTP 的应用场景HOTP 的安全性安全性增强措施Code生成HOTP可配置项校验HOTP可拓展功能计数器&#xff08;counter&#xff09;计数器在客户端和服务端的作用计数器的同步机制客户端和服务端中的计数器表现服务端如何处理计数器不同步计…

centos7安装docker-ce服务

docker服务安装 前言一、使用阿里云源进行安装二、使用清华源安装三、使用官网源安装 前言 centos7安装docker-ce 服务 一、使用阿里云源进行安装 centos7安装docker在国内使用阿里云的源安装比较快速。 # 获取yum源 sudo yum install -y yum-utils; sudo yum-config-manager …

(Linux驱动学习 - 4).Linux 下 DHT11 温湿度传感器驱动编写

DHT11的通信协议是单总线协议&#xff0c;可以用之前学习的pinctl和gpio子系统完成某IO引脚上数据的读与写。 一.在设备树下添加dht11的设备结点 1.流程图 2.设备树代码 &#xff08;1&#xff09;.在设备树的 iomuxc结点下添加 pinctl_dht11 &#xff08;2&#xff09;.在根…

解决Excel时出现“被保护单元格不支持此功能“的解决办法,详细喂饭级教程

今天有个朋友发过来一个excel文件&#xff0c;本来想修改表格的内容&#xff0c;但是提示&#xff0c;被保护单元格不支持此功能&#xff0c;对于这个问题&#xff0c;找到一个解决方法&#xff0c;现记录下来&#xff0c;分享给有需要的朋友。 表格文件名为aaa.xls,以WPS为例。…