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了......来吧 十二,动机和情绪总不会错,只是行为没有效果而已 动机在潜意识里,总是正面的.潜意识从来不会伤害自己,只会误会的以为某行为可以满足该动机,而又不知道有其他做法的可能 ...
随机推荐
- SpringBoot使用libreoffice转换PDF
1.简介 有时候我们需要在程序中使用到office的转换和预览功能,本文就针对这个需求记录了较为简单的office转换和功能:jodconverter.当然也有aspose和其他开源第三方(kkfil ...
- 《网页设计基础——HTML常用标签》
网页设计基础--HTML常用标签 一.网页框架: 格式: <html> <head> <title>网页标题</title> <sty ...
- centos 安装mysql 8.0
在home下新建一个mysql文件夹 cd /home mkdir mysql cd mysql 1.首先上传文件,把文件传到 /home/mysql下 链接:https://pan.baidu.co ...
- Ubuntu转到root用户后用户名路径没有颜色
看到好多都直接把普通会用户的.bashrc配置复制到root家目录下,由于本人小白,很多.bashrc配置看不懂,也不敢随便修改.于是找到别的配置方法. 普通用户的os@a:~$和root用户的roo ...
- POJ2104 K-th number (整体二分)
刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...
- springmvc 上传文件时的错误
使用springmvc上传文件一直失败,文件参数一直为null, 原来是配置文件没写成功. <bean id="multipartResolver" class=" ...
- Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这 ...
- 【UML】统一建模语言
如果是准备学习设计模式的同学,可以只了解类图相关的知识 而如果是在准备软件设计师考试的同学,或许会对你有点帮助 正在施工...... 参考博客:https://blog.csdn.net/unique ...
- JUC中的AQS底层详细超详解
摘要:当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒? 本文分享自华为云社区<JUC中的AQS底层详细超详解,剖 ...
- SQL中事务以及全局变量的使用
事务的定义 简单的说,事务处理可以用来维护数据库的完整性,保证一批SQL语句要么全执行,要么全部不执行 事务的特性 原子性 一致性 持久性 隔离性 注:一元九个 事务的使用 sel ...