# 基于知识图谱实现的知识问答系统
本项目主要目的是从零开始,一步步构建基于知识图谱的知识问答系统。
共分为三大章节:
- 构建一个简单的知识图谱
- 构建一个医疗知识图谱
- 基于所构建的医疗知识图谱实现简单的对话系统
# 一、构建一个简单的知识图谱
之前在了解对话系统的时候,就发现其实一个有应用价值的对话系统,需要引入外部知识辅助决策分析,所以我就打算最近学习一下知识图谱,并尝试结合知识图谱构建一个对话系统。
知识图谱是谷歌提出的一个概念,从定义上来说,知识图谱就是结构化的语义知识库,是一种基于图的数据结构,用于描述物理世界中的概念及其相互关系。
既然是图就有边和节点,边指的是事物之间的关系,而节点这里简单地分成两种,第一种是实体,所谓实体就是指现实世界中的一些具体的事物,比如说一个人、一座城市、一家公司等等,都属于实体的范畴。除此之外,我们可以考虑一下,在现实世界里,我们除了需要描述事物之间的关系,有时候我们还需要描述事物本身具备的一些特征,比如"小明是一个大学生",“小明发表了10篇论文”、“小明有2台汽车”,对于这种情况,就要考虑另一种类型的节点,也就是属性,属性可以分为对象属性和数据属性,在"小明是一个大学生"中,“大学生"就是一个对象属性节点,边可以是"当前学历”,在"小明发表了10篇论文"中,“10"是一个数据属性,边可以是"已发表论文数”。当然概念的东西简单了解一下就好,实际上看图更容易理解。
![01](img/01.jpg)
接下来我们要谈的是如何存储知识,或者说如何表示知识,虽然现在比较前沿的研究方向是通过稠密的低维向量实现对实体和关系的分布式表示,但是这里还是从最简单的三元组谈起。
所谓三元组就是< header entity, relation, tail entity >, 比如说"小明是一个大学生"可以表示为< 小明, 当前学历, 大学生 >,"小明今年十岁"可以表示为< 小明, 年龄, 10 >,这样就可以把知识数据结构化地进行存储。
接下来介绍一下如何构建一个知识图谱,用到的工具是Neo4j。
Neo4j作为一个图数据库,为了数据的储存、读写等操作更合理高效,在设计逻辑上和知识图谱有一些差别,所以这里先介绍一下Neo4j的一些概念,为了方便对应Neo4j的官方文档,下列的概念一律用英文。
![02](img/02.png)
node是Neo4j的基本概念,以下是Neo4j的一个单一节点:
![03](img/03.png)
Neo4j的node和之前讲到的知识图谱中的节点不同,它不仅仅是一个单一的实体或者属性,它包括了label和property。其中label是Neo4j引入的一个新概念,它的作用是根据label把node划分成一个个集合,比如说"学生"可以是一个label,"国家"也可以是一个label,label具体是什么由我们来设计,我们可以通过指定label对这一批数据进行特定的操作。
除此之外,一个node可以拥有多个label,为node设计什么label,主要还是要根据实际情况判断,看如何设计能方便数据的查询和修改等操作:
![04](img/04.png)
第三个概念是relationship,relationship就是连接两个node的边,而且这是有向边,relationship中包含relationship type,比如"acted_in",就是表示Tom Hanks是Forrest Gump中的一个演员:
![05](img/05.png)
第四个概念是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进行访问:
![06](img/06.png)
我们可以通过Cypher或者python对Neo4j进行操作,Cypher就相当于mysql那种数据库操作语言,这里有详细教程,使用上Cypher和python可以结合使用,所以都可以了解一下。
以下就是利用python的py2neo库建一个简单的知识图谱:
```py
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)
```
![07](img/07.png)
这里根据第一张图简单写了几个节点,跑完代码就能看到页面上更新了知识图谱,实现上没有什么难点,但是一个很好的入门案例。
总的来说,简单介绍了知识图谱的基本概念,并且通过Neo4j简单构建了一个知识图谱。
# 二、构建一个医疗知识图谱
之前我们简单介绍了怎么构建一个知识图谱,这次就来看看一个完整的构筑流程,以QASystemOnMedicalKG作为参考,主要想展示一下从最初收集非结构化的数据、到一步步处理并通过知识图谱展示的简单流程。
数据可以直接在QASystemOnMedicalKG中获得,如果想了解具体的爬虫过程可以看看这个博客的文章,我主要想快速过一遍这个流程,看看最后知识图谱是如何辅助对话系统的。
首先,我们的数据来源是寻医问药,随便打开一个疾病,可以看到基本的信息:
![08](img/08.png)
需要爬取的信息包括疾病名、所属目录、症状、治疗方案等等,都可以从页面上获取,
![09](img/09.png)
得到了这些信息,我们就可以构建知识图谱,思路上基本和之前一样,以上图为例,首先我们可以建一个label为disease、name为肺泡蛋白质沉淀症的node,property方面包括prevent、cure_way、cause等等,另外,对于症状、科室、检查方法等信息都建立单独的node,同时通过has_symptom、belongs_to、need_check等关联把它们和肺泡蛋白质沉淀关联起来,最终就能得到如下知识图谱:
![10](img/10.png)
因为疾病之间存在并发关系,疾病之间也可以通过症状串联起来,所以最后我们利用大量的医疗数据,就能构建一个大型的医疗知识图谱。
![11](img/11.png)
可以选择使用代码中原始的medical.json构建一个完整的医疗知识图谱,也可以像我这样使用几条数据快速过一遍这个流程。
# 三、基于医疗知识图谱实现简单的对话系统
之前我们已经构建了一个简单的医疗知识图谱,这次就来看看怎么利用这个知识图谱建一个简单的对话系统,构筑的流程还是参考之前的项目,以后我们再结合深度学习进行改进。
![12](img/12.png)
上图就反映了这个对话系统的分析思�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
之前我们简单介绍了怎么构建一个知识图谱,这次就来看看一个完整的构筑流程,以QASystemOnMedicalKG作为参考,主要想展示一下从最初收集非结构化的数据、到一步步处理并通过知识图谱展示的简单流程。 数据可以直接在QASystemOnMedicalKG中获得,如果想了解具体的爬虫过程可以看看这个博客的文章,我主要想快速过一遍这个流程,看看最后知识图谱是如何辅助对话系统的。 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/132466800
资源推荐
资源详情
资源评论
收起资源包目录
Python实现基于医疗知识图谱实现简单的对话系统(知识问答系统).zip (57个子文件)
Python实现基于医疗知识图谱实现简单的对话系统(知识问答系统)
knowledgegraphbeginner_python
.DS_Store 8KB
1.simpleKnowledgeGraph
simpleKG.py 506B
2.medicalKnowledgeGraph
.DS_Store 6KB
data
.DS_Store 6KB
medical.json 44.96MB
simple_medical.json 63KB
buildKG.py 13KB
__pycache__
max_cut.cpython-37.pyc 3KB
dict
.DS_Store 6KB
food.txt 292B
producer.txt 4KB
drug.txt 936B
disease.txt 204B
symptoms.txt 724B
check.txt 737B
department.txt 75B
LICENSE 1KB
3.KGchatbot
.DS_Store 6KB
question_parser.py 8KB
chatbot_graph.py 1KB
answer_search.py 6KB
question_classifier.py 11KB
__pycache__
question_classifier.cpython-37.pyc 8KB
question_parser.cpython-37.pyc 7KB
answer_search.cpython-37.pyc 6KB
dict
food.txt 292B
producer.txt 4KB
drug.txt 936B
disease.txt 204B
symptoms.txt 724B
deny.txt 227B
check.txt 737B
department.txt 75B
.idea
libraries
R_User_Library.xml 123B
vcs.xml 180B
workspace.xml 22KB
misc.xml 304B
modules.xml 296B
KnowledgeGraphBeginner.iml 787B
encodings.xml 135B
img
09.png 289KB
05.png 65KB
02.png 82KB
10.png 107KB
08.png 489KB
01.jpg 711KB
04.png 95KB
12.png 109KB
15.png 191KB
03.png 21KB
11.png 376KB
13.png 160KB
07.png 80KB
16.png 231KB
14.png 250KB
06.png 285KB
README.md 10KB
共 57 条
- 1
资源评论
- woshixinyuanhou2024-01-19感谢资源主分享的资源解决了我当下的问题,非常有用的资源。
shejizuopin
- 粉丝: 1w+
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功