# 基于医疗知识图谱的问答系统
> 数据链接:
>
> 链接:[https://pan.baidu.com/s/1oPr1m8aaIeoMu53OIEULPg](https://pan.baidu.com/s/1oPr1m8aaIeoMu53OIEULPg)
> 提取码:fh39
## **一、项目来源**
由于之前用 Rasa 构建过对话系统,因此一直想脱离 Rasa 这个开源框架,从底层开始构建一个可以实现相似功能的对话系统,毕竟框架用的再溜,都不如自己做一遍。
恰巧在 Rasa 群里看到了
[@王乐](https://www.zhihu.com/people/1b7326a564c30474efbc1f85c5af40a9)
前辈分享的一个项目:[基于知识图谱的医疗诊断知识问答系统](https://link.zhihu.com/?target=https%3A//github.com/wangle1218/KBQA-for-Diagnosis),先看了一遍视频,然后把代码下载下来,自己实现了一遍,遇到不懂得地方就再看视频,现在基本把这个项目搞明白了,写个总结分享一下,后期会在现有的基础上做一些横向拓展。
由于前辈已经有了视频讲解(项目主页有视频链接),我的总结和分享尽量避开已有的讲解内容,避免重复。
因此建议本文和前辈的视频配合食用~
## **二、项目架构**
目前实现的是最小演示版本,后期前辈可能会加上 Redis、Elasticsearch、tf-serving 等技术栈,但是于我而言,现在的版本已经足够了。
本文的介绍也是基于目前的这个 Demo 进行的,后期会不断更新。
**这个项目已实现的功能**:
- 闲聊类的单论对话
- 基于知识图谱的多轮问答
先看一下对话流程,或者也叫文本解析流程,是根据代码逻辑整理出来的:
![](https://www.writebug.com/myres/static/uploads/2022/1/10/7dd5ea9b67314effed3be15cb8a2d04a.writebug)
以用户输入“**请问得了心脏病怎么办呢**”为例:
### NLU 模块
**1)**先进入分类模型 1,判断是否是闲聊类的意图,包括:greet、goodbye、deny、isbot、accept、 diagnosis:
- **命中前四个意图**,那就进入 **Chitchat_bot**,从准备好的回复语料中随机抽取一条返回给用户,对话结束;
- **命中 accept**,accept 意图是在进行**问题澄清**时发挥作用;
- **命中 diagnosis**,进入 2)Medical_bot;
本例中,命中的是 `diagnosis` ,进入 2)Medical_bot
**2)**在 Medical_bot 中,先进入分类模型 2 进行意图二次识别,这里包括 13 个医疗类的意图;然后进入 NER 模型进行实体识别与提取;
意图识别的结果是
```json
{'confidence': 0.8997645974159241, 'intent': '治疗方法'}
```
实体识别的结果是
```json
[{'entities': [{'type': 'disease', 'word': '心脏病'}], 'string': '请问得了心脏病怎么办呢'}, {'entities': [{'recog_label': 'dict', 'type': 'disease', 'word': '心
脏病'}], 'string': '请问得了心脏病怎么办呢'}]
```
前面这两步相当于任务型对话机器人中的 NLU 模块
### DST 模块
**3)**得到意图和实体之后,先用实体填充槽位
**这里说一下 NLU 和 DST 的联系与区别**,NLU 和 DST 的关系其实非常紧密,它们都在槽位填充过程中发挥了作用,但是在这个过程中扮演了不同的角色:
- **NLU 模块**是对用户的输入进行意图的分类,同时对输入中的实体进行标注,下面是上面实体识别结果的节选:
```json
{'entities': [{'type': 'disease', 'word': '心脏病'}], 'string': '请问得了心脏病怎么办呢'}
```
在此项目中,是标出实体的类型(type),对应知识图谱中的节点,同时标出对应的字段(word),但是还没有填充,只是把实体找出来而已。
- **DST 模块**则是基于对话历史,为槽位列表中的每一个槽位找到一个槽位值
```text
"治疗方法":{
"slot_list" : ["Disease"],
"slot_values":None,
"cql_template" : ["MATCH(p:疾病) WHERE p.name='{Disease}' RETURN p.cure_way",
"MATCH(p:疾病)-[r:recommand_drug]->(q) WHERE p.name='{Disease}' RETURN q.name",
"MATCH(p:疾病)-[r:recommand_recipes]->(q) WHERE p.name='{Disease}' RETURN q.name"],
"reply_template" : "'{Disease}' 疾病的治疗方式、可用的药物、推荐菜肴有:\n",
"ask_template" : "您问的是疾病 '{Disease}' 的治疗方法吗?",
"intent_strategy" : "",
"deny_response":"没有理解您说的意思哦~"
},
```
这是"治疗方法"这个意图的下的信息(form),槽位列表中只有一个槽位"Disease"(下文会对这个 form 进行详细介绍)。
在每一轮对话中,DST 模块都会查看截止目前的所有对话历史,然后确定哪个文本可以填充为槽位列表中某个特定槽位的槽位值,这个过程谓之**追踪**(**D**ialogue **S**tate **T**racking)。
在这个项目中,这一步是通过遍历**槽位列表**和**实体识别的结果**进行匹配完成的。
### PL 模块
**4)**然后根据意图置信度确定回复策略,这里分了三种简单的情况:
- \>=0.8,根据识别到的意图去 Neo4j(知识图谱)中查询答案,返回给用户
- 0.4~0.8,反问用户,进行问题澄清
- <0.4,返回兜底话术
DST 模块 +PL 模块组成了任务型对话机器人中的对话管理(DM)模块,在这个项目中界限并不是特别明显,主要实现逻辑都在 `modules.py` 文件的 `semantic_parser` 函数中。
学术和工业界也有好多人在研究这一部分,一个热门的方向是用强化学习进行策略的选择,有相关的论文,感兴趣的可以去看看。
## **实现上述过程,需要完成以下几步工作**:
**1)构建知识图谱作为底层数据支撑**
这里构建知识图谱采用的数据集是 liuhuanyong 在 [QABasedOnMedicaKnowledg](https://link.zhihu.com/?target=https%3A//github.com/wangle1218/QASystemOnMedicalKG/tree/master/data)eGraph 项目中使用的医疗数据集。
一共 **8 种实体**:药品、菜谱、食物、检查、科室、药企、疾病、症状,共计 4 万余个
**11 种实体关系**:
- 疾病-忌吃食物关系
- 疾病-宜吃食物关系
- 疾病-推荐吃食物关系
- 疾病-通用药品关系
- 疾病-热门药品关系
- 疾病-检查关系
- 科室-科室关系
- 厂商-药物关系
- 疾病症状关系
- 疾病并发关系
- 疾病与科室之间的关系
对于没有构建过知识图谱的同学来说,在有**结构化数据集**的情况下,不要把构建知识图谱想象成一件特别复杂,特别困难的事情;知识图谱的难点在于:
- **数据收集阶段**,从**非结构化数据**中提取出**结构化的信息**,比如从网页文本中找出实体(NER),并提取出实体间的关系
- **图谱设计阶段**,实体定义,属性定义,关系定义,需要一定领域背景知识才能更好的进行图谱设计
而在此项目中,数据集是结构化的,实体,属性,关系也都是定义好的,所以不要把这一步想的很困难。
在实际业务中,构建知识图谱的难易取决于你具体的业务场景,不能一概而论。
**2)分类模型 1**
分类模型 1 的任务是完成多意图分类,判断用户意图是否是闲聊类的,这是第一次意图分类(这个项目中一共进行了两层意图分类),这里采用的是 LR+GBDT 多模型融合的方法。
**3)分类模型 2**
在 Medical_bot 中,首先进入分类模型 2,识别出具体的医疗诊断意图:定义、病因、治疗时间、预防、治疗方法等共计 13 个医疗诊断意图,这里采用的是 Bert+TextCNN 进行多意图分类。
**4)NER 模型**
在 Medical_bot 中,第二步是通过 NER 模型对医疗领域的实体进行识别及提取,即从用户输入中就要求提取出知识图谱中包含的实体的名称,前面提到过,在本项目中一共 8 种.
但是在大型项目中,实体数量数以万计,而普通的匹配方式由于每次匹配�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
于之前用 Rasa 构建过对话系统,因此一直想脱离 Rasa 这个开源框架,从底层开始构建一个可以实现相似功能的对话系统,毕竟框架用的再溜,都不如自己做一遍。 恰巧在 Rasa 群里看到了 前辈分享的一个项目:基于知识图谱的医疗诊断知识问答系统,先看了一遍视频,然后把代码下载下来,自己实现了一遍,遇到不懂得地方就再看视频,现在基本把这个项目搞明白了,写个总结分享一下,后期会在现有的基础上做一些横向拓展。 由于前辈已经有了视频讲解(项目主页有视频链接),我的总结和分享尽量避开已有的讲解内容,避免重复。 因此建议本文和前辈的视频配合食用~ 二、项目架构 目前实现的是最小演示版本,后期前辈可能会加上 Redis、Elasticsearch、tf-serving 等技术栈,但是于我而言,现在的版本已经足够了。 本文的介绍也是基于目前的这个 Demo 进行的,后期会不断更新。 这个项目已实现的功能: 闲聊类的单论对话 基于知识图谱的多轮问答 先看一下对话流程,或者也叫文本解析流程,是根据代码逻辑整理出来的:
资源推荐
资源详情
资源评论
收起资源包目录
基于医疗知识图谱的问答系统( 1.闲聊类的单论对话 2.基于知识图谱的多轮问答)附完整代码数据详细教程.rar (62个子文件)
基于医疗知识图谱的问答系统( 1.闲聊类的单论对话 2.基于知识图谱的多轮问答)附完整代码数据详细教程
code
local.py 4KB
nlu
intent_recg_bert
__init__.py 214B
app.py 3KB
data
__init__.py 214B
predict.py 3KB
bert_model.py 3KB
data_helper.py 2KB
label 153B
train.py 4KB
__pycache__
bert_model.cpython-36.pyc 2KB
data_helper.cpython-36.pyc 2KB
__init__.cpython-36.pyc 357B
CMID
__init__.py 214B
sklearn_Classification
__init__.py 213B
data
__init__.py 213B
intent_recog_data.txt 4KB
model_file
__init__.py 213B
vec.pkl 38KB
id2label.pkl 98B
LR.pkl 55KB
gbdt.pkl 6.71MB
svc_clf.pkl 47KB
train.py 4KB
__pycache__
clf_model.cpython-36.pyc 2KB
__init__.cpython-36.pyc 363B
clf_model.py 1KB
build_kg
__init__.py 214B
build_kg_utils.py 13KB
itchat_app.py 2KB
LICENSE 1KB
utils
__init__.py 214B
json_utils.py 997B
01.py 90KB
modules.py 8KB
run_ner_service.bat 56B
requirements.txt 2KB
run_intent_recog_service.bat 49B
logs
__init__.py 214B
knowledge_extraction
__init__.py 214B
bilstm
__init__.py 214B
crf_layer.py 31KB
metrics.py 13KB
app.py 7KB
bilstm_crf_model.py 2KB
data_helpers.py 4KB
train.py 3KB
__pycache__
bilstm_crf_model.cpython-36.pyc 2KB
crf_layer.cpython-36.pyc 25KB
data
test1_data
License.docx 48KB
test1_data.json 2.05MB
dev_data
License.docx 48KB
dev_data.json 10.05MB
train_data
train_data.json 82.88MB
License.docx 48KB
processed_data
train_triples.json 81.12MB
test_triples.json 4.92MB
dev_triples.json 4.9MB
rel2id.json 3KB
build_baiduie_data.py 3KB
__pycache__
__init__.cpython-36.pyc 357B
README.md 17KB
config.py 7KB
共 62 条
- 1
甜辣uu
- 粉丝: 9554
- 资源: 1102
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页