ccf-bdci 互联网金融新实体发现9st 赛题基础收获总结

写在前面

这场比赛真的是旷日持久,从8月25开始,直接干到11月下旬。当然我是从国庆才开始参赛。由于主办方延长比赛时间,我甚至付出了专业课凉凉的代价(当然,不是挂科hhh),每天基本深更半夜不睡觉(有的时候打扰到舍友了,对不起┭┮﹏┭┮)。但是这次比赛真的收获颇丰,经验值估计比我大二一整年涨的都多。还有,真的,真的很感谢我的队友,人真的超级nice nice nice,在我刚进比赛还是个小白的时候没有嫌弃我,把自己攒的赛题经验仔仔细细全给我讲了一遍,工作忙的时候也在坚持着打比赛,每天都能和我交流一下,最终我们俩人两套方案互补,算是冲进了前十。这个比赛是我真正意义上第二次参赛,也是我第一个拿到前十的比赛。


赛题描述:

提取出每篇文章中所有的金融新实体,
例如某篇文章的文本如下(此处只做示例,实际每篇文章文本长度远远大于以下示例):
度小满金融在首次发布的《科创板基金》中提到,今年前5月,京东金融的股票迅速升值。
那么该篇文章对应的金融新实体列表为:度小满金融;科创板基金。
由于京东金融是知名的(金融)实体,所以“京东金融”并不算新实体。

个人理解:

结合出题方是“国家互联网应急响应中心”来看,这个赛题的目的实际上是找那种类似校园贷的实体(其实就是不知名的金融实体)。
整个赛题要把握住的重点是:
①这个赛题实际上偏向于“领域词抽取”(主要针对的是金融领域),但实际上却又不失关键词抽取的要素。
②注意把握赛题要求中“新实体发现”的“新”,题目中说明了:持有金融牌照的银行、证券、保险、基金等机构、知名的互联网企业如腾讯、淘宝、京东等认为是已知实体(即不能让这些已知实体出现在最终预测结果中)。


方案细节

我的方案具体逻辑思路和代码已经放到我github上了,欢迎star
https://github.com/gaozhanfire/CCF-BDCI2019_Entity_Discovery
在这里我只说一下本方案的重点、思考与可以改进的地方。

由本次比赛得到的一些基础知识

数据清洗方面:

  • 不要,不要,不要洗的太干净!!
    这点在我做情感那个赛题的时候深有体会:
    我记得我当时清洗非常细节,细节到啥程度呢,有的标点是英语里的标点,如“,”(还有其他的一些汉语符号),我把这些英语标点都统一归一到了汉语的标点。我把什么特殊符号啊、html标签啥的都去掉了,还有停用词也去掉了!!这些操作竟然让我掉了3个千分点。个人觉得是bert已经足够强大了,他可以分辨出那些网页标签、特殊符号之类的,并且能够在其中提取出一些信息。(我最一开始实际上是把所有标点符号直接暴力去掉了,这样效果更懒)

BIO和BIOES

如我github中写的一样,BIO标注,预测结果里有好多好多断开的词(小米钱包被标成BOII),要不就是预测多了(小米钱包被标成“小米钱包的”),听了队友的推荐,我把bio换成了BIOES,真的提升了一些,我把这个归结于BIOES的标注字符更多,模型对分类边界的划分更加清晰明确。(和crf转移矩阵是不是有关系我还正在研究)

bert预训练与fine-tune

这两个过程是不一样的!!!!
就拿普通的word2vec举例,我们打比赛的时候常常先用gensim来训练一个word2vec,然后用训练好的embedding去接一个全连接层之类的,反向传播,如果不固定embedding权重的话,在反向传播的过程中,不仅会更新全连接层参数,还会更新embedding的权重!!!。
这实际上是分有两个过程的
①训练一个word2vec,这实际上称为“预训练”过程
②使用训练好的word2vec,接全连接做分类任务训练,更新word2vec,这个过程才是“fine-tune”

我看到有人说,反正有已经训练好的bert权重,直接拿过来,只用下游任务做finetune就可以了,不用费时间去用新数据再练一下bert(预训练),这实际上是错误的!!!
预训练不仅可以用来使原来预训练好的模型更加适应你的场景,更是因为在预训练的时候你不仅可以用训练集的数据,还可以用测试集的数据!!而你用下游任务更新embedding,只能用训练集来更新。

预训练是非常非常重要的,好的预训练方式以及预训练时设置的参数能在embedding重新加入到模型后让模型效果变得更加稳定。

bert的下游模型选择以及是否要finetune

这个真的没办法凭经验来说,比如初赛的时候我队友的简单全连接就是要比我的bilstm要好,因为bert这个语言模型本来就非常强了,有的时候下游设计的更复杂甚至会带来反效果。所以,像这种允许用bert的比赛,我们只能不断的去测试不同的下游模型!!!

关于特征work不work的问题

本次比赛初期,我设计了一个lgb模型,
模型输入的负样本是{京东、阿里、腾讯、百度……}这样的知名实体集在文本中提取出来的特征。
一开始的时候,我提取了很多特征,比如“京东”在文本中的tfidf、在文本中的位置平均位置、词的长度、文章的主题特征(lsi)等等,然后上了一个百分位,效果非常好。
后来有一天我突然想去掉一些特征,把词在文本中的位置、词的长度、lsi都去掉了,只留下了tfidf、tfidf在文章中所有词的排名特征,发现效果比原来更好了。这说明那些平均位置、文章主题等特征都是没用的。
我想去掉这些特征的原因,是:我做这个模型的目的,是为了去去掉这些知名实体(肯定不是金融新实体的实体),像‘京东’这个实体在文中的各个地方都有可能出现,且我的知名实体集里也就 京东、腾讯、阿里、百度、AI……这么几种固定的实体,他们的词长固定也就这么几种。数据的种类非常少,且造出来的特征和我们的任务目标不符合(专业一些来说就是特征与目标分布相关性较小),这在一定程度上限制了特征的发挥。所以,决定特征能否发挥作用的不只有特征的意义,还有数据的多样性,数据分布都会决定特征是否能够发挥作用。

关于“规则”的方法:

记住:大多数的规则都可以转化成对应的特征!
比如这次比赛里,队友写的一条规则:去掉一篇文章预测出来的实体中,在文章中出现频次最低的词比频次最高的词 频次差出10以上的。
这个就可以写成我github中写的“组特征”

但是,如果把规则单独拿出来写脚本,由于规则是独立、固定的,所以他和模型比可能会有很大的差异性,常常可以用规则来预测,之后和模型的结果做融合。

关于模型的参数:

这真的是我这次比赛收获最深的一点:
有参数 lstm的维度,根据高校赛的经验,最一开始我设置了512,比较大,后来偶然改成了256,发现线上有三个千分点的提升,后来改成了128,又来了三个千分点的提升。这说明不是神经元越多越好,而是要根据数据规模‘因地制宜’
同时,epoch、batch_size都会影响模型的效果:比赛后期,我将原本训练轮次为40,调整到了10,便有了几个千分点的提升,后来把10改成1(即只训练1轮),竟然又有了几个千分点的提升,说明在小数据量下,一定要注意训练轮次的控制!
同时 batchsize从512一直调至32,也获得了很大的提升。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值