基于Python实现的医疗知识图谱的知识问答系统
资源下载地址:https://download.csdn.net/download/sheziqiong/85942554
资源下载地址:https://download.csdn.net/download/sheziqiong/85942554
一、构建一个简单的知识图谱
之前在了解对话系统的时候,就发现其实一个有应用价值的对话系统,需要引入外部知识辅助决策分析,所以我就打算最近学习一下知识图谱,并尝试结合知识图谱构建一个对话系统。
知识图谱是谷歌提出的一个概念,从定义上来说,知识图谱就是结构化的语义知识库,是一种基于图的数据结构,用于描述物理世界中的概念及其相互关系。
既然是图就有边和节点,边指的是事物之间的关系,而节点这里简单地分成两种,第一种是实体,所谓实体就是指现实世界中的一些具体的事物,比如说一个人、一座城市、一家公司等等,都属于实体的范畴。除此之外,我们可以考虑一下,在现实世界里,我们除了需要描述事物之间的关系,有时候我们还需要描述事物本身具备的一些特征,比如"小明是一个大学生",“小明发表了10篇论文”、“小明有2台汽车”,对于这种情况,就要考虑另一种类型的节点,也就是属性,属性可以分为对象属性和数据属性,在"小明是一个大学生"中,“大学生"就是一个对象属性节点,边可以是"当前学历”,在"小明发表了10篇论文"中,“10"是一个数据属性,边可以是"已发表论文数”。当然概念的东西简单了解一下就好,实际上看图更容易理解。
接下来我们要谈的是如何存储知识,或者说如何表示知识,虽然现在比较前沿的研究方向是通过稠密的低维向量实现对实体和关系的分布式表示,但是这里还是从最简单的三元组谈起。
所谓三元组就是< header entity, relation, tail entity >, 比如说"小明是一个大学生"可以表示为< 小明, 当前学历, 大学生 >,"小明今年十岁"可以表示为< 小明, 年龄, 10 >,这样就可以把知识数据结构化地进行存储。
接下来介绍一下如何构建一个知识图谱,用到的工具是Neo4j。
Neo4j作为一个图数据库,为了数据的储存、读写等操作更合理高效,在设计逻辑上和知识图谱有一些差别,所以这里先介绍一下Neo4j的一些概念,为了方便对应Neo4j的官方文档,下列的概念一律用英文。
node是Neo4j的基本概念,以下是Neo4j的一个单一节点:
Neo4j的node和之前讲到的知识图谱中的节点不同,它不仅仅是一个单一的实体或者属性,它包括了label和property。其中label是Neo4j引入的一个新概念,它的作用是根据label把node划分成一个个集合,比如说"学生"可以是一个label,"国家"也可以是一个label,label具体是什么由我们来设计,我们可以通过指定label对这一批数据进行特定的操作。
除此之外,一个node可以拥有多个label,为node设计什么label,主要还是要根据实际情况判断,看如何设计能方便数据的查询和修改等操作:
第三个概念是relationship,relationship就是连接两个node的边,而且这是有向边,relationship中包含relationship type,比如"acted_in",就是表示Tom Hanks是Forrest Gump中的一个演员:
第四个概念是property,property是一个键值对,在之前node的介绍中也提到,node由label和property构成,需要注意的是,node和relationship都可以有property,比如上方的ACTED_IN中就通过property说明了Tom Hanks在Forrest Gump中扮演的角色是Forrest。
property中比较特别的是name,经过测试,我发现一个node没有name的话,在可视化界面是不会显示这个node的名称的(这样说好像很傻仔……),但从Neo4j的逻辑来看,一个node不一定需要name这个property,所以我们应该把Neo4j中的node看成是一个更抽象的node,而不是知识图谱中的实体。
经过上面的介绍,主要想说明的是,Neo4j主要的目的也是构建一个知识图谱,不过在实现上更多从数据库的角度出发,引入了label等结构,方面了用户在查询、增删数据时的便利度。除此之外还有其他一些概念,这里暂不继续说,有兴趣的可以看看Neo4j的官方文档。
接下来就是实操环节,安装方面可以参考这个教程,假设我们已经安装好Neo4j,就能通过localhost:7474进行访问:
我们可以通过Cypher或者python对Neo4j进行操作,Cypher就相当于mysql那种数据库操作语言,这里有详细教程,使用上Cypher和python可以结合使用,所以都可以了解一下。
以下就是利用python的py2neo库建一个简单的知识图谱:
from py2neo import Graph, Node, Relationship# 连接Neo4j
g = Graph(host='127.0.0.1',http_port=7474,user='neo4j',password='neo4j')# 创建节点
da_vinci = Node('person', name='DA VINCI')
mona_lisa = Node('art', name='MONA LISA')
louvre = Node('place', name='LOUVRE')g.create(da_vinci)
g.create(mona_lisa)
g.create(louvre)relation1 = Relationship(da_vinci, 'painted', mona_lisa)
relation2 = Relationship(mona_lisa, 'is_in', louvre)g.create(relation1)
g.create(relation2)
这里根据第一张图简单写了几个节点,跑完代码就能看到页面上更新了知识图谱,实现上没有什么难点,但是一个很好的入门案例。
总的来说,简单介绍了知识图谱的基本概念,并且通过Neo4j简单构建了一个知识图谱。
二、构建一个医疗知识图谱
之前我们简单介绍了怎么构建一个知识图谱,这次就来看看一个完整的构筑流程,以QASystemOnMedicalKG作为参考,主要想展示一下从最初收集非结构化的数据、到一步步处理并通过知识图谱展示的简单流程。
数据可以直接在QASystemOnMedicalKG中获得,如果想了解具体的爬虫过程可以看看这个博客的文章,我主要想快速过一遍这个流程,看看最后知识图谱是如何辅助对话系统的。
首先,我们的数据来源是寻医问药,随便打开一个疾病,可以看到基本的信息:
需要爬取的信息包括疾病名、所属目录、症状、治疗方案等等,都可以从页面上获取,
得到了这些信息,我们就可以构建知识图谱,思路上基本和之前一样,以上图为例,首先我们可以建一个label为disease、name为肺泡蛋白质沉淀症的node,property方面包括prevent、cure_way、cause等等,另外,对于症状、科室、检查方法等信息都建立单独的node,同时通过has_symptom、belongs_to、need_check等关联把它们和肺泡蛋白质沉淀关联起来,最终就能得到如下知识图谱:
因为疾病之间存在并发关系,疾病之间也可以通过症状串联起来,所以最后我们利用大量的医疗数据,就能构建一个大型的医疗知识图谱。
可以选择使用代码中原始的medical.json构建一个完整的医疗知识图谱,也可以像我这样使用几条数据快速过一遍这个流程。
三、基于医疗知识图谱实现简单的对话系统
之前我们已经构建了一个简单的医疗知识图谱,这次就来看看怎么利用这个知识图谱建一个简单的对话系统,构筑的流程还是参考之前的项目,以后我们再结合深度学习进行改进。
上图就反映了这个对话系统的分析思路,整体上接近一个基于规则的对话系统,首先我们需要对用户输入进行分类,其实就是分析用户输入涉及到的实体及问题类型,也就是Neo4j中的node、property、relationship,然后我们利用分析出的信息,转化成Neo4j的查询语句,最后再把查询的结果返回给用户,就完成了一次问答。
整体上涉及到三个模块,问题的分类、问题的解析以及回答的搜索,接下来我们一个个来看具体的实现。
对于问题的分类,就像之前说的有两个方面,一个是分析出问句中涉及到的node,另一个是分析出property或relationship,对于node,大致上就是采用Aho-Corasick算法,分析出问句中的每一个词是否出现在知识图谱中的node集合中,比如"胸痛怎么办"这句话中,胸痛就出现在了知识图谱的node集合中,所以就可以认为这句话涉及到的实体是"胸痛"。
对于property和relationship,分析的思路更简单,首先预设定一系列的问句疑问词,从而对问句的每个词进行对比分析,判断出问句的类型
然后,根据问句的类型和之前识别出来的实体,基于规则推断出property和relationship:
把问题转化为Neo4j的Cypher语句,其实也是预先写好Cypher语句的模板,根据实际的情况把之前分析得到的node、property、relationship填入Cypher语句中进行查询。
得到了Cypher语句,我们就能连接Neo4j数据库进行查询,得到结果之后,还需要对语句进行一点微调,这个过程也是加上预设定的语句:
资源下载地址:https://download.csdn.net/download/sheziqiong/85942554
资源下载地址:https://download.csdn.net/download/sheziqiong/85942554
基于Python实现的医疗知识图谱的知识问答系统相关推荐
- 基于Python+Neo4j+民航数据 ,我搭建了一个知识图谱的自动问答系统
最近耗时一周,我基于Python+Neo4j ,搭建了一个民航业知识图谱的自动问答系统. 文章目录 环境 运行 1.项目结构 2.数据组织 3.问题预处理 4.问题分类 5.Web APP 源码&am ...
- mysql实现知识图谱_基于电影知识图谱的智能问答系统学习记录
学习了"谓之小一"大佬的基于电影知识图谱的智能问答系统,做个记录.地址如下:https://github.com/weizhixiaoyi/DouBan-KGQA 一.知识图谱构建 ...
- Python neo4j建立知识图谱,药品知识图谱,neo4j知识图谱,知识图谱的建立过程,智能用药知识图谱,智能问诊必备知识图谱
一.知识图谱概念 知识图谱的概念是由谷歌公司在2012年5月17日提出的,谷歌公司将以此为基础构建下一代智能化搜索引擎,知识图谱技术创造出一种全新的信息检索模式,为解决信息检索问题提供了新的思路.本质 ...
- 基于学者网信息和知识图谱的智能问答系统
知识图谱 之 python 操作neo4j (导入CSV操作) 知识图谱之python操作Neo4j导入CSV构建复杂的知识图谱 基于python的Django框架和Neo4j的知识图谱可视化 大家可 ...
- 虚拟专题:知识图谱 | 医学知识图谱构建关键技术及研究进展
来源:<大数据> 医学知识图谱构建关键技术及研究进展 谭玲1, 鄂海红1, 匡泽民2, 宋美娜1, 刘毓1, 陈正宇1, 谢晓璇1, 李峻迪1, 范家伟1, 王晴川1, 康霄阳1 1 北京 ...
- 知识图谱入门——知识融合
文章首发于博客du_ok's Notes,本文链接为知识图谱入门--知识融合 本文介绍了知识融合相关的技术和典型的知识融合工具. 知识融合相关概念 相关的术语: 知识融合 (Knowledge Fus ...
- 【知识图谱】知识图谱概论
文章目录 一.知识图谱与语义技术概述 1.知识图谱的概念演化 2.重点 3.应用 4.KG的本质 二.典型知识图谱 三.知识图谱技术概览 1.KG技术体系 2.知识表示 (1)概述 (2)语义网知识表 ...
- 虚拟专题:知识图谱 | 频谱知识图谱:面向未来频谱管理的智能引擎
来源:通信学报 频谱知识图谱:面向未来频谱管理的智能引擎 孙佳琛, 王金龙, 丁国如, 陈瑾, 龚玉萍 陆军工程大学通信工程学院 摘要:针对当前频谱管理中表征方式较单一.管理方式对人的经验依赖性较强. ...
- 肖仰华谈知识图谱:知识将比数据更重要,得知识者得天下
肖仰华谈知识图谱:知识将比数据更重要,得知识者得天下 https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247498869& ...
- 知识图谱基础知识总结
2012 年 5 月 17 日,Google 正式提出了知识图谱(Knowledge Graph)的概念,其初衷是为了优化搜索引擎返回的结果,增强用户搜索质量及体验.博文管理 知识图谱并不是一个全新的 ...
最新文章
- 6.Spring Security Session 管理
- it专员职责_网络IT专员岗位职责
- Pandas在数据分析中的应用
- NYOJ 6 喷水装置(一)
- java中飞飞检查异常_Springboot项目如何在controller层统一返回数据以及处理异常
- html5新标签笔记,HTML5新标签学习笔记
- chrome扩展插件推荐:FeHelper格式化json
- access orcad 数据库_OrCAD Capture CIS使用MySQL数据库
- 磁带机故障灯解决方法
- 计算机视觉—车道线检测
- 利用html2canvas和vue-qr生成带头像二维码的分享海报(二)
- crc16modbus查表法_分别用定义法和查表法求取MODBUS_CRC16的值
- 短信猫接收与发送短信整理
- 如何打破校园网垄断现象?
- ubuntu下exiftool安装
- 比较两组数据的差异用什么图更直观_科研数据可视化:巧妙运用各种形式的图表...
- 摆脱社恐六部曲, 你可以的!
- 记一次讲座与前辈的对话
- 【Python学习随笔】依赖倒置原则 + 简单工厂模式
- webstorm实用技巧
热门文章
- ABP VNext系列(二)-详解ABP的依赖注入
- Failed to load resource: the server responded with a status of 404 ()解决办法
- ChatGPT新突破:打造自己的智能机器人控制系统
- Python文字(汉字)转语音https://zhuanlan.zhihu.com/p/26726297
- Linux常用命令——lpq命令
- 解决打印机不能打印字体的情况。
- JDK1.8 邮戳锁(StampedLock)知识点整理以及示例
- 【javaWeb微服务架构项目——乐优商城day03】——(搭建后台管理前端,Vuetify框架,使用域名访问本地项目,实现商品分类查询,cors解决跨域,品牌的查询)
- 解决Permission denied, please try again问题
- Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.tools.PointcutDesignatorHandler