基于BERT的知识库问答系统(KBQA)

基于BERT的知识库问答系统(KBQA)

简介

知识库问答系统主要要做的两点分别是识别问题中的实体和提取问题中我们需要从知识库中查找的属性,针对这两个方面我采用了NLP预训练模型BERT分别训练了基于BERT-LSTM-CRF的命名实体识别模型(框架来源于https://blog.csdn.net/macanv/article/details/85684284),基于BERT的分类模型,用于匹配问题和知识库三元组中的属性。

数据集

此次使用的数据集来自NLPCC ICCPOL 2016 KBQA 任务集,其包含 14 609 个问答对的训练集和包含 9 870 个问答对的测试集。 并提供一个知识库,包含 6 502 738 个实体、 587 875 个属性以及 43 063 796 个 三元组。知识库文件中每行存储一个事实( fact) ,即三元组 ( 实体、属性、属性值) 。

知识库样例如下,共有43063796行:
在这里插入图片描述

技术方案

刚刚已经提到基于知识库的问答主要可以拆分为两个步骤,问句中的实体识别以及属性映射。在这里插入图片描述

  • 命名实体识别部分采用BERT+LSTM+CRF的方法。
  • 属性映射部分转换成用BERT做二分类的任务。

项目结构

├─.idea
├─bert
│  ├─chinese_L-12_H-768_A-12  # BERT预训练模型
│  └─__pycache__
├─Data
│  ├─DB_Data
│  │  └─clean_triple.csv  # 由tripe_clean.py生成的要存入数据库的文件(把原始三元组处理成csv格式)
│  ├─NER_Data  # 用于训练和测试NER模型的数据,由construct_dataset.py生成
│  ├─NLPCC2016KBQA  #NLPCC2016原始数据
│  │  └─kb
│  ├─Sim_Data  # 用于训练BERT二分类模型的数据, 由construct_dataset_attribute.py生成
│  ├─construct_dataset.py
│  ├─construct_dataset_attribute.py
│  ├─load_dbdata.py  # 数据库查询插入等操作
│  ├─triple_clean.py
├─Output
│  ├─NER
│  └─SIM
├─args.py  #参数设置
├─bert_lstm_ner.py  # NER训练
├─kbqa.py #可以运行的问答系统(目前速度非常慢)
├─kbqa_test.py #进行问答准确率测试
├─lstm_crf_layer.py #lstm+crf模型
├─run_similarity.py #BERT二分类模型(可训练,可预测)
├─terminal_predict.py #NER的预测,可以outline,可以online
└─__pycache__

运行效果

目前效果如下图,由于mysql数据库中直接存入了四千多万条三元组数据,由于我是初学数据库,只是用select来进行暴力搜索,所以速度相当慢,基本回答一个问题要一分钟左右,快的也要半分钟,这是接下来要主要优化的点。
在这里插入图片描述
在这里插入图片描述

TO DO

学习mysql知识,提高搜索效率
目前的属性匹配方式用问题和备选属性做相似度匹配直觉上的感觉不是特别好,可以探索下有没有更快的方法来进行属性匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章