首页 > 其他分享 >从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

时间:2023-07-27 22:13:34浏览次数:40  
标签:21 图谱 self 实体 KBQA 乙肝 answer query

从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。

  • 项目效果

以下两张图是系统实际运行效果:

1.项目运行方式

运行环境:Python3
数据库:neo4j
预训练词向量:https://github.com/Embedding/Chinese-Word-Vectors或https://pan.baidu.com/s/14JP1gD7hcmsWdSpTvA3vKA

1、搭建知识图谱:python build_grapy.py。大概几个小时,耐心等待。
2、启动问答测试:python kbqa_test.py

部分代码展示:

from entity_extractor import EntityExtractor
from search_answer import AnswerSearching


class KBQA:
    def __init__(self):
        self.extractor = EntityExtractor()
        self.searcher = AnswerSearching()

    def qa_main(self, input_str):
        answer = "对不起,您的问题我不知道,我今后会努力改进的。"
        entities = self.extractor.extractor(input_str)
        if not entities:
            return answer
        sqls = self.searcher.question_parser(entities)
        final_answer = self.searcher.searching(sqls)
        if not final_answer:
            return answer
        else:
            return '\n'.join(final_answer)


if __name__ == "__main__":
    handler = KBQA()
    while True:
        question = input("用户:")
        if not question:
            break
        answer = handler.qa_main(question)
        print("小豪:", answer)
        print("*"*50)

2.医疗知识图谱

数据源:39健康网。包括15项信息,其中7类实体,约3.7万实体,21万实体关系。

本系统的知识图谱结构如下:

1.1 知识图谱实体类型

实体类型 中文含义 实体数量 举例
Disease 疾病 14336 乙肝,癫痫
Alias 别名 8877 小儿褐黄病综合征,广疮
Symptom 症状 5622 手足烦热,四肢麻木
Part 发病部位 82 手部,上肢
Department 所属科室 82 感染科,外科
Complication 并发症 3201 落枕,流感
Drug 药品 4625 西黄胶囊,司帕沙星
Total 总计 36825

1.2 知识图谱实体关系类型

实体关系类型 中文含义 关系数量 举例
ALIAS_IS 别名是 52578 癫痫 别名是 羊角风
HAS_SYMPTOM 症状有 62105 乙肝 症状有 肝功能异常
PART_IS 发病部位是 26660 乙肝 发病部位是 肝
DEPARTMENT_IS 所属科室是 33867 乙肝 所属科室是 传染科
HAS_COMPLICATION 并发症有 25183 乙肝 并发症有 肝硬化
HAS_DRUG 可用药品 35914 乙肝 可用药品 恩替卡韦分散片
TOTAL 总计 210018 约210018对关系

1.3 知识图谱疾病属性

疾病属性 中文含义 举例
age 发病人群 老人,小孩
insurance 是否医保 医保
infection 是否传染 有传染性
checklist 检查项目 肝功能检查
treatment 治疗方法 药物治疗、心理治疗
period 治愈周期 一周
rate 治愈率 0.1%
money 费用 1000-2000元

3.问题意图识别

基于特征词分类的方法来识别用户查询意图

意图类型 中文含义 举例
query_disease 查询疾病 肝肿大是什么病
query_symptom 查询症状 慢性乙肝有什么表现
query_cureway 查询治疗方案 肚子一直痛怎么办
query_checklist 查询检查项目 乙肝需要做哪些检查
query_department 查询所属科室 乙肝去哪个科
query_rate 查询治愈率 乙肝能治好吗
query_period 查询治愈周期 乙肝多久能治好
disease_describe 查询疾病所以属性 慢性咽炎

4.总结

1、本项目构建简单,通过本项目能了解KBQA的工作流程。

2、本次通过手工标记210条意图分类训练数据,并采用朴素贝叶斯算法训练得到意图分类模型。其最佳测试效果的F1值达到了96.68%。选用NB的原因是通过与SVM训练效果比较后决定的。

3、优化点:

  • 训练数据还是太少,且对问题进行标注时易受主观意见影响。意图类别还是太少,本系统得到分类模型只能预测出上面设定的7类意图。
  • 对于问题句子中有多个意图的情况只能预测出一类,今后有时间再训练多标签模型吧。。
  • 知识图谱太小了,对于许多问题都检索不出答案。今后可以爬取其它的健康网站数据或者利用命名实体识别和关系抽取技术从医学文献中抽取出实体与关系,以此来扩充知识图谱。
  • 在本项目中采用了预训练的词向量来找近似词。由于该词向量特别大,加载非常耗时,因此影响了整个系统的效率。这个可能是因为电脑配置太低的原因吧。
  • 没有实现推理的功能,后续将采用多轮对话的方式来理解用户的查询意图。同时将对检索出的结果进行排序,可靠度高的排在前面。

