毕业设计第二次总结(基于知识图谱的医疗问答)

毕业设计第二次总结(基于知识图谱的医疗问答)

从这次总结开始,我将会按照我写毕设的总体思路和设计方案流程来书写我的博客,希望对大家能有帮助,这次博客会比较长,废话可能有点多,大家挑自己在意的方面选择观看。博客最后会附上第一版的项目的github地址

一:项目基本层面设计

1. 知识图谱scheam设计: 根据我自己设想的需求,我对实体类型,和实体关系做了一些修改,主要是可以更方便的做后面问答的种类扩展。如下图所示:
毕业设计第二次总结(基于知识图谱的医疗问答)_第1张图片
增加了:医院和药品的一些基本属性还有一些在我看来一个问答系统应该能回答的问题资料,后续做问答的时候也可以拓展这方面的问答意图。
2. 问答类型:根据CMID数据集的具体数据分类,大概制定下以下几类:在这里插入图片描述

二:项目代码简单讲解:

毕业设计第二次总结(基于知识图谱的医疗问答)_第2张图片

- analysic_data文件夹:

在这里插入图片描述
(1)data_spider.py:是项目的爬虫脚本,整个项目的图谱基本数据来源于此。爬取的数据会存放到MongoDB中,主要注意的是对于药品详细数据的爬取,因为涉及到点击事件触发之后才能爬取到某些数据,本人爬虫功底不是很厚,也不太熟悉一些爬虫框架,就没有增加学习成本。所以就是单纯的爬取到该药品连接,再次进行html返回,然后爬取相关需要的数据,所以爬虫项目运行时间很长,后续如何实在不能忍受如此之慢的爬虫,大家可以自行改写成某些框架的。
(2)build_data.py:项目导入neo4j的脚本,我写代码的时候,注释写的比较清楚,大家自己理解理解,然后根据自己需求更改就可以了。

- chinese_rbtl3文件夹:

使用的是RBTL3,chinese预训练模型:https://github.com/ymcui/Chinese-BERT-wwm/
毕业设计第二次总结(基于知识图谱的医疗问答)_第3张图片
.ckpt:模型权重,.meta模型meta信息,.index模型index信息,.json模型参数,.txt词表
注意:模型使用BertTokenizer以及BertModel加载。

- CMID-master文件夹:

意图识别模型主要数据来源,选取了其中给的18个类型,把数据单独拿出来做模型训练。链接:https://github.com/liutongyang/CMID

- common文件夹:

在这里插入图片描述
因为本项目还有一个前端交互式的web界面,所以在做项目的时候尽可能考虑的周全一些,common文件夹下都是一些相关的方法,例如DataHepler.py做一个版本管理,考虑到项目不同版本按照时间来区分。会在发布的项目上带上时间作为版本号。开发模式下,使用时间作为版本号,生产环境下使用版本文件进行管理,覆盖开发模式的值。Userservice.py是对用户密码进行加密和生产随机加密字符串,因为考虑到如果后续,比如做多轮问答和单独对用户习惯分析,所以先做了一个用户密码加密的函数。目前该demo还没有涉及到账户的问题,大家可以忽视,后续会接着更新这些东西的用途。

- config文件夹:

该文件下有base_setting,local_setting,production_setting三个文件,主要是区分开发模式,本地模型,生产模式对于不同参数区分开来。会写明一些比如domain的设置或者有数据库连接的参数设置等等,区别各类模式不同的参数。目前项目暂时还用不太到,也是为了后续开发做准备。之所以喜欢把这些东西写的比较完备是因为本人感觉开发一个东西就尽可能按照一般企业开发去做好准备,尤其是对于新手来说,这样子才能慢慢熟悉很多东西。

- controllers文件夹:

在这里插入图片描述
正常一个web项目的控制层,简单介绍一下member里面的相关方法。用的框架就是flask,路由就是用来匹配用户的求情地址以及对应的视图函数。member.py里面简单注册了三个路由,/QA就是就简单的返回模板函数页面返回问答界面,/analysis就是对获取到的用户的文本数据进行解析,送入bert和bilstm-crf中做意图识别和槽位填充,返回数据到前端渲染出来。/visual是打算做一个图谱可视化,目前还没做。这个属于拓展功能,后续有时间会做。大家有兴趣的可以直接在我的开源代码上添加修改。

