基于neo4j知识图谱+flask的大数据医疗领域知识问答系统(完整源码+源码解析+开发文档+视频讲解等资料)
一、项目概述
基于知识图谱+flask的KBQA医疗问答系统基于医疗方面知识的问答,通过搭建一个医疗领域知识图谱,并以该知识图谱完成自动问答与分析服务。 基于知识图谱+flask的KBQA医疗问答系统以neo4j作为存储,本系统知识图谱建模使用的最大向前匹配是一种贪心算法,从句首开始匹配,每次选择最长的词语。由于只需一次遍历,因此在速度上相对较快。 算法相对简单,容易实现和理解,不需要复杂的数据结构。 对于中文文本中大部分是左向的情况,最大向前匹配通常能够较好地切分。与最大向前匹配相反,最大向后匹配从句尾开始匹配,每次选择最长的词语。适用于大部分右向的中文文本。双向最大匹配结合了最大向前匹配和最大向后匹配的优势,从两个方向分别匹配,然后选择分词数量较少的一种结果。这种方法综合考虑了左向和右向的特点,提高了切分的准确性,以关键词执行cypher查询,并返回相应结果查询语句作为问答。后面我又设计了一个简单的基于 Flask 的聊天机器人应用,利用nlp自然语言处理,通过医疗AI助手根据用户的问题返回结果,用户输入和系统返回的输出结果都会一起自动存储到sql数据库。
在多模式匹配方面, Aho-Corasick算法专门用于在一个文本中同时搜索多个模式(关键词)。相比于暴力搜索算法,Aho-Corasick算法的时间复杂度较低,在本知识图谱建模问答系统中,性能更为显著。在线性时间复杂度方面,进行预处理的阶段,Aho-Corasick算法构建了一个确定性有限自动机(DFA),使得在搜索阶段的时间复杂度为O(n),其中n是待搜索文本的长度。这种线性时间复杂度使得算法在本应用中非常高效。在灵活性方面, Aho-Corasick算法在构建有限自动机的过程中,可以方便地添加、删除模式串,而不需要重新构建整个数据结构,提高了算法的灵活性和可维护性。
原文链接:大数据知识图谱——基于知识图谱+深度学习的大数据(KBQA)NLP医疗知识问答可视化系统(全网最详细讲解及源码/建议收藏)
二、实现知识图谱的医疗知识问答系统基本流程
-
配置好所需要的环境(jdk,neo4j,pycharm,python等)
-
爬取所需要的医学数据,获取所需基本的医疗数据。
-
对医疗数据进行数据清洗处理。
-
基于贪心算法进行分词策略。
-
关系抽取定义与实体识别。
-
知识图谱建模。
-
基于
Aho-Corasick
算法进行多模式匹配。 -
设计一个基于 Flask 的聊天机器人AI助手。
-
设计用户输入和系统输出记录数据自动存储到sql数据库。
系统部分内容展示及解析(完整资料获取看文末):
具体的疾病详情页面如下:
首先对网址上的疾病链接进行分析,以感冒为例:
感冒的链接:http://jib.xywy.***/il_sii_38.htm
可以看到,上面包含了疾病的简介、病因、预防、症状、检查、治疗、并发症、饮食保健等详情页的内容。下面我们要使用爬虫把信息收集起来。
通过观察可以看出,链接部分 http://jib.xywy.***/il_sii_ 都是相同的,是通过数字的叠加来组成不同的病例。通过string类型的拼接进行循环后可以得到我们需要的内容。
数据收集模块放在/prepare_data文件夹下面。
要收集 url 下面对应的数据,具体爬虫代码如下:
爬取医学数据并将其存储到 MongoDB 数据库中。
之前老版本的insert方法被弃用,再用会出现警告。insert 替换为了 insert_one,这样就不会再收到关于 insert 方法被弃用的警告了。如果你需要一次性插入多个文档,可以使用 insert_many 方法。
# 使用 insert_one 或 insert_many 方法。提供了更多的灵活性,并且支持更多的功能,比如插入后返回的文档的 _id 值。
class MedicalSpider:
def __init__(self):
# 在类初始化时,建立与 MongoDB 数据库的连接
self.conn = pymongo.MongoClient()
# 选择名为 'medical2' 的数据库
self.db = self.conn['medical']
# 在数据库中选择名为 'data' 的集合(类似于关系数据库中的表)
self.col = self.db['data']
def insert_data(self, data):
# 使用 insert_one 方法插入单个文档
self.col.insert_one(data)
- class MedicalSpider:: 定义了一个名为 MedicalSpider 的类。
- def init(self):: 这是类的构造函数,用于在创建类的实例时进行初始化。在初始化过程中,建立了与 MongoDB 数据库的连接,并选择了名为 ‘medical’ 的数据库和名为 ‘data’ 的集合。
- def insert_data(self, data):: 这是一个方法,用于插入数据到 MongoDB 中。它使用了 insert_one 方法,该方法用于插入单个文档(记录)到 MongoDB 集合中。data 参数是要插入的文档数据。
需要爬取的信息包括疾病名、所属目录、症状、治疗方案等等,都可以从页面上获取。
MongoDB里面的数据也是刷新显示最新数据记录
![在这里插入图片描述](https://img-blog.csdnimg.***/direct/ef684bdce53645b88055248552f9c444.png
我们随便点一个我们爬取的网页链接,点击查看网页详情:
这里代码爬虫的主要功能是爬取疾病相关的信息,并将数据存储到MongoDB数据库中。代码的主要结构是一个名为MedicalSpider的类,它包含了各种方法来处理不同类型的数据采集任务。在代码的开头,导入了一些必要的库,如requests、urllib、lxml和pymongo。然后定义了一个MedicalSpider类,该类的构造函数初始化了MongoDB的连接,并指定了要使用的数据库和集合。
接下来是一系列方法,用于实现不同类型的数据采集。其中,get_html方法用于发送HTTP请求并获取网页的HTML内容。url_parser方法用于解析HTML内容,提取出需要的URL。basicinfo_spider方法用于解析疾病的基本信息,如名称、描述和所属目录。treat_spider、drug_spider和food_spider方法分别用于解析治疗信息、药物信息和食物信息。symptom_spider方法用于解析疾病的症状信息。inspect_spider方法用于解析疾病的检查信息。***mon_spider方法用于解析通用模块下的内容,如疾病预防和疾病起因。
在spider_main方法中,通过循环遍历页面,构造不同类型的URL,并调用相应的方法进行数据采集。采集到的数据以字典的形式存储,并插入到MongoDB数据库中。
最后,代码调用了MedicalSpider类的实例,并依次调用了inspect_crawl和spider_main方法,完成了数据的采集和存储。
总的来说,通过爬取寻医问药网站的相关页面,获取疾病的基本信息、治疗信息、药物信息、食物信息、症状信息和检查信息,并将数据存储到MongoDB数据库中。
结束之后我们可以在MongoDB数据库中查看我们爬取到的疾病链接和解析出的网页内容:91496d548148a6a102d46a94d8c.png)
贪心算法策略+Aho-Corasick算法
本次知识图谱建模使用的最大向前匹配是一种贪心算法,从句首开始匹配,每次选择最长的词语。由于只需一次遍历,因此在速度上相对较快。 算法相对简单,容易实现和理解,不需要复杂的数据结构。 对于中文文本中大部分是左向的情况,最大向前匹配通常能够较好地切分。与最大向前匹配相反,最大向后匹配从句尾开始匹配,每次选择最长的词语。适用于大部分右向的中文文本。双向最大匹配结合了最大向前匹配和最大向后匹配的优势,从两个方向分别匹配,然后选择分词数量较少的一种结果。这种方法综合考虑了左向和右向的特点,提高了切分的准确性。
在多模式匹配方面, Aho-Corasick算法专门用于在一个文本中同时搜索多个模式(关键词)。相比于暴力搜索算法,Aho-Corasick算法的时间复杂度较低,在本知识图谱建模问答中,性能更为显著。
在线性时间复杂度方面,进行预处理的阶段,Aho-Corasick算法构建了一个确定性有限自动机(DFA),使得在搜索阶段的时间复杂度为O(n),其中n是待搜索文本的长度。这种线性时间复杂度使得算法在本应用中非常高效。
在灵活性方面, Aho-Corasick算法在构建有限自动机的过程中,可以方便地添加、删除模式串,而不需要重新构建整个数据结构,提高了算法的灵活性和可维护性。
在Cypher查询的效率方面,基于Cypher查询的数据库检索机制在系统中表现出良好的效率。这证明了Cypher查询语言的优越性,以及它在处理医疗知识图谱时的高效性,确保了用户能够快速获取所需的医学信息。
在问答模型用户界面计方面,基于文本的命令行问答设计的成功实现极大地提高了系统的可用性和用户体验。用户可以通过直观且易于导航的界面与系统进行交互,从而更轻松地获取所需的医疗信息。
处理数据后对应的图谱系统数据关键词:
3)所搭建的系统框架,包括知识图谱实体类型,实体关系类型,知识图谱属性类型等。
知识图谱实体类型:
一般来说,一个医疗知识图谱问答系统Schema包括以下几个部分:
实体:指代医疗领域中的具体概念或对象,如药品、疾病、症状等。
属性:指代实体的特征或描述,如药品的成分、剂型、适应症等。
关系:指代实体之间的联系或影响,如疾病与药物的治疗关系、食物的忌吃关系等。
问题:指代用户对医疗领域的信息需求,如“高血压应该吃什么药?”、“感冒有哪些常见的症状?”等。
答案:指代针对问题的回复或解释,如“高血压可以服用降压药物,如氨氯地平片、硝苯地平片等。”、“感冒常见的症状有发热、咳嗽、流鼻涕等。”等。
departments = [] #科室
diseases = [] # 疾病
drugs = [] # 药品
foods = [] # 食物
producers = [] #药品大类
symptoms = []#症状
实体关系类型:
# 构建节点实体关系,共11类,medical2做出来的只有10类,因为数据量少
rels_department = []
rels_noteat = [] # 疾病-忌吃食物关系
rels_doeat = [] # 疾病-宜吃食物关系
rels_re***mandeat = [] # 疾病-推荐吃食物关系
rels_***monddrug = [] # 疾病-通用药品关系
rels_re***manddrug = [] # 疾病-热门药品关系
rels_check = [] # 疾病-检查关系
rels_drug_producer = [] # 厂商-药物关系
rels_symptom = [] #疾病症状关系
rels_a***pany = [] # 疾病并发关系
rels_category = [] # 疾病与科室之间的关系
知识图谱属性类型:
4)导入Neo4j数据库,生成图谱。
新建一个数据库:基于医疗领域的问答系统
开启Node4j数据库:
连接我们所建的neo4j数据库:
知识图谱数据入库:
根据字典形式的数据创建结点,以疾病为中心定义关系形成三元组表示的知识,将结点和关系导入neo4j数据库形成知识图谱,通过运行build_medicalgraph.py脚本构建图谱:
建立实体关系类型:
5a2bb0.png)
该脚本构建了一个MedicalGraph类,定义了Graph类的成员变量g和json数据路径成员变量data_path。
建立的图谱实体关系和属性类型数量有点多,需要等待一会。
项目资料部分截图:
提示:Started streaming 44112 records in less than 1 ms and ***pleted in less than 1 ms.
在不到1毫秒内开始流式传输44112条记录,并在不到1秒内完成。
)问答系统的实现与测试,包括问答系统·支持的问答类型,实现方法与步骤。**
本项目问答对话系统的分析思路,整体上接近一个基于规则的对话系统,首先我们需要对用户输入进行分类,其实就是分析用户输入涉及到的实体及问题类型,也就是Neo4j中的node、property、relationship,然后我们利用分析出的信息,转化成Neo4j的查询语句,最后再把查询的结果返回给用户,就完成了一次问答。
本项目问答系统支持的问答类型:
节点ID查询
以上部分内容展示,需要完整资料可扫码
各位有兴趣的小伙伴可以加下面二完整项目源码和其它相关资料。