NLP 模型“解语如神”的诀窍:在文本分类模型中注入外部词典

news2024/11/26 12:36:40

一. 引言

现实世界的文本表述如恒河沙数,以惊人的速度变换着,人工智能(AI)在快速识别形形色色的文本之前,必须经过充足的训练数据洗礼。然而,面对复杂多变的文本表述,NLP 模型往往无法从有限的训练数据中获得足够的支撑,寻求外部知识注入就成为了一条必经之路。

作为基底模型,ERNIE 等预训练语言模型普遍选择从知识图谱中获取结构化知识。构建完备的知识图谱,本身就是一项复杂课题,而融合训练更是高度的算力依赖。对于情感分析和攻击语言检测等文本分类场景,是否有更简洁的外部知识注入方式呢?

当然,在 NLP 技术还停留在特征工程时期,文本分类模型便搭建在大量的人工编辑或自动抽取的特征词典之上。进入深度学习时代,拥有卓越用户体验的商业落地系统仍然离不开用于干预黑盒模型的外部词典。尤其是对于大部分的应用场景,分类的判定本身就和关键词密不可分。比如,在情感分析中,情绪词“开心”“痛苦”等具有强烈的极性指向,副词“非常”“有一点”等也都是极其重要的程度线索。在攻击语言检测中,辱骂词“白痴”“傻瓜”就更直白了。

二. 词典表征

融入词典的第一步,是使用“向量”来表征词典命中的情况。如果共有 N 个特征词典,那么文本序列中的每个词,都有一个 N 维的特征向量,记为 feature-embedding。向量中的每个维度,代表当前词在对应词典中的权重得分。如果某一词典不包含权重得分,则命中记为 1.0,未命中记为 0.0。如果该词不在词典中,则记为 0.0。如果某一词典的分值超出区间 [-1,1],则应先进行归一化。

在这里插入图片描述

如上图所示,文本序列“我-今天-很-开心”共四个词,共三个特征词典。对应的特征向量分别为 [0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.7, 0.0],[1.0, 0.0, 0.0]。

三. 特征注入

在神经网络模型中注入额外特征的最直接方式,就是和 word-embedding 拼接在一起,这种朴素方式称为 native concatenation,如下图所示。

在这里插入图片描述

仅仅是简单拼接,在情感分类任务上也能获得一定的提升。在论文《Attention-based Conditioning Methods for External Knowledge Integration》中,作者比较了拼接方案在 LSTM 模型上对各个情感分类数据集的效果,如下图所示。

在这里插入图片描述

对于 CNN 类模型,还有一种拼接方案为 channel concatenation,即利用网络本身的多通道特定,使用二维卷积核进行编码。对于 feature-embedding比word-embedding 短的位置,用 0 补齐,如下图所示。

在这里插入图片描述

然而直接拼接并不是一个普适方案。对于 BERT 等已经完成了预训练的模型,已无法再在 word-embedding 层进行注入。即使是 LSTM 或 CNN 等简单网络,过早地进行融合也会干扰模型对文本本身语义的提取。因此,更加成熟的方案,BERT/LSTM/CNN 在完成了语义编码后,使用隐层向量代替 word-embedding 和 feature-embedding 进行拼接,再输入给 MLP 等单元进行融合,最终完成分类判定。

四. 拼接之后

当然,在完成了拼接注入之后,真正的融合方式不只有线性变换可以选择。从经验来说,效果更好的融合方案,都是“非对称结构”的。即 word 信息和 feature 信息不完全对等,在功能上彼此区别。模型仍然以文本信息作为主要判断依据,综合全局语义进行分类判定。词典信息作为引导,提醒模型关注被标记的关键词。这样的方式也符合人类在完成此类任务时的直观思维方式。

这不就是 attention 机制嘛?不过不是 Transformer 里的 self-attention,而是更古早的 vanilla 版本。该方案不进行任意两个位置之间的关联计算,每个词的权重只由自身决定。先来看看不进行融合时,是怎么对 word-embedding 进行 attention 的。对于一个完整的文本序列,将第 i 个词wi对应的语义向量记为hi,首先计算其 attention 得分:

在这里插入图片描述

其中va、wa、ba 都是待学习的模型参数。然后,根据 attention 得分进行各个位置的语义向量的加权,获得最终用于分类判定的r:

在这里插入图片描述

将第 i 个词 wi对应的词典特征向量记为c(wi) ,在 feature-embedding 的引入过程中,只修改 attention 得分 ai,不影响加权对象hi ,以实现非对称结构。即修改 f()为:

在这里插入图片描述

输出 [0~1] 之间的浮点数,再与hi进行点积,实现门控结构。以词典信息为门,对语义信息进行控制。具体的函数形式可以有多种变化,没有定式,应当在业务数据集上进行尝试,找出最佳的方案。

Attention 模型可以根据权重分数,直观地看到语义抽取的重点。以一个 PsychExp 情感分析数据集上的一个 case 为例,注入外部词典后,建模中心出现了变化,最终分类从 anger 变为了 guilt。如下图所示:
在这里插入图片描述

五. 总结

与知识图谱等结构化知识相比,外部词典不仅易于构建和维护,更适合文本分类的应用场景。进行知识引入后,一方面能显著提升模型的召回能力,减少业务漏判,另一方面,在中文互联网这个黑话频出的环境,可以在不更新模型的前提下让应用系统适应外部语言环境的变化发展。比起直接注入,与 attention 结合更符合人类的思考习惯,也更直观便于调试。在追求简洁优美的 end2end 模型时,也不应完全舍弃传统方案。各种结构化非结构化的经验知识,能够帮助我们打造用户体验一流的成熟商用 NLP 系统。

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

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