- interceptors文件夹:

一些web项目基本的处理函数,例如用户登录验证,404自定义友好处理等。不用太在意,仅仅是为了完善web前端友好交互写的。

- modules文件夹(重要文件夹):

在这里插入图片描述
(1)LR_GBDT:简单闲聊机器人的相关模型(简单分类器)
毕业设计第二次总结(基于知识图谱的医疗问答)_第4张图片
intent_recong_data文件为自定义的意图训练语料,主要有goodbye,deny,isbot,greet,accept,diagnosis集中类别。后续识别出来的各个类别都有相应的模板回复或者相应的处理策略。
train.py文件:分类器模型训练,用了LR和GBDT,把文本数据进行向量化之后丢给LR模型和GBDT训练,然后进行融合。因为感觉做一下融合效果会好点,简单做了加权融合。
model_weights:机器学习的模型参数。
(2)bilstm-crf
毕业设计第二次总结(基于知识图谱的医疗问答)_第5张图片
checkpoint:模型参数。
cMedQANER:数据来源参考了ChineseBLUE中的CmedQANER用于做实体识别。
bilstm-crf_model.py:简单的bilstm-crf实现,这里的crf是我从github上开源的直接拿来用的,也就是crf_layer.py文件。具体文件里面我都都写了很多详细注释大家可以自己看看。
data_helpers:处理训练数据,把数据处理成模型所需要的的格式,把字符串数据进行onehot映射等。
metrics:用于模型的评估,因为前面模型的crf.accuracy 是每个token的卷曲率,召回率,f1值,我们需要一个实体级别的评估。再做评估的时候需要引入这个里面的一些方法。
train.py:训练模型脚本
start_bilstm.py: 用flask将这个模型发布成api形式。后续使用方便
(3)bert_module_demo
毕业设计第二次总结(基于知识图谱的医疗问答)_第6张图片
bert_module.py:bert模型搭建,代码写了很多详细注释。
data_analysis: 根据项目需求从CMID数据里面筛选出来图谱可以支持的问答类型的数据用于训练。
data_hepler: 因为前几次模型训练效果一般,加上项目需要的问答类型的相关训练数据太少,所以我打算自己生成一些数据,该脚本就是用于生成数据使用。目前训练的模型还没用到,打算下一步优化的时候使用。
start_bert_module: 同样是把该模型发布成api。后续使用方便。
train: 训练数据集,因为数据量不是很多所以就简单地分成了训练集合测试集,验证集和测试集是一个。

- static文件夹:

前端js等文件,目前上传的第一次项目成品,是原生js写的,没用到Vue框架什么的,由于本人水平有限所以做得交互界面观感不是很好,后续是打算进一步优化的时候使用Vue去写。

- templates文件夹:

各个html页面,使用的bootstrap,后续会开发的更加美观,使用户体验更加友好。

- utils文件夹:

定义了多轮对话的核心处理方法,初步打算将每个用户进行登陆之后,保存用户对话信息为json格式,一方面可以用作多轮对话设计,另一方面可以做对单个用户习惯或者口头语分析,使得体验更加有后。该文件脚本暂时还没用到。项目后续在这个基础上会进行优化扩展。

三:后续扩展方向:

因为毕设最基本的雏形已经确定了,起码有个成品。后续下一步就是扩展问答的问题种类,对于当前bert模型训练的数据增加。对于语义槽进一步修改,进行多轮对话的开发,修改问答策略的一些方法。对于web交互方面,前端打算重新用Vue写一遍,并且基本的界面进行优化,增加用户体验。
在这个基础上完成任务后,考虑下一个功能–图谱可视化。
现阶段github开源代码:
https://github.com/1024wangxiao/medical_knowledge_atlas_Q-A
项目简单展示视频:

初版

最后插个题外话,像如果大家经常做一些项目开发,对于项目经常修改,然后突然又想退回到之前的版本,但是自己又没有保存。如果你也有这种烦恼,一定得去试试git,用这个去管理自己的代码,非常nice。最后附上一个git的学习笔记
链接:https://pan.baidu.com/s/13sTx5GdT2fZ6vRnkAxIMQA
提取码:lkfe

你可能感兴趣的:(自然语言处理,知识图谱,问答系统,人工智能,深度学习,python)