Advertisement

医疗知识图谱问答系统探究(一)

阅读量:

1、项目背景

为了加深对知识图谱的理解并实现项目实战经验的积累,在网上找遍了各种开源项目的实践案例和相关视频教程。

毫无疑问, 努力总会有收获. 成功获取到了中科院软件研究所刘焕勇老师的GitHub开源项目, 该项目基于基于知识图谱构建的医药领域问答系统QABasedOnMedicaKnowledgeGraph.

项目官方发布平台:[https://github.com/liuhuanyong/QASystemOnMedicalKG](https://link.zhihu.com/?target=https%3A//github.com/liuhuanyong/QASystemOnMedicalKG "GitHub)

用了两个晚上搭建了两套,Mac版与Windows版,哈哈,运行成功!!!

从零开始构建一个以疾病为核心的医药领域知识图谱体系,在此基础上实现自动化问答及数据分析功能。本项目聚焦于医药领域研究,在专业垂直的医药信息平台基础上构建疾病相关的知识体系。具体而言:

  • 包含七个维度的知识实体(共4.4万个疾病相关的知识实体)
  • 构建起11个类别(约30万)的知识关系网络
    采用层次化设计进行技术架构规划,并基于现有数据集进行模块化开发。

1、基于垂直网站数据的医药知识图谱构建
2、基于医药知识图谱的自动问答

2、项目环境

2.1 windows系统

搭建中间有很多坑,且行且注意。

配置要求: 配置Neo4j数据库及其相关Python依赖项。Neo4j数据库用户名和密码需要牢记,并对相关文件进行修改。

安装neo4j,neo4j 依赖java jdk 1.8版本以上:

java jdk安装方法可参考: windows系统下安装JDK8,下载地址: https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-windows-x64.exe
安装neo4j可参考博文: windows安装neo4j,下载地址: https://go.neo4j.com/download-thanks.html?edition=community&release=3.4.1&flavour=winzip
安装python可参考: Windows环境下安装python2.7

在安装Neo4j时根据端口、账户和密码的参数设置构建项目配置文件:answer_search.pybuild_medicalgraph.py(在GitHub上下载项目时可根据个人需求也可以选择使用git)

数据导入操作: 执行python build_medicalgraph.py命令,预计涉及的数据量较大,预计耗时较长。

在运行python build_medicalgraph.py之前导入数据时,必须在该文件的main函数内部执行:

build_medicalgraph.py

启动问答: python chat_graph.py

2.2 Mac系统

Mac预装了Python和Java JDK开发环境,可以直接安装Neo4j图数据库。项目的运行流程大致与Windows相似。

问题解答:

安装过程中如遇问题可联系Wechat: dandan-sbb。

2.3 Neo4j数据库展示

2.4 问答系统运行效果

3、项目介绍

该项目的数据主要来源于垂直类医疗网站寻医问药平台,并采用自定义开发的爬虫脚本data_spider.py作为主要工具进行采集与分析工作。研究团队基于所获得的第一手临床诊疗数据构建了一个基于疾病主题的知识图谱系统,在该框架下包含了约44,000个疾病相关实体以及总计约300,000条疾病之间的关联关系网络系统中知识图谱中的schema设计基于采集到的结构化数据构建并通过xpath语法对网页中的层级式信息组织方式进行解析

项目的数据存储方案基于Neo4j图数据库实现;问答系统应用了基于规则的问答处理机制完成功能;数据操作使用cypher脚本语言进行描述和执行。

项目存在以下不足:一是疾病发生的原因分析不够深入;二是对预防措施的描述过于冗长。建议在该区域应用事件抽取技术,并对原因进行结构化表示。

3.1 项目目录

复制代码
 .

    
 ├── README.md
    
 ├── __pycache__      \ 编译结果保存目录
    
 │   ├── answer_search.cpython-36.pyc
    
 │   ├── question_classifier.cpython-36.pyc
    
 │   └── question_parser.cpython-36.pyc
    
 ├── answer_search.py
    
 ├── answer_search.pyc
    
 ├── build_medicalgraph.py    \ 知识图谱数据入库脚本
    
 ├── chatbot_graph.py    \ 问答程序脚本
    
 ├── data
    
 │   └── medicaln.json \ 本项目的全部数据,通过build_medicalgraph.py导neo4j
    
 ├── dict
    
 │   ├── check.txt    \ 诊断检查项目实体库
    
 │   ├── deny.txt      \ 否定词库
    
 │   ├── department.txt  \ 医疗科目实体库
    
 │   ├── disease.txt    \ 疾病实体库
    
 │   ├── drug.txt      \ 药品实体库
    
 │   ├── food.txt      \ 食物实体库
    
 │   ├── producer.txt    \ 在售药品库
    
 │   └── symptom.txt    \ 疾病症状实体库
    
 ├── document
    
 │   ├── chat1.png    \ 系统运行问答截图01
    
 │   ├── chat2.png      \ 系统运行问答截图01
    
 │   ├── kg_route.png    \ 知识图谱构建框架
    
 │   ├── qa_route.png    \ 问答系统框架图
    
 ├── img    \ README.md中的所用图片
    
 │   ├── chat1.png
    
 │   ├── chat2.png
    
 │   ├── graph_summary.png
    
 │   ├── kg_route.png
    
 │   └── qa_route.png
    
 ├── prepare_data
    
 │   ├── build_data.py    \ 数据库操作脚本
    
 │   ├── data_spider.py    \ 网络资讯采集脚本
    
 │   └── max_cut.py      \ 基于词典的最大向前/向后脚本
    
 ├── question_classifier.py    \ 问句类型分类脚本
    
 ├── question_classifier.pyc    
    
 ├── question_parser.py    \ 问句解析脚本
    
 ├── question_parser.pyc
    
    
    
    
    代码解读

3.2 知识图谱的实体类型

3.3 知识图谱的实体关系类型

3.4 知识图谱的属性类型

3.5 问答项目实现原理

本项目的问答系统主要依赖于规则匹配机制来实现功能,在具体运行过程中首先会对输入的问句进行关键词比对以完成分类任务;医疗问题作为封闭领域场景中的典型问题类型会被系统自动识别并进行初步分类;随后系统会通过穷举法完成领域问题的具体分类;最后系统会调用Cypher语句去匹配数据库中的数据源并提取相关信息;根据查询结果生成相应的回答内容并输出给用户

问句中的关键词匹配:

根据匹配到的关键词分类问句

问句解析

查找相关数据

根据返回的数据组装回答

3.6 问答系统支持的问答类型

4、项目总结

遵循简单规则构建的问答系统通常不需要复杂的算法实现;一般而言, 该系统会通过模板匹配方法获取最相似的回答内容;生成的回答质量主要受问题类型和训练数据完整性的影响;对于熟悉的问题类型能够提供合理的解答;当无法匹配到相关模板或无法准确理解问题时通常会采用以下三种处理方式:

1、让这个答案显得非标准或不着边际;
2、对于这个问题的误导性回答难以解答,并建议用户采用不同的询问方法;
3、通过转移焦点到其他议题上而规避直接讨论当前的问题

例如,本项目中采用了婉转的方式回答不知道:

该问答系统的显著特点是其采用的知识图谱架构。该系统主要由单一领域或跨领域实体构成,并利用这些结构进行推理和演算。向用户提供较为深入的知识性解答,在处理具有专业知识性的查询方面更具优势。不同之处在于它能够提供更加直接和自然的答案。当无法解答问题或缺乏相关信息时,默认返回失败信息而非转移话题以免尴尬。

整个问答系统本身的得失取舍主要取决于其支撑的知识图谱的质量以及所包含的知识量。这也算是一种权衡利弊的状态吧!其支撑的知识图谱具备良好的可扩展能力,在此能力的作用下不仅能够拓展原有的知识体积累加丰富了问答系统的核心数据库。当查询语句位于相关范围之内时能够顺利解答;但如果偏离范围则会影响用户体验

全部评论 (0)

还没有任何评论哟~