BERT应用——文本间关联性分析

  本文结合了自然语言处理(NLP)和深度学习技术,旨在分析一段指定的任务文本中的动词,并进一步探讨这个动词与一系列属性之间的关联性。具体技术路径包括文本的词性标注、语义编码和模型推断。
在这里插入图片描述

一、技术思路

  1. NLP和词性标注

  在自然语言处理中,理解文本通常开始于基础的语法分析,包括词性标注(POS Tagging)。这一过程涉及识别文本中每个单词的语法类别,如名词、动词等。在本代码中,使用了spaCy这一开源NLP库,它包含预训练的语言模型来执行包括词性标注在内的多种语言分析任务。通过识别任务文本中的主动词,我们可以抓住句子的行动指令,这对于理解任务的本质至关重要。

  1. 深度学习模型BERT

  代码中采用的BERT模型是一种预训练的变换器模型,具有处理各种语言理解任务的能力。BERT模型的核心优势在于其双向编码器表示,能够理解单词在上下文中的复杂关系。通过对BERT模型的进一步训练或微调,它可以适应特定的文本分类任务,如判断文本属性是否与特定动词相关。

  1. 语义编码和模型推断

  文本编码是将文本转换为模型能够处理的格式的过程,通常涉及分词和数字化表示。在BERT中,使用特定的分词器将文本转换为一系列的token,然后将这些token转换为索引,这些索引对应于BERT模型训练时使用的词汇表。这种编码后的数值形式允许模型处理并理解原始文本。

  在属性的相关性判断上,代码首先将每个属性独立地进行编码,然后通过BERT模型进行推断,输出每个属性与动词的相关性得分。通过设定阈值,可以决定哪些属性与动词具有高度相关性。这一步骤是基于模型学习到的语言特征,判断不同属性对于完成任务的相关性和重要性。

二、代码实现

from transformers import BertTokenizer, BertForSequenceClassification
import torch
import spacy

# 加载spaCy的英语语言模型
nlp = spacy.load("en_core_web_sm")

# 加载预训练的bert-base-uncased模型和分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")

# 任务文本
task_text = "Please take the cup for me"
# 已知的物品属性
attribute_text = "graspable, containable, red, cylinder shape"


# 处理任务文本
doc = nlp(task_text)

# 提取最关键的动词
main_verb = None
for token in doc:
    if "VB" in token.tag_:
        main_verb = token.text
        break

# 打印最关键的动词
if main_verb:
    print(f"The main verb is: {main_verb}")
else:
    print("No main verb found in the sentence.")

# 分词并编码任务文本
task_tokens = tokenizer.encode(main_verb, add_special_tokens=True, max_length=32, truncation=True,
                               padding='max_length')
print('task_tokens: ', task_tokens)
task_input_ids = torch.tensor(task_tokens).unsqueeze(0)  # 添加批次维度
print('task_input_ids: ', task_input_ids)

# 分词并编码每个属性
attributes = attribute_text.split(", ")
is_related = []

# 阈值用于判断属性是否与任务相关
threshold = 0.5

# 遍历每个属性并判断相关性
for attribute in attributes:
    attribute_tokens = tokenizer.encode(attribute, add_special_tokens=True, max_length=32, truncation=True,
                                        padding='max_length')
    attribute_input_ids = torch.tensor(attribute_tokens).unsqueeze(0)

    # 推理
    with torch.no_grad():
        attribute_output = model(input_ids=attribute_input_ids)

    print('attribute_output: ', attribute_output)
    # 获取模型的分类分数
    attribute_scores = attribute_output.logits
    print(attribute_scores)

    # 检查标签为1的类别(相关性)
    print(attribute_scores[0][1])
    is_related_attribute = attribute_scores[0][1] > threshold
    is_related.append((attribute, is_related_attribute))

print(is_related)
# 打印结果
for attribute, related in is_related:
    if related:
        print(f"任务文本与属性 '{attribute}' 相关")
    else:
        print(f"任务文本与属性 '{attribute}' 不相关")

