任务介绍

知识库问答(knowledge base question answering,KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知识库进行查询、推理得出答案。

数据格式介绍

每条数据由4行组成,第一行为问题,第二行为提取好的三元组[实体,属性,答案],第三行为答案:

image

模型选择

BertForTokenClassification + crf BertForSequenceClassification

流程

构建数据库

使用的是mysql数据库,数据库命名为KB_QA,表名为nlpccqa

image

image

表的内容为:

image

BertForTokenClassification+CRF

首先使用BertForTokenClassification分类器对问题进行命名实体识别序列标注得到实体,并通过CRF层学习潜在约束。

  • 构建NER数据集

以下面这条数据为例:

image

标注后的结果为: ['O', 'B-LOC', 'I-LOC', 'I-LOC', 'I-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'] 对应: ['《','高','等','数','学','》','是','哪','个','出','版','社','出','版','的','?']

image

  • 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得到的是概率:

    image

    所以使用CRF来学习一些潜在的约束规则:

    image

    • 结果

    训练:

    image

    测试:

    image

BertForSequenceClassification

对于一个问题,如果前一步得到的实体存在于数据库中,且数据库中的属性也存在于问题中,那即得到了回答,但属性可能和问题中的提法不一致,所以使用BertForSequenceClassification进行相似判断

  • 构建SIM数据集

    • 具体操作

    每一条数据都找五个不同的属性当做负例。 还是以上文的高等数学为例:

    image

    • 结果

    每一个正例,有五个负例。

    image

  • BertForSequenceClassification训练

image

最终结果

image

实验结果

(1)对于数据库有的实体且属性存在于问题中,直接从数据库得到答案:

image

(2)对于数据库有的实体,属性不一致:

image

(3)对于数据库中不存在的实体:

image