本人认为学习一样东西,直接上手跑实验是最有效提升的方法之一。看了那么多的理论介绍文章,抽象的说辞,最后还是似懂非懂。所以,直接上手数据集跑实验,与理论结合,能有更深刻的了解。同时也记录下学习 KBQA 的过程,也希望对同入门的同学有些帮助。
引言
本人最近在做 KBQA 相关的的工作,有些大致的了解和想法后希望能够在实验中学习更多。
目前研究的 KBQA 暂时专注在简单知识库问答上:即根据一个问题,抽出一条三元组,生成 Sparql 语句,进而进行知识图谱查询返回答案。
最终选择了 NLPCC2016KBQA 数据集,基线模型采用 BERT。
数据集介绍
NLPCC 全称自然语言处理与中文计算会议(The Conference on Natural Language Processing and Chinese Computing),它是由中国计算机学会(CCF)主办的 CCF 中文信息技术专业委员会年度学术会议,专注于自然语言处理及中文计算领域的学术和应用创新。
此次使用的数据集来自 NLPCC ICCPOL 2016 KBQA 任务集,其包含 14,609 个问答对的训练集和包含 9870 个问答对的测试集。并提供一个知识库,包含 6,502,738 个实体、 587,875 个属性以及 43,063,796 个三元组。
知识库文件中每行存储一个事实(fact),即三元组 ( 实体、属性、属性值) 。各文件统计如下:
知识库样例如下所示:
原数据中本只有问答对(question-answer),并无标注三元组(triple),本人所用问答对数据来自该比赛第一名的预处理:
http://github.com/huangxiangzhou/NLPCC2016KBQA
构造 Triple 的方法为从知识库中反向查找答案,根据问题过滤实体,最终筛选得到,也会存在少量噪音数据。该 Triple 之后用于构建实体识别和属性选择等任务的数据集。
问答对样例如下所示:
数据集本身存在的问题
知识库实体间的歧义
以“贝拉克·奥巴马”为例,涉及该实体的问答对如下:
在知识库中查询包含该实体的三元组,结果如下(部分):
首先,知识库中存在“贝拉克·奥巴马”的多条实体,有可能是多数据来源的融合或其他原因,从而并不能完全保证信息的对齐。我们查看“妻子”这一属性,发现有的是“米歇尔·拉沃恩·奥巴马”有的是“米歇尔·奥巴马”,而我们问答对中给出的答案是“米歇尔·奥巴马”。因此当我们的模型检索到正确三元组时:
虽然在实体和属性都映射正确的情况下,最终答案仍可能被判定为错误。
问题中的实体歧义
以“博士来拜”为例,涉及该实体的问答对如下:
在知识库中查询包含该实体的三元组,结果如下(部分):
问句中的问题是:“博士来拜是什么年代的作品?“,涉及到”年代“这个属性,而这幅作品被不同时期的很多人创作过,我们无法从当前问句下得到要询问的是哪位艺术家的创作年代。
因此该问题的涉及的实体具有歧义性,同样的,当模型检索到我们认为的正确实体和正确属性后,依然有可能会被判定为错误答案。
在知识库中相关实体三元组数量过多的情况下,对检索模型的效果、效率也是个挑战。
在具有 4300W 条三元组的知识库中,同一个实体会检索出大量(几十、几百条)的相关三元组,而且在存在上述两个歧义性问题的情况下,识别的效果和效率都是很大的问题。
以上的两个问题在实体识别实验部分和属性抽取部分的影响较小,但在实体链接知识库检索最终答案三元组的部分会有较大的影响。
数据集预处理及实验结果
清洗训练数据、测试数据、知识库
过滤属性,去除‘-’,‘•’,空格等噪音符号,同时把每一行 lower() 转成小写。
分别保存为:train_clean.csv, test_clean.csv, nlpcc-iccpol-2016-clean.kbqa.kb。
构造开发集
原始训练集数量为 14,609,Shuffle 后抽出 2609 作为开发集,其余作为训练集,如下。
分别保存为:train_clean.csv, dev_clean.csv, test_clean.csv。
构造实体识别的训练集、开发集、测试集
构造实体识别数据集需要根据三元组-Enitity 反向标注问题,给 Question 打标签。由于我们希望从单问题中抽取单个实体,并未采用 BIO 的标注,直接采用 0/1 标注法,即 0 表示非实体,1 表示实体。
同时需要确保其实体完整出现在问题中,对于未出现的样例,我们直接删除忽略。错误样例如下所示:
过滤后的数据集信息如下:
过滤后的数据集样例如下所示:
分别保存为:entity_train.csv, entity_dev.csv, entity_test.csv。
基于 BERT+BiLSTM+CRF 模型的实验结果如下所示,其中 accuracy 是从 9556 个问句识别出完全匹配实体的准确率。
未完全匹配的实体样例如下,部分是识别错误,部分是同义词,部分是噪音问题。
构造属性抽取的训练集、开发集、测试集
1. 构造测试集的整体属性集合,提取+去重,获得 4373 个属性 RelationList;
2. 一个 sample 由“问题+属性+Label”构成,原始数据中的属性值置为 1;
3. 从 RelationList 中随机抽取五个属性作为 Negative Samples。
数据集大小如下:
数据集 samples 如下:
分别保存为:relation_train.csv, relation_dev.csv, relation_test.csv。
之前构造的数据进行训练,在这个测试集上测试的结果。基于BERT的训练结果如下所示,其中 accuracy 是真正的准确率。
模型没有识别出的测试样例如下,可以看出缺少深度语义匹配的能力。
结束语
之后也会把相关代码和预处理数据开源到我的 Github 上:https://github.com/supergyz