输出结果

The main verb is:take
task_tokens:[101, 2202, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
task_input_ids:tensor([[ 101, 2202, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
attribute_output:SequenceClassifierOutput(loss=None, logits=tensor([[ 0.2044, -0.1437]]), hidden_states=None, attentions=None)
tensor([[ 0.2044, -0.1437]])
tensor(-0.1437)
attribute_output:SequenceClassifierOutput(loss=None, logits=tensor([[ 0.2036, -0.1523]]), hidden_states=None, attentions=None)
tensor([[ 0.2036, -0.1523]])
tensor(-0.1523)
attribute_output:SequenceClassifierOutput(loss=None, logits=tensor([[ 0.2480, -0.1076]]), hidden_states=None, attentions=None)
tensor([[ 0.2480, -0.1076]])
tensor(-0.1076)
attribute_output:SequenceClassifierOutput(loss=None, logits=tensor([[ 0.2650, -0.1961]]), hidden_states=None, attentions=None)
tensor([[ 0.2650, -0.1961]])
tensor(-0.1961)
[(‘graspable’, tensor(False)), (‘containable’, tensor(False)), (‘red’, tensor(False)), (‘cylinder shape’, tensor(False))]
任务文本与属性 ‘graspable’ 不相关
任务文本与属性 ‘containable’ 不相关
任务文本与属性 ‘red’ 不相关
任务文本与属性 ‘cylinder shape’ 不相关

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> singleNumbers(vector<int>& nums) {int eor 0;for (int num:nums)eor ^ num;int rightOne eor & (~eor 1); // 提取出最右的1int onlyOne 0;for (int cur : nums) {if ((cur…

Spring Boot中整合Jasypt 使用自定义注解+AOP实现敏感字段的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

国外高防云服务器全面解析

国外高防云服务器是部署在海外市场&#xff0c;具备高级防护能力的云服务器。它们通常能够抵御大规模的分布式拒绝服务(DDoS)攻击和CC攻击&#xff0c;这类服务器特别适合对网络稳定性和数据安全性有较高要求的业务场景&#xff0c;如游戏行业、外贸电商等。下面将具体分析国外…

idea maven 执行 控制台乱码

这是没加出现的问题 上方案

verilog 232串口通信程序

1,串口通信协议: 通常串口的一次发送或接收由四个部分组成:起始位S、数据位D0~D7(一般为 6 位~8 位之间可变,数据低位在前)、校验位(奇校验、偶检验或不需要校验位)、停止位(通常为1位、1.5位、2位)。停止位必须为逻辑 1。在一次串口通信过程中,数据接收与发送双方…

容器(Docker)安装

centos安装Docker sudo yum remove docker* sudo yum install -y yum-utils#配置docker的yum地址 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装指定版本 - 可以根据实际安装版本 sudo yum install -y docke…

c# 下 ScintillaNET 显示XML信息并折叠节点

winform下显示XML信息&#xff08;非WPF&#xff09; 之前使用的是FastColoredTextBox&#xff0c;github地址如下&#xff1a; https://github.com/PavelTorgashov/FastColoredTextBox 但是有个问题&#xff0c;它支持中文&#xff0c;wordwraptrue&#xff0c;自动换行时&…

Vue3+vite部署nginx的二级目录

修改router访问路径 const router createRouter({history: createWebHistory(/mall4pc-bbc/),routes: [XXX,] })配置package.json文件 "build:testTwo": "vite build --mode testing --base/mall4pc-bbc/", 执行打包命令 npm run build:testTwo 打包出…

.NET集成DeveloperSharp操作Redis缓存

&#x1f3c6;作者&#xff1a;科技、互联网行业优质创作者 &#x1f3c6;专注领域&#xff1a;.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 &#x1f3c6;欢迎关注我&#xff08;Net数字智慧化基地&#xff09;&#xff0c;里面…

汇编:数组数据传送

要在32位汇编中实现数组数据的传送&#xff0c;可以使用字符串操作指令 MOVS 以及其前缀 REP&#xff0c;可以高效地复制数组数据。 MOVS 指令是一种字符串操作指令&#xff0c;用于将数据从源地址移动到目标地址。MOVS 指令有不同的变种&#xff0c;可以处理不同大小的数据&a…

每日一题——几行Python实现PAT甲级1065 A+B and C (64bit)(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 改进建议 我要更强 代…

适用于 Windows 11 的 10 款最佳视频转换器:快速转换高质量视频格式

您是否遇到过由于格式不兼容而无法在设备上播放视频或电影的情况&#xff1f;您想随意播放从相机 GoPro 导入的视频&#xff0c;还是以最合适的格式将它们上传到媒体网站&#xff1f;您的房间里有一堆 DVD 光盘&#xff0c;并想将它们转换为数字格式以方便播放?...所有这些问题…

ComfyUI工作流分享-黏土特效工作流

大家给的教程都是苹果端使用Remini的软件制作&#xff0c;免费白嫖7天&#xff0c;7天后就要收费&#xff0c;作为ComfyUI技术党&#xff0c;当然是选择自己实现了&#xff0c;搭建一套工作流就搞定&#xff0c;这不&#xff0c;今天就来分享一套对应的黏土效果工作流&#xff…

前端进阶之HTML表单

前端之HTML表单 1.HTML表单的定义及概述 HTML 表单用于搜集不同类型的用户输入。 用<form> 元素定义HTML表单 例如&#xff1a; <form>. form elements. </form>1.1 HTML 表单包含表单元素&#xff1a;表单元素指的是不同类型的 input 元素、复选框、单…

成功解决:AssertionError: Torch not compiled with CUDA enabled

在运行pycharm项目的时候,出现了以上的报错,主要可以归结于以下两个个方面: 1、没有安装GPU版本的pytorch,只是使用清华的镜像地址下载了CPU版本的pytorch 2、安装的CUDA和安装的pytorch的版本不相互对应 我使用 pip list 来查看我在该环境下安装了哪些依赖项,发现自…

前端项目打包、部署的基础 (vue)

详细请看B站视频 BV19n4y1d7Gr 《禹神&#xff1a;前端项目部署指南&#xff0c;前端项目打包上线》&#xff0c;本博客为自用视频笔记。 目录 项目打包vue打包打包前分析项目请求 本地服务器部署问题 & 解决问题1&#xff1a;刷新页面404问题问题2&#xff1a;ajax请求废…

Java——break、continue和return

一、break break语句用于立即终止最内层的循环或switch语句。它是一种控制流语句&#xff0c;能够在满足特定条件时跳出循环或结束switch块的执行。 1、在循环中使用 1&#xff09;一般的 break break语句可以用于for、while和do-while循环中。当在循环中遇到break语句时&a…

剪辑软件大揭秘:解锁图片叠加新技能,轻松将一张图片置于另一张图片之上,创意无限!

在数字时代的浪潮中&#xff0c;视频剪辑已经成为我们生活中不可或缺的一部分。无论是记录生活点滴&#xff0c;还是打造专业影片&#xff0c;一款功能强大的视频剪辑软件都是我们的得力助手。今天&#xff0c;就让我为大家揭秘一款神奇的剪辑软件——媒体梦工厂&#xff0c;它…

MySQL排序操作

025排序操作 select .. from .. order by 字段 asc/descselect empno, ename, sal from emp order by sal asc;asc 不写的话&#xff0c;默认升序 多个字段排序 查询员工的编号、姓名、薪资&#xff0c;按照薪资升序排列&#xff0c;如果薪资相同的&#xff0c;再按照姓名升…

5G商用五周年,我们该如何评价它?

今天&#xff0c;对中国通信行业来说&#xff0c;是一个特殊的日子。 五年前&#xff0c;也就是2019年6月6日&#xff0c;工信部正式向中国电信、中国移动、中国联通、中国广电发放了5G商用牌照&#xff0c;标志着国内5G开始正式商用。 换言之&#xff0c;今天&#xff0c;是中…