2020 CCF BDCI 非结构化商业文本信息中隐私信息识别TOP5方案

1 写在前面

 在本次CCF BDCI的非结构化商业文本信息中隐私信息识别比赛中,我们团队水煮毛血旺在初赛A榜B榜排名第六,侥幸进入了决赛,最终排名第五。
 在经历了接近两个月的比赛,常常都在自我怀疑中,一度想要放弃,最后还是很感谢我的队友,感谢我的队长,一路带领我们拿到第五名的成绩。

2 团队介绍

队名:水煮毛血旺

  • 蒋诗琪 重庆邮电大学 研一
  • 周继聪 重庆邮电大学 研一
  • 李政 华中科技大学 研一

3 赛题介绍

 赛题链接:https://www.datafountain.cn/competitions/472

 本赛题目标是要从大量的新闻文本中,提取出14类实体词,简单来说是一个标准的中文命名实体识别任务。本文主要从数据层面和算法层面来对该问题提出多种解决方案。首先在数据上,我们使用了Sliding Window,对每条文本进行了长度滑窗与句子滑窗,来提升每条数据中蕴含的信息量。并且使用了数据增强,增加了数量很少的类别实体。在算法层面,我们使用了哈工大开源的预训练模型RoBERT和华为开源的预训练模型NEZHA结合word embedding与多层表示的动态权重融合,将预训练模型输出的向量通过softmax和crf解码层,解码出最终的实体。我们也使用了MRC+指针网络和Cascade级联网络的方式作为补充模型,同时对loss的计算方式进行了修改,来平衡指标的准确率和召回率。为了防止过拟合,我们团队在训练过程中采用了余弦退火、SWA随机权重平均和对抗训练,并将BERT每一层的学习率设置为逐层递减。模型融合的策略采用了快照集成与投票融合,最终复赛成绩A榜F1值为0.9081,排名第六,B榜F1值为0.9050,排名第六。

4 数据分析与处理

 本赛题的文本数据来自网上的一些新闻,贴吧等地方,本身在标注的过程中存在很多错标漏标等情况,由于赛题的测试集和训练集一般是趋于同分布的,所以对训练集进行数据清洗会让线上分数下降,所以在数据方面我们团队在经过多次分析以后,就没有进行清洗操作。只是简单的引入了CLUE数据集,然后对CLUE的短文本进行了拼接,保证CLUE数据集的引入不会对原始训练集造成过多的不利影响。

4.1 数据处理

 因为CLUE的数据集大部分文本长度都在50以下,而原始训练集的长度很多都超过了100。所以我们对CLUE的数据集进行了拼接,拼接的时候采用了两种策略。

  1. 按照固定最大长度进行拼接,在拼接的时候固定一个最大长度值,每次拼接后都进行判定是否超过了这个最大长度,若没有,则继续拼接下一条文本,否则拼接完成。
  2. 按照固定文本数进行拼接,把固定数字的文本条数进行拼接,可能会有些数据拼接起来会很长,也要一些可能会拼出来很短,长度会不平衡,但是这种不平衡也在原始的训练集中出现了,所以这种拼接方式更好的将CLUE数据集类似为了原始的训练集。

4.2 数据划分

 由于本赛题提供的数据量很小,加上CLUE只有几千条数据,而最终要预测的实体类别有14种。同时文本长度有一些相对比较长,数据输入到设备中会带来很大的训练压力。所以我们对此提出了两种Sliding Window策略。

  1. 基于长度滑窗,该滑窗方式通过设定step大小和window的大小来进行滑窗,每一步都移动step长度的window,并且在滑动的过程中采取区域重叠滑动,这样就不会出现把实体词分离开的情况。这样就把长文本全部变成了短文本,并且将一条文本分离开,变成了多条文本,让实体词在不同的语境下都能得到充分的训练。
  2. 基于句子滑窗,这种滑窗方式按照标点符号来划分句子,每次滑动的步长则是一个标点符号的距离,同样也采用区域重叠滑动。整个这种方式极大的增加了数据量,原来几千的训练文本可以翻3倍。并且由于训练集本身数据也是多条短文本拼接而得到的,所以这种方式可以把原来脏乱的数据给划分开,让实体词的边界更加清晰。

4.3 数据增强

 针对赛题中出现类别不平衡问题,我们团队采用了数据增强的方式来进行解决。数据中的qq、vx、mobile、email四个类别的实体相比其他类别少很多,所以模型在预测这几个实体的效果相对会差一点。所以我们对这四类实体采取的数据增强,在原始数据出现了这几类实体的数据中进行随机替换,替换以后的文本作为新的数据添加的训练集中。这种方法让训练的数据量增加了几百条,并且这四个类别的实体个数也增加了很多,模型在这几个类别的表现也有不俗的提升。
 除此以外,我们还使用了伪标签的方式来进行无监督学习,我们引入的CLUE数据集包含了一个没有打标的测试集,我们使用模型对这个测试集进行了实体提取,并把其中置信度较高的一些数据加入到训练集中。深度学习一般可以容忍10%的噪声,所以加入的数据虽然会有少量噪声,但对模型整体来说几乎不影响,最终模型的效果也得到了一些提升。

5 模型方案

5.1 基于Weight of Loss的MRC+指针网络

 该方案主要是使用阅读理解的方式来完成实体识别任务。MRC任务一般的做法是给定一段文本和问题,在文本中抽取出问题的答案,这种范式和NER的结果非常相似,都是抽取出一个文本的span。只是NER任务本身是没有问题的,所以在构建模型之前需要重新构建训练集。
 比如要提取人名这一类别时,首先手动构造一个问题,比如”请找出下面的句子中出现的人名”,然后再把每一条训练集拼接在这个问题之后,并且该条数据的标签只保留出现的人名实体。这种方案下,因为一共有14个类别,所以需要构造出14个类别的问题,并且每一条文本都要重复拼接在这14个问题后。
 在使用了MRC的方式后,解码方式也就不能再使用CRF,而是使用指针网络,每一条数据都定义两个标签,start point和end point,在标签中如果该字不为实体的起始位置,那么这两个标签都为0,否则就为1。而最后解码的时候就寻找对应位置start point后面的end point,两个位置中间的字就是预测出来的实体词。模型结构如下图所示:

在这里插入图片描述

 这种方案还需要对loss进行修正,因为我们构造的问题其实是不应该计算loss的,所以在输入之前需要把前面这部分问题的位置mask掉。而且对于该模型来说,标签为0的数据占据大多数,所以采用了focal loss[1]来对损失值进行优化。
 但这种MRC的方式来做NER任务,数据会增加很多倍,训练成本大大增加了。所以我们团队在这个基础上进行了改动。不再重新构造数据集,start point和end point也不再做2分类,而是直接做14分类,这样一条数据就可以直接把所有类别的实体词都提取出来。
 因为该赛题的评价指标是F1 score,主要影响因素有Precision和Recall,一般来说提升Precision,Recall就会下降,所以我们采用Weigh of loss调整了两者的权重,让F1 Score可以达到最大化,并且我们这种方案可以针对不同的场景进行优化,比如有些场景要求准确,不允许出错,我们也可以通过这种方式来增加Precision,在工程上更具有实用价值。
 这种方法主要是通过控制mask来控制loss的权值,如果模型没有识别到一个本应该识别到的实体,就增大对应的 Loss,加重对模型的惩罚;如果模型识别到了一个不应该识别到的实体,就减小对应的 Loss。具体实现的模型结果如下图所示:

在这里插入图片描述

5.2 基于Cascade级联网络的多任务NER

 由于本赛题的数据类别有14种,传统方法采用BIO打标的时候会出现很多类别,相当于在每个字上都做了一次分类数很多的分类任务。所以我们在此基础上,采用了Cascade级联网络[2],把NER改为了一个多任务学习的框架,一共分为两个任务,一个任务用来抽取实体,另一个任务用来判断实体类型。模型结构如下图所示:

在这里插入图片描述

 Cascade级联网络简单来说就是锁定对应关系,在第一步得到实体识别的结果以后,返回到BERT输出的一层中,使用各个实体词的表征向量,送入到全连接层进行分类,判断出实体类型。具体来说就是每个字无论是不是属于实体词,都送入到全连接层中,做实体类型分类,然后计算出每个字的loss。在把非实体词的loss给mask掉。在最后解码预测的时候,把每个实体最后一个字对应的分类结果,作为该实体词的实体类型。
 这种方案让BIO词表得到了很大得缩减,CRF层的运行时间相比之前快了很多倍。

5.3 基于Word-Level Feature的BERT+CRF

 这一种方法中我们主要采用了哈工大开源的预训练模型RoBERT和华为开源的预训练模型NEZHA来做为基模型,在解码层使用了CRF。在此基础上,我们针对本次赛题,加入了一些其他的改动。

5.3.1 多层表示的动态权重融合

 由于Ganesh Jawahar等人通过实验验证了BERT每一层对文本的理解都有所不同[3]。所以我们在此基础上对BERT生成的表示进行了改写。把BERT每一层的Transformer Encoder输出的表征向量都赋予一个权重,然后通过训练来确定这个权重值,最后把每一层的表征向量加权平均,再通过一层全连接层完成降维。再去结合其他下接网络结构,完成最后的输出。具体计算公式如下图所示。

在这里插入图片描述

 这种多层表示的动态权重的融合方式可以让模型把不同层学到的文本理解都结合起来,相比直接输出效果更好。

5.3.2 Word-Level Feature

 在中文实体识别任务中,一般都是基于character-level来做的,因为中文识别不像英文一样是自动分词的,需要借助一些分词工具,但这种分词工具本身就会带来一定的误差,导致最终的实体可能被拆分。但是实际上中文词语中蕴含的信息也是非常重要的,所以我们团队通过把词和字分别通过embedding matrix做表征,然后结合两种表征向量,再通过下接网络结构,完成预测。
 在结合词向量的时候,我们考虑了两种方案。

  1. 第一种方案是使用训练好的词向量,按照字与词的对应关系,直接把词向量作为特征拼接在BERT的输出层上,模型结构如图3所示,实现起来很简单。但是这种方案在结合各个词嵌入时容易丢失部分语义信息,并且分词也容易将实体词分开。

在这里插入图片描述

  1. 另一种是使用Simple-Lexicon[4]通过BMES标签来融合词汇信息。对每一个字,都在词典中匹配以该字为开头,中间,结尾的词,把这些词的词向量做加权平均,作为特征。然后再与BERT输出的向量进行结合,这种方案就成功利用了句子的语义信息,并且不需要进行分词,效果相对第一种方案更好。

在这里插入图片描述

6 最终方案

 在上面的方案之中,我们还在训练模型的过程中加入了一些技巧,比如用余弦退火、对抗训练和BERT逐层学习率降低来防止过拟合,用SWA随机权重平均来寻找全局最优值,利用快照集成在一个方案中集成多个不同最优模型等等。
 我们使用的模型方案相对比较多,最终对三种方案各自的优缺点进行了对比。第一种方案在最后的评价指标上进行了权重调整,相比另外两种方案更有实际工程价值,但最终的单模效果相比另外两种方案要差一点。而第二种方案训练速度非常快,单模效果相比第一种方案也略微有点提升。而第三种方案作为我们的主力方案,因为融合了word-level特征,加入了很多训练时的trick,单模效果也是最好的。
 最终我们采用了十折交叉验证的方式,再融合多个模型进行投票,投票的结果就得到了我们最终的线上成绩。

参考文献

[1]Lin T Y , Goyal P , Girshick R , et al. Focal Loss for Dense Object Detection[C] 2017 IEEE International Conference on Computer Vision (ICCV). IEEE, 2017:2999-3007.
[2]Wei Z , Su J , Wang Y , et al. A Novel Cascade Binary Tagging Framework for Relational Triple Extraction[C] Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. 2020.
[3]Jawahar G , Sagot B , Djamé Seddah. What Does BERT Learn about the Structure of Language?[C] Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics. 2019.
[4]Ma R , Peng M , Zhang Q , et al. Simplify the Usage of Lexicon in Chinese NER[C] Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. 2020.