项目链接跳转

文章码源链接

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

标签:21,图谱,self,实体,KBQA,乙肝,answer,query
From: https://www.cnblogs.com/ting1/p/17586225.html

相关文章

  • 图论2021版
    图基本概念图可以理解成一个二元组,是由点集V和边集E组成的。G=(V,E),V表示点的集合,E表示边的集合。每条边是一幅点对(v,w)v,w都是点集V中的点。(v,w∈V)图的分类:可以按照边有无方向,可以分为有向图和无向图。比如上图1中,边AB之间没有画出方向(即点之间是无序的),这就是无向图。......
  • M1-Mac-Parallels Desktop-Windows11 安装 CP210x 串口驱动
    设备作为虚拟COM端口工作时,需要CP210xUSB至UART桥虚拟COM端口(VCP)驱动器以促进与CP210x产品的主机通信。也可使用直接存取驱动器将这些设备连接至主机。我需要在Windows系统下调试WHEELTEC的9轴传感器N100。由于办公电脑是M1的MacAir,所以只能在Paral......
  • 替代LT8611芯片设计|CS5218设计方案|DP++转HDMI4K30HZ转换芯片方案
    ASL北京集睿致远研发CS5218DP转HDMI4K30HZ转换芯片,支持高达3840x2160@30Hz或者4096x2160@30Hz,主要用于设计TYEPC拓展坞和DP转接线的开发与应用。CS5218芯片设计电路:CS5218替代LT8611芯片包括2路双模DP电缆适配器寄存器,可用于识别电缆适配器的功能。可以更好地满足更高数......
  • Azure Virtual Network (21) ER专线启用Fast Path
    《WindowsAzurePlatform系列文章目录》 在AzureER专线启动FastPath,具体的区别如下:禁用FastPath启用FastPathAzureVM访问本地VM流量,流量不经过ER网关AzureVM访问本地VM流量,流量不经过ER网关本地VM流量访问AzureVM流量,流量经过ER网关本地VM流量访......
  • java 实体类与VO转化
    Java实体类与VO转化1.简介在Java开发中,经常会遇到需要将实体类(Entity)转化为值对象(ValueObject,VO)的情况。实体类一般用于表示数据库表的结构,而值对象则是用于封装业务数据的对象。本文将介绍如何实现Java实体类与VO的转化,并给出详细的代码示例和解释。2.转化流程下表列出了实......
  • java 实体类某个字段失效
    Java实体类某个字段失效在Java编程中,实体类是指用来表示具体事物的类,它包含了各种属性和方法来描述该事物的特征和行为。然而在实际开发中,有时候会遇到实体类中某个字段失效的问题,即该字段的值无法正确地被赋值或获取。本文将介绍一些常见的造成字段失效的原因,并提供相应的解决方......
  • P1219 八皇后 Checker Challenge(深度搜索dfs经典问题+回溯)
    题目连接:P1219[USACO1.5]八皇后CheckerChallenge-洛谷|计算机科学教育新生态(luogu.com.cn) 典型的深度优先搜索的问题----》先付代码再来跟新java组代码packagePTACZW;importjava.util.Scanner;importjava.io.*;importjava.util.Set;importjava.util.Has......
  • [SWPUCTF 2021 新生赛]babyrce
    [SWPUCTF2021新生赛]babyrce题目来源:nssctf题目类型:web涉及考点:Cookie注入、代码审计1.上来先代码审计<?phperror_reporting(0);header("Content-Type:text/html;charset=utf-8");highlight_file(__FILE__);if($_COOKIE['admin']==1){include"../next.p......
  • openGauss学习笔记-21 openGauss 简单数据管理-GROUP BY子句
    openGauss学习笔记-21openGauss简单数据管理-GROUPBY子句GROUPBY语句和SELECT语句一起使用,用来对相同的数据进行分组。您可以对一列或者多列进行分组,但是被分组的列必须存在。21.1语法格式SELECT{*|[column,...]}[FROMfrom_item[,...]][WHEREcondition][......
  • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(简单)
    题目:classSolution{public:vector<int>exchange(vector<int>&nums){for(inti=0,j=nums.size()-1;i<j;i++){if(nums[i]%2==0){//从i前开始,遇到偶数开始处理while(nums[j]%2==0&&am......