知识库问答(knowledge base question answering,KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。
每条数据由4行组成,第一行为问题,第二行为提取好的三元组[实体,属性,答案],第三行为答案:
BertForTokenClassification + crf BertForSequenceClassification
使用的是mysql数据库,数据库命名为KB_QA,表名为nlpccqa
表的内容为:
首先使用BertForTokenClassification分类器对问题进行命名实体识别序列标注得到实体,并通过CRF层学习潜在约束。
- 构建NER数据集
以下面这条数据为例:
标注后的结果为: ['O', 'B-LOC', 'I-LOC', 'I-LOC', 'I-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'] 对应: ['《','高','等','数','学','》','是','哪','个','出','版','社','出','版','的','?']
-
BertForTokenClassification+CRF训练
- 具体操作
使用BertTokenizer.encode_plus()函数得到[input_ids,token_type_ids],并在此基础上得到[input_ids,attention_mask,token_type_ids]。 labels_ids通过NER数据集得到。 最终形成每一条数据的input为:[input_ids,attention_mask,token_type_ids,labels_ids]
- 模型
因为BertForTokenClassification得到的是概率:
所以使用CRF来学习一些潜在的约束规则:
- 结果
训练:
测试:
对于一个问题,如果前一步得到的实体存在于数据库中,且数据库中的属性也存在于问题中,那即得到了回答,但属性可能和问题中的提法不一致,所以使用BertForSequenceClassification进行相似判断
最终结果
(1)对于数据库有的实体且属性存在于问题中,直接从数据库得到答案:
(2)对于数据库有的实体,属性不一致:
(3)对于数据库中不存在的实体: