NLP手札1. 金融信息负面及主体判定方案梳理&代码实现
这个系列会针对NLP比赛,经典问题的解决方案进行梳理并给出代码复现~也算是找个理由把代码从TF搬运到torch。Chapter1是CCF BDC2019的赛题:金融信息负面及主体判定,属于实体关联的情感分类任务,相关代码实现以及Top方案梳理详见ClassisSolution/fin_new_entity。数据lookalike如下
赛题分析
赛题本身已经对金融网络文本进行了实体抽取,跳过了金融实体抽取的步骤,只需要对已抽取出的实体判断文本是否描述了该金融实体的负面信息。只看问题本身和属性级情感分类问题有些类似,例如电商领域需要从评论中抽取产品多个属性各自的正负面评价,像价格[低]但是质量[差],可以得到价格和质量两个属性分别的正面和负面情绪。不过难点上有所不同,属性情感识别上,不同属性的评价词会有比较显著的差异,在金融实体中,因为实体本身多是并列关系,需要学习更复杂的上下文差异。
比赛的效果评估采用综合F1,分别计算句子级别的情感分类F1和实体级别的F1。整体任务F1=0.4句子F1+0.6实体F1。不过官网已经不能提交测试集评估,因此下面方案尝试我从训练集切了20%的样本来做效果评估
方案梳理
梳理了下Top方案的差异,主要在以下几个方面:预处理,实体处理方式,多任务,继续预训练
预处理
- 文本清洗
文本是爬取的新闻,html标签比较多。不过不是抽取类任务所以我只过滤了一些高频的标签和pattern,没有做的非常细致,在分类任务上基本不会有太大的影响。
def text_preprocess(s):
if not s:
return s
s = full2half(s)
s = re.sub('\{IMG:.?.?.?\}', ' ', s) # 图片
s = re.sub(re.compile(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'), ' ', s) # 网址
s = re.sub(re.compile('<.*?>'), '', s) # 网页标签
s = re.sub(r'&[a-zA-Z0-9]{1,4}', ' ', s) #   > &type &rdqu ....
s = re.sub('^\?+', '', s) # 问号开头直接删除
s = re.sub('\?{2,}', ' ', s) # 中间出现多余1个问号用空格替代
s = re.sub('^#', '', s) # 井号开头直接删除
s = re.sub('#+', ' ', s) # 井号在中间用空格分隔
s = re.sub('\[超话\]', ' ', s) # 超话删除
return s
- 长文本处理
长文本处理一般是截断,段落或者句子过Encoder再在上游融合。因为要预测实体是否负面,主需要保留实体周围的上下文即可。并且赛题文本中有部分是前半段讲实体1,后半段讲实体2,且情绪不同,如果使用全文本预测反而会增加混淆度。因此选择根据实体位置进行文本截断,定位实体首次出现的位置,如果位置>max_seq_len,则截取实体周围的上下文作为样本。这里我直接简单粗暴地截取了前后250个字,更优的方案还是按句子切分,定位到实体出现的句子,截取前后的完整句子,保证语义的通顺,在实体发现的案例中我做了这种处理。
- 过滤冗余信息
相比直接拼接标题和正文,可以针对标题和正文的重合度(编辑距离),判断标题是否有信息补充,如果没有可以选择只保留正文。我尝试后对效果影响不大,不过会适当降低文本长度,以及优化文本的语义通顺度。在医疗文本分类中,处理患者主诉,和医生病例文本时尝试过这个方案,会有一定的效果提升
建模
虽然问题本身看起来很像一个pipeline问题,先判断句子是否负面,再定位负面句子中哪些实体为负面。但其实可以被简化成一个属性(实体)情感分类问题,只需要对样本进行下重构,把一条文本中每个实体是否负面的判别问题,拆分成多条样本,每个样本只预测一个实体是否负面。当预测一个实体时,文本中其他实体属于伴随实体。方案的主要差异在于如何处理待预测实体和伴随实体
- 处理待预测实体
- 把待预测实体作为一路输入
- 借鉴关系抽取使用标识符标记实体
- 处理伴随实体
- 直接用特殊token替换,降低伴随实体对待预测实体的影响,提高模型泛化
- 把伴随实体拼接作为一路输入
都是实体,为什么需要区别对待呢?
个人认为待预测实体比伴随实体更需要学到'负面实体出现的上下文'这个信息,而伴随实体的作用更多是提示模型这些span本身是实体,也就是金融领域知识的引入。两种待预测实体的标识方案,效果上差不多,我更倾向于特殊标识的方案,因为这个方案能引入更多的位置信息。两种伴随实体的处理方案中,把伴随实体作为一路输入的效果更好,所以我感觉伴随实体的span信息更重要,降低对预测实体的影响这一点可能没有那么重要。
方案 | F1_entity | F1_sentence | F1 |
---|---|---|---|
Format1:双输入,1为待预测实体,2为title+text,伴随实体用[O]替换 | 93.8% | 94.5% | 94.1% |
Format2:单输入,title+text, 用[E]标记待预测实体,伴随实体用[O]替换 | 93.5% | 94.6% | 93.9% |
Format3:双输入,1为伴随实体拼接,2title+text,带预测实体用[E]标记 | 94.5% | 95% | 94.7% |
多任务优化
虽然把pipeline任务简化成了属性分类,但是句子级别的情感信息依旧是建模中可以尝试引入的优化点。如果能识别句子非负则实体全部非负,如果句子为负则实体为负的概率更高。因此可以尝试引入更简单的句子级别的情感分类作为一路辅助任务。句子和实体共享文本Encoder,同时各自的头分别学习各自的label,效果上句子级别的F1提升比较明显。
方案 | F1_entity | F1_sentence | F1 |
---|---|---|---|
Format3:双输入,1为伴随实体拼接,2title+text,带预测实体用[E]标记 | 94.5% | 95% | 94.7% |
Format4: Format3基础上加入多任务同时学习实体+句子负面 | 94.8% | 95.5% | 95.1% |
TAPT优化
在Bert手册中Bert不完全手册8. 预训练不要停!Continue Pretraining我们聊过继续预训练范式。考虑赛题本身是金融领域,因此可以尝试用任务样本继续预训练(TAPT)来进行效果优化。
不过这里和原始论文不同的是,我调整了继续预训练的任务目标。把样本中抽取出来的实体词加入了分词器,在Whole Word MASK的基础上补充了金融实体粒度的词信息,进行实体和全词掩码的继续预训练,训练了10个epoch。然后再进行以上的多任务学习,整体还会有微小0.1个点的F1提升,这个提升我怀疑是波动哈哈哈....毕竟样本这么小,你想要啥自行车~
方案 | F1_entity | F1_sentence | F1 |
---|---|---|---|
Format4: Format3基础上加入多任务同时学习实体+句子负面 | 94.8% | 95.5% | 95.1% |
Format5:Format4基础上加入TAPT | 95.0% | 95.6% | 95.2% |
除此之外top方案中还有MRC之类的方案,我们在其他的多分类任务中再做尝试。这里的方案梳理更多是对模型结构,建模范式,数据处理方案的讨论,像Ensemble,不同预训练模型选择一类的细节,大家感兴趣可以去看Repo中梳理的Top方案~
NLP手札1. 金融信息负面及主体判定方案梳理&代码实现的更多相关文章
- git常用操作 配置用户信息、拉取项目、提交代码、分支操作、版本回退...
git常用操作 配置用户信息.拉取项目.提交代码.分支操作.版本回退... /********git 配置用户信息************/ git config --global user.name ...
- NLP(七) 信息抽取和文本分类
命名实体 专有名词:人名 地名 产品名 例句 命名实体 Hampi is on the South Bank of Tungabhabra river Hampi,Tungabhabra River ...
- MD5( 信息摘要算法)的概念原理及python代码的实现
简述: message-digest algorithm 5(信息-摘要算法).经常说的“MD5加密”,就是它→信息-摘要算法. md5,其实就是一种算法.可以将一个字符串,或文件,或压缩包,执行md ...
- 学习NLP:《精通Python自然语言处理》中文PDF+英文PDF+代码
自然语言处理是计算语言学和人工智能之中与人机交互相关的领域之一. 推荐学习自然语言处理的一本综合学习指南<精通Python自然语言处理>,介绍了如何用Python实现各种NLP任务,以帮助 ...
- 关于Asp.net core配置信息读取的源码分析梳理
概述 我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提 ...
- PCB MS SQL 通过表名查询各字段信息和vb.net C# module类代码
正式表:各字段内容获取 ) SET @tabname = 'ppeflow' SELECT @tabname AS '表名' ,(CASE ))+ ')' )) ) )) + ')' )) ) )) ...
- mongoDB连接信息及生成对应的collection生成代码
.net,个人封装MONGODDB的操作. using System; using System.Collections.Generic; using System.Linq; using Syste ...
- P2P金融
P2P金融又叫P2P信贷,是互联网金融(ITFIN)的一种.意思是:点对点. P2P金融指不同的网络节点之间的小额借贷交易(一般指个人),需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关 ...
- 初学者如何查阅自然语言处理(NLP)领域学术资料
1. 国际学术组织.学术会议与学术论文 自然语言处理(natural language processing,NLP)在很大程度上与计算语言学(computational linguistics,CL ...
- python3 员工信息表
这是最后一条NLP了......来吧 十二,动机和情绪总不会错,只是行为没有效果而已 动机在潜意识里,总是正面的.潜意识从来不会伤害自己,只会误会的以为某行为可以满足该动机,而又不知道有其他做法的可能 ...
随机推荐
- ESX添加过时的硬件
昨天遇到了个ESX上有旧的qlogic的FC卡无法识别的问题.无法识别也就无法连接存储,整个ESX就基本无法使用了.所以,需要检查硬件.一开始,在查了很多资料各种命令检查,走了很多弯路.这里我总结一下 ...
- 使用Gitlab CI/CD功能在本地部署 Spring Boot 项目
前提条件: 1.Docker安装Gitlab,地址:https://www.cnblogs.com/sanduzxcvbnm/p/13814730.html 2.Docker安装Gitlab-runn ...
- 详解JS中 call 方法的实现
摘要:本文将全面的,详细解析call方法的实现原理 本文分享自华为云社区<关于 JavaScript 中 call 方法的实现,附带详细解析!>,作者:CoderBin. 本文将全面的,详 ...
- PAT乙级 1024 科学计数法
思路 1.尝试失败:一开始想打算把结果直接存在一个字符串中,后来发现当指数大于0的时候还需要分别考虑两种情况,工程量巨大,尝试失败,于是借鉴了其他大佬思路,写出了ac代码 2.ac思路:首先取指数的绝 ...
- NSIS 自定义安装界面准确获取安装进度完美解决方案
友情提醒:随着7zip版本快速更新,nsis7z插件已经不能全面兼容新版,使用本例子请将7zip版本降至9.2x以下并下载最新版nsis7z.dll! ------------------------ ...
- python解释器下载及注意事项
python解释器 python解释器下载 python解释器下载官网:https://www.python.org/downloads/windows/ 目前比较常用的python版本有python ...
- 洛谷P3391 文艺平衡树 (Splay模板)
模板题. 注意标记即可,另外,涉及区间翻转操作,记得设立首尾哨兵. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int ...
- POJ2282 The Counting Problem(数位DP)
用dp[pos][val][cnt]表示状态,pos是数位,val是当前统计的数字,cnt是目前统计的目标数字的出现次数 注意状态的转移过程,统计数字0时前导0的影响. 1 #include<c ...
- python基础--简单数据类型预览
为了适应更多的使用场景,将数据划分为多种类型,每种类型都有各自的特点和使用场景, 帮助计算机高效的处理和展示数据.(比如数字用于数学运算.字符串用于信息传递.页面文字展示等) 1.数字类型 整型 ...
- BigDecimal的运算——加减乘除
BigDecimal的运算--加减乘除 1.初始化(尽量用字符串的形式初始化) BigDecimal num12 = new BigDecimal("0.005"); BigDec ...