CCKS2019-面向金融的事件主题识别思路分享
1.题目概述
本次赛题的本质是nlp的阅读理解,由于本次比赛可以使用预训练模型和外部语料库,因此如何选择预训练模型以及如何对模型输出的概率进行答案提取就成为了比赛的关键,本文针对预训练模型的选择和使用以及提取规则的使用进行说明。
本次题目每个训练集样本由四部分组成“样本id”,“文本句子”,“事件类型”以及“事件主体”作为标签,事件主题就是从文本句子中筛选出来的。比赛的评分指标是F1,就是一个样本你可以预测多个事件主体,和真实的事件主体比较,考虑召回率和准确率的协调。这个F1应该是以词作为对应指标的,而不是字;
2.方法探索
在不借助任何语料库和预训练模型,自己搭一个带多头注意力机制的w2v,然后靠这1.4w的数据集去训练,结果很一般,因为数据太少了,a榜只有83.4左右;然后思考自己找语料库(搜狗新闻)去训练词向量,由于机器和时间因素本人没有尝试;最后就是使用预训练模型进行迁移学习,这里选取的是谷歌提供的bert模型进行微调,用的是其官方训练的中文词向量;然后根据规则过滤一些答案,大致成绩是a榜单模89.8,b榜78.3;经过和其他模型的融合,最佳成绩为榜92.6和b榜82.8左右,最终rank17.
3.用bert模型进行迁移学习
本赛题属于nlp任务中的阅读理解,bert在其相关的领域表现出色,这里就使用迁移学习的思想对bert预训练进行微调,为了代码简介,这里使用keras来表现:
bert_model = load_trained_model_from_checkpoint(config_path, checkpoint_path, seq_len=None)
j = 0
for l in bert_model.layers:
l.trainable = True
x1_in = Input(shape=(None,)) # 待识别句子输入
x2_in = Input(shape=(None,)) # 待识别句子输入
s1_in = Input(shape=(None,)) # 实体左边界(标签)
s2_in = Input(shape=(None,)) # 实体右边界(标签)
x1, x2, s1, s2 = x1_in, x2_in, s1_in, s2_in
x_mask = Lambda(lambda x: K.cast(K.greater(K