赞
踩
前面五篇博客主要探究了QG(Question Generation)任务的基本策略、评价指标;描述了我的初步探索;以及给出了数据处理的方法以及训练模型的构建方法;最后针对训练好的模型生成“问答对”:
在前面步骤中,使用问题生成器生成的系列问题可能存在很多无效的问题。
另外,在抽取答案作为模型的输入时,我采取一种极为单纯的策略,即直接抽取实体,将其作为答案,这就导致有些被抽取的实体可能是不适合用于提问的。
归纳无效的Q-A对的基本特征,主要有下面三种:
我在这里使用BERT搭建了一个文本分类器,对任意输入的问答对(均由前面NEZHA + UniLM模型生成),预测其是否为有效问题。
输入:
输出:
对这个文本分类器而言,训练数据中的“正类”和前面模型所用的训练数据完全一致,但是去除掉上下文部分(Q-A对的类别标签都为1)。
而“负类”则需要我自己重新构造。
结合了上文分析的“无效的Q-A对的基本特征”,我最终采取了下面三种方式构造出负类:
下面是训练数据基本构造方法:
import json import random data = [l["annotations"] for l in json.load(open('./train.json', 'r', encoding='utf-8'))] all = [] for l in data: all += l label_T = 10000 label_F_extr = 5000 label_F_sh = 5000 index = [int(len(all) * random.random()) for i in range(label_T)] index_1 = [int(len(all) * random.random()) for i in range(label_F_sh + label_F_extr)] index_2 = [int(len(all) * random.random()) for i in range(label_F_sh)] str_l_T = [] for i in index: str1 = '[CLS]' + all[i]['Q'] + '[SEP]' + all[i]['A'].replace('\n', '') + '[SEP]' str_l_T.append(str1) str_l_F = [] for i, j in zip(index_1, index_2): str1 = '[CLS]' + all[i]['Q'] + '[SEP]' + all[j]['A'].replace('\n', '') + '[SEP]' str_l_F.append(str1) for i in range(label_F_extr): m = all[i + label_F_sh]['Q'] str1 = '[CLS]' + m + '[SEP]' + m[:int(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。