2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

代码框架介绍

笔者此次介绍的代码框架复用性与解耦性比较高。笔者在这里大致说明一下怎么去使用这个框架。对于一个问题,我们首先想的是解决问题的办法,也就是模型构建部分model.py。当模型确定了,那我们就要构建数据迭代器(utils.py)给模型喂数据了,而utils.py读入的数据是preprocess.py清洗干净的数据。

当构建以上这几部分之后,便是模型训练部分train_fine_tune.py,这个部分包含训练、验证F1和保存每一个epoch训练模型的过程。一开始我们训练单模得先确定单模是否有效,我们可以通过train_fine_tune.py的main函数将训练集和验证集都用验证集去表示,看一下验证集F1是否接近90%,若接近则说明我们的模型构建部分没有出错,但不保证我们的F1评估公式是否写错。因此,我们使用刚刚用验证集训练得到的模型,通过predict.py来预测验证集,人工检验预测的结果是否有效,这样子就能保证我们整体的单模流程完全没问题了。

最后就是后处理规则postprocess和融合ensemble两部分,这里的主观性比较强,一般都是根据具体问题具体分析来操作。

其中,utils.py也有main函数,可以用来检验我们构造的Batch数据是否有误,直接打印出来人工检验一下即可。整个框架的超参数都在config.py处设置,加强框架的解耦性,避免了一处修改,处处修改的情况。

整体的框架也可复用到其他问题上,只需要根据我们修改的model.py来确定喂入的Batch数据格式,其他的代码文件也只是根据问题去修改相应部分,降低了调试成本。

详细代码讲解请复制打开以下知乎链接查看~

https://zhuanlan.zhihu.com/p/100884995

代码链接:

https://github.com/ChileWang0228/Deep-Learning-With-Python/tree/master/chapter8

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

2019BDCI互联网金融新实体发现

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

单模成绩第一,最终成绩第二

实践是检验理论的唯一标准。为此,笔者将通过中国计算机学会举办的2019CCF大数据与计算智能大赛互联网金融新实体发现竞赛作为实践,让读者们在了解预训练模型强大的同时,顺便掌握打比赛的流程。

笔者的代码在竞赛中获得了全国第二的成绩,加之笔者的单模成绩在TOP5中最好以及代码的复用性与解耦性强,值得大家学习与借鉴。

赛题分析

赛题要求从提供的金融网络文本中识别出现的未知金融实体,包括金融平台名、企业名、项目名。网络文本包括标题和内容,标题和内容至少有一个不为空。

数据集中的文本长度分布下图所示,文本长度0-500的数据有3615条,超过500的则有6390条。大部分数据文本长度较长。其中文本最短长度为4,最大长度为32787,平均长度为1311。

在训练集中还存在200多条数据有标签谬误。

数据集中出现了部分噪音,包括一些HTML文字和特殊字符。

可以看出,数据集存在文本过长,噪声过多等问题。 

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

数据处理

针对数据分析中提到的噪音及标签谬误等问题,使用了正则表达式定位噪声与标签谬误数据,进而清洗噪声与修正标签谬误。

针对数据分析中提到的文本过长的问题,本团队对金融文本采用了按句子切割的方法,以标点符号优先级对句子进行切割,并按原顺序进行重组,当重组的句子长度超过512时,则新生成一条子数据并对剩余句子重复执行上述过程,直到所有的句子都被组装完成。这种数据处理的方式有效的解决了数据集文本长度过长的问题,并且完整地利用了数据信息。

模型方法

BERT + BILSTM + CRF

BERT + IDCNN + CRF

动态权重BERT + IDCNN + CRF

动态权重BERT + BILSTM + CRF

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

模型融合

上面提到的四种异构单模分别搭载其他预训练模型{BERT_WWM, ROBERTA, ERNIE}得到多种异构单模。

将recall>0.64的异构单模抽出来进行预测,得到每个异构单模的文字结果。

设置阈值 thresh=ensemble_model_num / 3, 当这个实体在thresh个以上的模型出现时,则保留。 

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

后处理规则

对含有标点符号的文字结果进行了一些一般化后处理工作。

"""

场景1:extra_chars = set("!,:@_!,:。[]")  # 直接干掉。

场景2:extra_chars = set("·")  # 在头or尾直接舍弃

场景3:extra_chars = set(".")  # 去头去尾,‘.’在中间,要保证前后都是英文字符,出现中文字符则直接舍弃。

场景4:extra_chars = set("#$¥%+<=>?^`{|}~#%?《{}“”‘’【】")  # 直接替换成''

场景5:extra_chars = set("-&\/&")  # 去头去尾 ‘-’在实体中间是合法实体

场景6:extra_chars = set("()()")   # 若不是对应匹配的括号,括号半边在头与尾,替换成‘’,括号在实体中间则舍弃

场景7:extra_chars = set('、;、')  # split

场景8:删除单字情况和删除训练集存在的实体

"""

删除训练集出现过的实体(赛题规则)。

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

以下是闲聊瞎扯~

南朝四百八十寺,多少楼台烟雨中

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

今日,小编阿璃去了

誉有“南朝四百八十寺”之首寺的古鸡鸣寺

虽然人人都说,鸡鸣寺求姻缘最准

小编还是私心为自己去祈了个学业福

祝自己学业顺利,顺利发sci~

为阿力阿哩哩祈了个事业福

(此人学业上已经不需要祈福了 ̄へ ̄)

祝他能持续高产似那啥~公众号能被越来越多人看到~

也希望一直关注我们的小伙伴们

能在这里学到真正有用的东西

持之以恒,终有收获

大家加油鸭!

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

下期见~

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

关注我的微信公众号~不定期更新相关专业知识~

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

详细代码讲解请点击左下角“阅读原文“查看~

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

内容 |阿力阿哩哩 

编辑 | 阿璃 

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...

#介个系一条开过光的推文#

本文由编辑阿璃一大早在鸡鸣寺花了几杯喜茶钱求的聪慧福气签开光保佑,所以我们一起点击“在看”和GitHub +★★分享福气吧!????

2019BDCI互联网金融新实体发现 | 思路与代码框架分享(单模第一,综合第二)...