相关文章

架构设计(一):从单服务器模式到负载均衡设计

架构设计(一):从单服务器模式到负载均衡设计 作者:Grey 原文地址: 博客园:架构设计(一):从单服务器模式到负载均衡设计 CSDN:架构设计(一&…

latex设置citation显示作者+年份

如果是bib文件分开放,并且每个引用都明确写了author和year,那么直接\citep 就可以,就能产生(abc et al., 2015) 这种格式, 如果你不想要圆括号,可以使用\usepackage[square]{natbib}, 也可以使用\setcitestyle{authoryear,open{(}…

java计算机毕业设计基于安卓Android的论坛App

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

【Kubernetes】Pod数据存储

kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&#xff0…

时间序列异常检测(adtk)

1. 获取时间序列数据 未安装adtk的先安装:pip install adtk 2.阈值检测 adtk.detector.ThresholdAD(lowNone, highNone) 参数: low:下限,小于此值,视为异常 high:上限,大于此值,视为…

基于java+springboot+mybatis+vue+mysql的4S店车辆管理系统

项目介绍 任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于java语言设计并实现了4S店车辆系统&#…

回溯3-----BFS(一石激起千层浪)

文章目录广度优先搜索力扣429-----N叉树的层序遍历力扣994-----腐烂的橘子力扣127 -------单词接龙力扣725------打开转盘锁广度优先搜索 需要借助 队列 来解决问题 例如二叉树的层序遍历 : 1, 将根节点入队 2, 队列出队的时候, …

第一章 OAuth2.0规范(史上最详细解释)——介绍

目录 一、简介 二、角色 二、协议流程 三、授权许可 1、授权码 2、隐式许可 3、资源所有者密码凭据 4、客户端凭据 四、访问令牌 五、刷新令牌 六、TLS版本 七、HTTP重定向 八、互操作性 九、符号约定 一、简介 在传统的客户端-服务器身份验证模式中,客…

docker搭建redis三种集群模式

文章目录一、主从复制1、新建修改配置文件2、执行命令启动redis3、启动客户端测试二、哨兵模式Sentinel1、修改配置文件2、启动sentinel进程3、测试三、集群模式Cluster1、搭建集群1.1、创建集群挂载文件1.2、修改配置文件1.3、docker启动先六个redis实例1.4、构建集群1.5、查看…

【Canvas系列】基础入门(一)

📚 Canvas基础入门 🔥 收藏关注随时温习 💻 在线地址方便浏览 在线学习/演示地址 Canvas API 提供了一个通过JavaScript 和 HTML的元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面 —— MDN 一…

shell-条件

条件可以用test或【命令 符号和被检查的条件之间要留有空格 : if [ -f filename *** ] if 和then用于同一行 if [ ]; then 字符串比较: if [ string1 string2 ] 两个字符串相等为真 if [ string1 ! string2 ] 两个字符串不相等为假 …

web自动化测试:Selenium+Python基础方法封装

推荐阅读: [内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 正文 01 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从…

Fiddler(4):在fiddler会话栏中添加IP列,设置抓HTTPS的请求证书安装

Fiddler(4):在fiddler会话栏中添加IP列 在fiddler会话栏中添加IP列 1、点击菜单栏rules——customize rules…或者在右侧响应栏中点击FiddlerScript栏;如下图: 2、ctrlf搜索“static function main” 3、在main函数里加入下面一行代码&…

Kafka极客 - 09 Kafka Java Consumer 多线程开发实例

文章目录1. Kafka Java Consumer 设计原理2. 多线程方案3. 代码实现4. 问题思考目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序…

对称美学 华为OD真题 100

import java.util.Scanner; import java.util.*; import java.util.stream.Collectors; import java.math.BigInteger;class Main {public static void main(String[] args) {// 处理输入Scanner in new Scanner(System.in);int t in.nextInt();long[][] cases new long[t][…

Python学习笔记-模块

目录 一、模块的概念 二、自定义模块 1.创建模块 2.使用import语句导入模块 3.使用from...import 语句导入模块 4.模块搜索目录 4.1模块默认搜索目录 4.2临时添加目录 4.3增加.pth文件 4.4 在PYTHONPATH环境变量中添加 三、以主程序的形式执行 四、python中的包&am…

计算机毕业设计php_thinkphp_vue的家乡石泉网站-乡村家乡旅游信息网站

运行环境 开发语言:PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHP:vue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 目前家乡石泉市是一个有不同民族“大杂居,小聚居”的地方,所以对于发展家乡特色业还是比较有优势…

C++初阶 priority_queue(优先级队列)的使用和模拟实现

作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍优先级队列的使用和模拟实现 优先级队列的使用和模拟实现priority_queue的使用priority_queue的介绍priority_queue的定义priority…

Solid.js前端新秀框架 力压 web3.js 框架

SolidJS 是什么?SolidJS是一个声明式、高效且灵活用于构建用户界面的 JavaScript 库。 Solid 号称拥有 JSX 语法,类似于 React hook 的语法,你可以用现代化的开发方式,获得性能最快的代码。 框架本身只有7 KB大小,无需…

【在SpringBoot项目中删除相册数据--Controller层】

在AlbumController中添加处理请求的方法: 请求路径:/album/delete请求方式:POST请求参数:Long id响应结果:JsonResult >>> state:20000 具体代码为: // http://localhost:9080/album/delete ApiO…