大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码)
作者:mmseoamin日期:2023-12-19

大数据知识图谱——基于知识图谱+flask的大数据nlp医疗知识问答系统(全网最详细讲解及源码)

    • 一、项目概述
    • 二、实现知识图谱的医疗知识问答系统基本流程
    • 三、项目工具所用的版本号
    • 四、所需要软件的安装和使用
    • 五、系统实现
      • 数据的抓取与存储
      • 数据处理/数据清洗
      • 知识图谱实体类型
      • 实体关系类型
      • 知识图谱属性类型
      • 医疗问答KBQA查询功能表
      • 构建neo4j知识图谱
      • 知识图谱数据入库
      • 问答系统·支持的问答类型,实现方法与步骤
      • 六、项目启动
        • 项目UI设计
        • 七、用Python实现增删改查 数据查询及维护
          • 用Python实现增加节点
          • 用Python实现修改节点
          • 用Python实现删除节点
          • 用Python实现查询节点
          • 八、结语

            一、项目概述

            知识图谱是将知识连接起来形成的一个网络。由节点和边组成,节点是实体,边是两个实体的关系,节点和边都可以有属性。知识图谱除了可以查询实体的属性外,还可以很方便的从一个实体通过遍历关系的方式找到相关的实体及属性信息。

            基于知识图谱+flask的KBQA医疗问答系统基于医疗方面知识的问答,通过搭建一个医疗领域知识图谱,并以该知识图谱完成自动问答与分析服务。 基于知识图谱+flask的KBQA医疗问答系统以neo4j作为存储,基于传统规则的方式完成了知识问答,并最终以关键词执行cypher查询,并返回相应结果查询语句作为问答。后面我又设计了一个简单的基于 Flask 的聊天机器人应用,利用nlp自然语言处理,通过医疗AI助手根据用户的问题返回结果,用户输入和系统返回的输出结果都会一起自动存储到sql数据库。

            该问答系统完全基于规则匹配实现,通过关键词匹配,对问句进行分类,医疗问题本身属于封闭域类场景,对领域问题进行穷举并分类,然后使用cypher的match去匹配查找neo4j,根据返回数据组装问句回答,最后返回完整结果。

            二、实现知识图谱的医疗知识问答系统基本流程

            1、Node4j软件的安装和使用。

            2、数据预处理方法。

            3、Python处理数据方法。

            4、能够实现一个知识图谱问答系统。

            5、设计一个基于 Flask 的聊天机器人AI助手。

            6、设计数据自动存储到sql数据库。

            三、项目工具所用的版本号

            Neo4j版本:Neo4j Desktop1.4.15;

            neo4j里面医疗系统数据库版本:4.4.5;

            Pycharm版本:2021;

            JDK版本:jdk1.8.0_211;

            MongoDB版本:MongoDB-windows-x86_64-5.0.14;

            flask版本:3.0.0

            四、所需要软件的安装和使用

            (一)安装JAVA

            1.下载java安装包:

            官网下载链接:https://www.oracle.com/java/technologies/javase-downloads.html

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第1张

            本人下载的版本为JDK-1.8,JDK版本的选择一定要恰当,版本太高或者太低都可能导致后续的neo4j无法使用。

            安装好JDK之后就要开始配置环境变量了。 配置环境变量的步骤如下:

            右键单击此电脑—点击属性—点击高级系统设置—点击环境变量

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第2张

            在下方的系统变量区域,新建环境变量,命名为JAVA_HOME,变量值设置为刚才JAVA的安装路径,我这里是C:\Program Files\Java\jdk1.8.0_211

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第3张

            编辑系统变量区的Path,点击新建,然后输入 %JAVA_HOME%\bin

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第4张

            打开命令提示符CMD(WIN+R,输入cmd),输入 java -version,若提示Java的版本信息,则证明环境变量配置成功。

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第5张

            2.安装好JDK之后,就可以安装neo4j了

            2.1 下载neo4j

            官方下载链接:https://neo4j.com/download-center/#community

            也可以直接下载我上传到云盘链接:

            Neo4j Desktop Setup 1.4.15.exe

            链接:https://pan.baidu.com/s/1eXw0QjqQ9nfpXwR09zLQHA?pwd=2023

            提取码:2023

            打开之后会有一个自己设置默认路径,可以根据自己电脑情况自行设置,然后等待启动就行了

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第6张

            打开之后我们新建一个数据库,名字叫做:“基于医疗领域的问答系统”

            详细信息看下图:

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第7张

            数据库所用的是4.4.5版本,其他数据库参数信息如下:

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第8张

            五、项目结构整体目录

            ├── pycache \\编译结果的保存目录

            │ │ ├── answer_search.cpython-39.pyc

            │ │ ├── question_classifier.cpython-39.pyc

            │ │ │── 基于问句解析.cpython-39.pyc

            │ │ │── 基于问句解析结果查询.cpython-39.pyc

            │ │ │── 基于问题分类.cpython-39.pyc

            ├── data\本项目的数据

            │ └── medical.json \本项目的数据,通过build_medicalgraph.py导neo4j

            ├── dict

            │ ├── check.txt \诊断检查项目实体库

            │ ├── deny.txt \否定词词库

            │ ├── department.txt \医疗科目实体库

            │ ├── disease.txt \疾病实体库

            │ ├── drug.txt \药品实体库

            │ ├── food.txt \食物实体库

            │ ├── producer.txt \在售药品库

            │ └── symptom.txt \疾病症状实体库

            ├── prepare_data \爬虫及数据处理

            │ ├──__pycache__

            │ ├── build_data.py \数据库操作脚本

            │ ├── data_spider.py \网络资讯采集脚本

            │ └── max_cut.py \基于词典的最大向前/向后脚本

            │ ├── 处理后的medical数据.xlsx

            │ ├── MongoDB数据转为json格式数据文件.py

            │ ├──从MongoDB导出的medical.csv

            │ ├──data.json #从MongoDB导出的json格式数据

            ├── static \静态资源文件

            ├── templates

            │ ├──index.html \问答系统前端UI页面

            ├── app.py \启动flask问答AI脚本主程序

            ├── question_classifier.py \问句类型分类脚本

            ├── answer_search.py \基于问题答复脚本

            ├── build_medicalgraph.py \构建医疗图谱脚本

            ├── chatbot_graph.py \医疗AI助手问答系统机器人脚本

            ├── question_parser.py [\基于问句解析脚本](file://基于问句解析脚本)

            ├── 删除所有关系.py \可有可无的脚本文件

            ├── 删除关系链.py \可有可无的脚本文件

            ├── 两节点新加关系.py \可有可无的脚本文件

            ├── 交互 匹配所有节点.py \可有可无的脚本文件

            这里chatbot_graph.py脚本首先从需要运行的chatbot_graph.py文件开始分析。

            该脚本构造了一个问答类ChatBotGraph,定义了QuestionClassifier类型的成员变量classifier、QuestionPase类型的成员变量parser和AnswerSearcher类型的成员变量searcher。

            question_classifier.py脚本构造了一个问题分类的类QuestionClassifier,定义了特征词路径、特征词、领域actree、词典、问句疑问词等成员变量。question_parser.py问句分类后需要对问句进行解析。该脚本创建一个QuestionPaser类,该类包含三个成员函数。

            answer_search.py问句解析之后需要对解析后的结果进行查询。该脚本创建了一个AnswerSearcher类。与build_medicalgraph.py类似,该类定义了Graph类的成员变量g和返回答案列举的最大个数num_list。该类的成员函数有两个,一个查询主函数一个回复模块。

            问答系统框架的构建是通过chatbot_graph.py、answer_search.py、question_classifier.py、question_parser.py等脚本实现。

            五、系统实现

            数据的抓取与存储

            安装MongoDB数据库:

            MongoDB官方下载地址:

            https://www.mongodb.com/try

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第9张

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第10张

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第11张

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第12张

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第13张

            安装完成:

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第14张

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第15张

            然后我们进行MongoDB的环境配置:

            在变量Path里加入E:\MongoDB\bin

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第16张

            打开终端(cmd)输入mongod --dbpath E:\MongoDB\data\db

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第17张

            在浏览器输入

            127.0.0.1:27017
            

            查看MongoDB服务是否启动成功:

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第18张

            安装好MongoDB之后开始爬取数据:

            数据来源于寻医问药网:http://jib.xywy.com/

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第19张

            具体的疾病详情页面如下:

            首先对网址上的疾病链接进行分析,以感冒为例:

            感冒的链接:http://jib.xywy.com/il_sii_38.htm

            大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第20张

            可以看到,上面包含了疾病的简介、病因、预防、症状、检查、治疗、并发症、饮食保健等详情页的内容。下面我们要使用爬虫把信息收集起来。要收集 url 下面对应的数据,具体爬虫代码如下:

            之前老版本的insert方法被弃用,再用会出现警告。insert 替换为了 insert_one,这样就不会再收到关于 insert 方法被弃用的警告了。

            '''基于寻医问药的医疗数据采集'''
            # 使用 insert_one 或 insert_many 方法。提供了更多的灵活性,并且支持更多的功能,比如插入后返回的文档的 _id 值。
            class MedicalSpider:
                def __init__(self):
                    self.conn = pymongo.MongoClient()
                    self.db = self.conn['medical2']
                    self.col = self.db['data']
                def insert_data(self, data):
                    # 使用 insert_one 方法插入单个文档
                    self.col.insert_one(data)
            

            根据url,请求html

            用于获取指定 URL 的 HTML 内容的函数,使用了 Python 的 requests 库。在这个代码中,设置请求的头部信息(User-Agent),代理信息(proxies),然后使用 requests.get 方法获取页面内容,并指定了编码为 ‘gbk’。

            '''根据url,请求html'''
            def get_html(self,url):
                headers = {
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
                }
                proxies = {
                    'http': None,
                    'https': None
                }
                html = requests.get(url=url, headers=headers, proxies=proxies)
                html.encoding = 'gbk'
                return html.text
            

            爬取医疗相关的信息,包括疾病描述、疾病预防、疾病症状、治疗方法等。

            url_parser 函数

            def url_parser(self, content):
                selector = etree.HTML(content)
                urls = ['http://www.anliguan.com' + i for i in selector.xpath('//h2[@]/a/@href')]
                return urls
            

            url_parser 函数函数的作用是解析传入的 HTML 内容,提取出页面中疾病相关的链接。具体来说:

            • etree.HTML(content): 使用 lxml 库中的 etree 模块将 HTML 内容转换成可被 XPath 解析的对象。
            • selector.xpath('//h2[@]/a/@href'): 使用 XPath 选择器提取所有

              标签中 class 属性为 "item-title" 的子节点 的 href 属性,得到的是一组相对链接。

            • ['http://www.anliguan.com' + i for i in ...]: 将相对链接转换成完整的链接,拼接在 'http://www.anliguan.com' 前面。

              这个函数的作用是解析传入的 HTML 内容,提取出页面中疾病相关的链接。具体来说:

              spider_main函数是主要的爬虫逻辑,循环遍历页面,爬取不同类型的医疗信息,并将结果存储到数据库中

              '''url解析'''
              def url_parser(self,content):
                  selector=etree.HTML(content)
                  urls=['http://www.anliguan.com'+i for i in selector.xpath('//h2[@]/a/@href')]
                  return urls
              '''主要的爬取的链接'''
              def spider_main(self):
                  # 收集页面
                  for page in range(1,11000):
                      try:
                          basic_url='http://jib.xywy.com/il_sii/gaishu/%s.htm'%page # 疾病描述
                          cause_url='http://jib.xywy.com/il_sii/cause/%s.htm'%page # 疾病起因
                          prevent_url='http://jib.xywy.com/il_sii/prevent/%s.htm'%page # 疾病预防
                          symptom_url='http://jib.xywy.com/il_sii/symptom/%s.htm'%page #疾病症状
                          inspect_url='http://jib.xywy.com/il_sii/inspect/%s.htm'%page # 疾病检查
                          treat_url='http://jib.xywy.com/il_sii/treat/%s.htm'%page # 疾病治疗
                          food_url = 'http://jib.xywy.com/il_sii/food/%s.htm' % page # 饮食治疗
                          drug_url = 'http://jib.xywy.com/il_sii/drug/%s.htm' % page #药物
                          
              
              • basic_url、symptom_url、food_url、drug_url 和 cause_url 是根据 page 变量构建的不同 URL 地址,用于访问和爬取不同类型信息的网页。

                - data 是一个字典,用于存储从不同 URL 中获取的数据。

                2. 对不同 URL 进行爬取和信息提取:

                - data['basic_info'] = self.basicinfo_spider(basic_url):调用 basicinfo_spider 方法,从 basic_url 获取基础信息,并将其存储在 data 字典的 'basic_info' 键下。

                - data['symptom_info'] = self.symptom_spider(symptom_url):类似地,获取症状信息并存储在 'symptom_info' 键下。

                - data['food_info'] = self.food_spider(food_url):获取饮食信息并存储在 'food_info' 键下。

                - data['drug_info'] = self.drug_spider(drug_url):获取药物信息并存储在 'drug_info' 键下。

                - data['cause_info'] = self.cause_spider(cause_url):获取病因信息并存储在 'cause_info' 键下。

                3. 打印和数据库存储:

                - print(page, basic_url):打印当前页面和基础 URL,用于调试和跟踪程序执行过程。

                - print(data):打印从不同 URL 获取的数据,同样用于调试和查看程序执行结果。

                - self.col.insert_one(data):将获取的数据存入 MongoDB 数据库中。

                4. 异常处理:

                - except Exception as e::捕获所有类型的异常,并将异常对象赋值给变量 e。

                - print(e, page):在捕获到异常时打印异常信息和页面信息,以便于调试和追踪出错的原因。

                        data={}
                        data['url'] = basic_url
                        data['basic_info'] = self.basicinfo_spider(basic_url)
                        data['cause_info'] = self.common_spider(cause_url)
                        data['prevent_info'] = self.common_spider(prevent_url)
                        data['symptom_info'] = self.symptom_spider(symptom_url)
                        data['inspect_info'] = self.inspect_spider(inspect_url)
                        data['treat_info'] = self.treat_spider(treat_url)
                        data['food_info'] = self.food_spider(food_url)
                        data['drug_info'] = self.drug_spider(drug_url)
                        print(page, basic_url)
                        self.col.insert_one(data)
                    except Exception as e:
                        print(e,page)
                

                需要爬取的信息包括疾病名、所属目录、症状、治疗方案等等,都可以从页面上获取。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第21张

                MongoDB里面的数据也是刷新显示最新数据记录

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第22张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第23张

                我们随便点一个我们爬取的网页链接,点击查看网页详情:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第24张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第25张

                综上内容所述,这里做一个总结

                这里代码爬虫的主要功能是爬取疾病相关的信息,并将数据存储到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方法用于解析疾病的检查信息。common_spider方法用于解析通用模块下的内容,如疾病预防和疾病起因。

                在spider_main方法中,通过循环遍历页面,构造不同类型的URL,并调用相应的方法进行数据采集。采集到的数据以字典的形式存储,并插入到MongoDB数据库中。

                最后,代码调用了MedicalSpider类的实例,并依次调用了inspect_crawl和spider_main方法,完成了数据的采集和存储。

                通过爬取寻医问药网站的相关页面,获取疾病的基本信息、治疗信息、药物信息、食物信息、症状信息和检查信息,并将数据存储到MongoDB数据库中。

                结束之后我们可以在MongoDB数据库中查看我们爬取到的疾病链接和解析出的网页内容:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第26张

                数据处理/数据清洗

                这里是用于中文分词的工具类,名为CutWords。它实现了最大向前匹配、最大向后匹配和双向最大匹配三种分词算法。在类的构造函数中,它首先初始化了一个词典路径,并调用load_words方法加载词典。load_words方法读取词典文件,将词语存储到一个列表中,并记录词语的最大长度。

                max_forward_cut方法实现了最大向前匹配算法。它从左向右遍历待切分的中文句子,根据词典中的词语进行匹配。如果匹配成功,则将匹配的词语作为一个词切分出来。如果没有匹配成功,则按字符切分。最后,返回切分结果。

                max_backward_cut方法实现了最大向后匹配算法。它从右向左遍历待切分的中文句子,根据词典中的词语进行匹配。如果匹配成功,则将匹配的词语作为一个词切分出来。如果没有匹配成功,则按字符切分。最后,将切分结果倒序返回。

                max_biward_cut方法实现了双向最大匹配算法。它先调用max_forward_cut方法和max_backward_cut方法分别得到正向和逆向的切分结果。然后,根据启发式规则比较两种切分结果,决定正确的分词方法。如果正向和逆向的切分结果词数不同,则选择词数较少的那个。如果词数相同,则根据单字数量选择切分结果。

                双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法。

                启发式规则:

                1.如果正反向分词结果词数不同,则取分词数量较少那个;

                2.如果分词结果词数相同:

                a.分词结果相同,说明没有歧义,可以返回任意一个结果;

                b.分词结果不同,返回其中单字较少的那个。

                总的来说,这段代码实现了三种中文分词算法:最大向前匹配、最大向后匹配和双向最大匹配。它可以根据不同的需求选择合适的分词方法。这里是用于中文分词的工具类,名为CutWords。它实现了最大向前匹配、最大向后匹配和双向最大匹配三种分词算法。在类的构造函数中,它首先初始化了一个词典路径,并调用load_words方法加载词典。load_words方法读取词典文件,将词语存储到一个列表中,并记录词语的最大长度。

                max_forward_cut方法实现了最大向前匹配算法。它从左向右遍历待切分的中文句子,根据词典中的词语进行匹配。如果匹配成功,则将匹配的词语作为一个词切分出来。如果没有匹配成功,则按字符切分。最后,返回切分结果。

                max_backward_cut方法实现了最大向后匹配算法。它从右向左遍历待切分的中文句子,根据词典中的词语进行匹配。如果匹配成功,则将匹配的词语作为一个词切分出来。如果没有匹配成功,则按字符切分。最后,将切分结果倒序返回。

                max_biward_cut方法实现了双向最大匹配算法。它先调用max_forward_cut方法和max_backward_cut方法分别得到正向和逆向的切分结果。然后,根据启发式规则比较两种切分结果,决定正确的分词方法。如果正向和逆向的切分结果词数不同,则选择词数较少的那个。如果词数相同,则根据单字数量选择切分结果。

                双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法。

                启发式规则:

                1.如果正反向分词结果词数不同,则取分词数量较少那个;

                2.如果分词结果词数相同:

                a.分词结果相同,说明没有歧义,可以返回任意一个结果;

                b.分词结果不同,返回其中单字较少的那个。

                总的来说,这段代码实现了三种中文分词算法:最大向前匹配、最大向后匹配和双向最大匹配。它可以根据不同的需求选择合适的分词方法。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第27张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第28张

                然后我们运行build_data.py脚本,通过collect_medical函数完成数据的收集整理工作。

                再将整理好的数据重新存入数据库中。在init文件里配置数据库连接,找到当前文件所在的目录,指定连接的数据库及其下面的collection。大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第29张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第30张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第31张

                再利用python脚本导出爬出的医疗数据并设置格式为data.json格式文件:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第32张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第33张

                处理数据后对应的图谱系统数据关键词:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第34张

                将从MongoDB导出的data.json数据格式处理之后保存为medical.json和medical2.json文件,其中medical2.json为medical.json中的部分数据。

                考虑到构建全部知识图谱需要很久,所以取出一部分数据(medical2.json)先进行构建图谱。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第35张

                处理后结构化的数据保存到excel文件:大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第36张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第37张

                3)所搭建的系统框架,包括知识图谱实体类型,实体关系类型,知识图谱属性类型等。

                知识图谱实体类型

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第38张

                一般来说,一个医疗知识图谱问答系统Schema包括以下几个部分:

                实体:指代医疗领域中的具体概念或对象,如药品、疾病、症状等。

                属性:指代实体的特征或描述,如药品的成分、剂型、适应症等。

                关系:指代实体之间的联系或影响,如疾病与药物的治疗关系、食物的忌吃关系等。

                问题:指代用户对医疗领域的信息需求,如“高血压应该吃什么药?”、“感冒有哪些常见的症状?”等。

                答案:指代针对问题的回复或解释,如“高血压可以服用降压药物,如氨氯地平片、硝苯地平片等。”、“感冒常见的症状有发热、咳嗽、流鼻涕等。”等。

                departments = [] #科室
                        diseases = []  # 疾病
                        drugs = []  # 药品
                        foods = []  # 食物
                        producers = [] #药品大类
                        symptoms = []#症状
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第39张

                实体关系类型

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第40张

                # 构建节点实体关系,共11类,medical2做出来的只有10类,因为数据量少
                        rels_department = []
                        rels_noteat = [] # 疾病-忌吃食物关系
                        rels_doeat = [] # 疾病-宜吃食物关系
                        rels_recommandeat = [] # 疾病-推荐吃食物关系
                        rels_commonddrug = [] # 疾病-通用药品关系
                        rels_recommanddrug = [] # 疾病-热门药品关系
                        rels_check = [] # 疾病-检查关系
                        rels_drug_producer = [] # 厂商-药物关系
                        rels_symptom = [] #疾病症状关系
                        rels_acompany = [] # 疾病并发关系
                        rels_category = [] # 疾病与科室之间的关系
                

                知识图谱属性类型

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第41张

                医疗问答KBQA查询功能表

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第42张

                4)导入Neo4j数据库,生成图谱。

                新建一个数据库:基于医疗领域的问答系统大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第43张

                构建neo4j知识图谱

                开启Node4j数据库:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第44张

                连接数据库 通过bolt协议(数据传输更快)

                对绝对路径进行拼接 获取json文件路径 这里使用的Json为部分数据量,这里数据txt和json格式都有,我们用json就可以了。

                连接我们所建的neo4j数据库:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第45张

                知识图谱数据入库

                根据字典形式的数据创建结点,以疾病为中心定义关系形成三元组表示的知识,将结点和关系导入neo4j数据库形成知识图谱,通过运行build_medicalgraph.py脚本构建图谱:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第46张

                建立实体关系类型:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),w,第47张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第48张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第49张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第50张

                该脚本构建了一个MedicalGraph类,定义了Graph类的成员变量g和json数据路径成员变量data_path。

                建立的图谱实体关系和属性类型数量有点多,需要等待一会。耐心等待就可以,因为我们这个爬取的数据量大,知识图谱如果数据量不足,构建的实体关系和属性类型再多再合适也没用,大数据下的知识图谱才有更强的问答能力。

                建立的图谱实体关系和属性类型数量有点多,需要等待一会。大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第51张

                脚本运行完之后查看neo4j数据库中构建的知识图谱:

                 match (n) return n
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第52张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第53张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第54张

                提示:Not all return nodes are being displayed due to Initial Node Display setting. Only 3000 of 44112 nodes are being displayed

                由于“初始节点显示”设置,并非所有返回节点都显示。44112个节点中仅显示3000个

                这里因为我设置的参数只显示前3000个,4万多个节点只显示了一部分。

                对于单个节点分析是先建一个label为disease、name为疾病名称的node,property方面包括prevent、cure_way、cause等等,另外,对于症状、科室、检查方法等信息都建立单独的node,同时通过has_symptom、belongs_to、need_check等关联把它们和疾病名称关联起来,因为疾病之间存在并发关系,疾病之间也可以通过症状串联起来,所以最后我们利用大量的

                医疗数据,就能构建一个大型的医疗知识图谱:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第55张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第56张

                提示:Started streaming 44112 records in less than 1 ms and completed in less than 1 ms.

                在不到1毫秒内开始流式传输44112条记录,并在不到1秒内完成。

                5)Python 与Neo4j的交互实现。

                连接Node4j数据库:

                from py2neo import Graph
                class AnswerSearcher:
                    def __init__(self):#调用数据库进行查询
                        # self.g = Graph("bolt://localhost:7687", username="neo4j", password="123456")#老版本neo4j
                        self.g = Graph("bolt://localhost:7687", auth=("neo4j", "123456"))#输入自己修改的用户名,mima
                        self.num_limit = 20#最多显示字符数量
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第57张

                创建图对象:

                class MedicalGraph:
                    def __init__(self):
                        cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
                        self.data_path = os.path.join(cur_dir, 'data/medical.json')
                        # self.g = Graph("http://localhost:7474", username="neo4j", password="123456")
                        self.g = Graph("bolt://localhost:7687", auth=("neo4j", "123456"))
                        
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第58张

                增加node节点:

                 def create_node(self, label, nodes):
                        count = 0
                        for node_name in nodes:
                            node = Node(label, name=node_name)
                            self.g.create(node)
                            count += 1
                            print(count, len(nodes))
                        return
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第59张

                创建实体关系:

                  def create_graphrels(self):
                        Drugs, Foods, Checks, Departments, Producers, Symptoms, Diseases, disease_infos, rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug,rels_symptom, rels_acompany, rels_category = self.read_nodes()
                        self.create_relationship('Disease', 'Food', rels_recommandeat, 'recommand_eat', '推荐食谱')#调用下面的关系边创建函数
                        self.create_relationship('Disease', 'Food', rels_noteat, 'no_eat', '忌吃')
                        self.create_relationship('Disease', 'Food', rels_doeat, 'do_eat', '宜吃')
                        self.create_relationship('Department', 'Department', rels_department, 'belongs_to', '属于')
                        self.create_relationship('Disease', 'Drug', rels_commonddrug, 'common_drug', '常用药品')
                        self.create_relationship('Producer', 'Drug', rels_drug_producer, 'drugs_of', '生产药品')
                        self.create_relationship('Disease', 'Drug', rels_recommanddrug, 'recommand_drug', '好评药品')
                        self.create_relationship('Disease', 'Check', rels_check, 'need_check', '诊断检查')
                        self.create_relationship('Disease', 'Symptom', rels_symptom, 'has_symptom', '症状')
                        self.create_relationship('Disease', 'Disease', rels_acompany, 'acompany_with', '并发症')
                        self.create_relationship('Disease', 'Department', rels_category, 'belongs_to', '所属科室')
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第60张

                更新节点:

                更新先要找出Nodes,再使用事务的push更新

                from py2neo import Graph, Node, Relationship, NodeMatcher, Subgraph
                g = Graph('http://localhost:7687', auth=("neo4j", "123456"))
                from py2neo import Graph, NodeMatcher
                tx = g.begin()# 找到要找的Nodes
                matcher = NodeMatcher(g)
                init_node = matcher.match("Person", name="节点名称")
                new_node = init_node.first()
                new_node['name'] = "新的节点名称"
                sub = Subgraph(nodes=[new_node])
                tx.push(sub)
                g.commit(tx)
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第61张

                删除关系链(节点也会删除):

                from py2neo import Graph, Node, Relationship, NodeMatcher, Subgraph, RelationshipMatcher
                g = Graph('http://localhost:7687', auth=("neo4j", "123456"))
                matcher = NodeMatcher(g)
                r_matcher = RelationshipMatcher(g)
                fugui = matcher.match('Person', name='name1').first()
                youqian = matcher.match('Person', name='name2').first()
                relation = r_matcher.match(nodes=[fugui, youqian]).first() #也可以是none,表示任意节点
                print(relation)
                g.delete(relation)
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第62张

                两个节点新加关系:

                from py2neo import Graph, Node, Relationship, NodeMatcher, Subgraph
                g = Graph('http://localhost:7687', auth=("neo4j", "123456"))
                matcher = NodeMatcher(g)
                fugui = matcher.match('Person', name='节点名称1').first()
                youqian = matcher.match('Person', name='节点名称2').first()
                relation = Relationship(节点名称1, '所要建立的关系', 节点名称2)
                g.create(relation)
                

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第63张

                问答系统·支持的问答类型,实现方法与步骤

                本项目问答对话系统的分析思路,整体上接近一个基于规则的对话系统,首先我们需要对用户输入进行分类,其实就是分析用户输入涉及到的实体及问题类型,也就是Neo4j中的node、property、relationship,然后我们利用分析出的信息,转化成Neo4j的查询语句,最后再把查询的结果返回给用户,就完成了一次问答。

                本项目问答系统支持的问答类型:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第64张

                问答系统整体上涉及到三个模块,问题的分类、问题的解析以及回答的搜索。

                对于property和relationship,我们先预设定一系列的问句疑问词,从而对问句的每个词进行对比分析,判断出问句的类型大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第65张

                然后,根据问句的类型和之前识别出来的实体,基于规则推断出property和relationship:大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第66张

                把问题转化为Neo4j的Cypher语句,其实也是预先写好Cypher语句的模板,根据实际的情况把之前分析得到的node、property、relationship填入Cypher语句中进行查询。大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第67张

                得到了Cypher语句,我们就能连接Neo4j数据库进行查询,得到结果之后,还需要对语句进行一点微调,根据对应的qustion_type,调用相应的回复模板:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第68张

                六、项目启动

                问答框架包含问句分类、问句解析、查询结果三个步骤,具体一步步分析。

                首先是问句分类,是通过question_classifier.py脚本实现的。

                再通过question_parser.py脚本进行问句分类后对问句进行解析。

                然后通过answer_search.py脚本对解析后的结果进行查询

                最后通过app.py脚本进行问答实测。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第69张

                这个chatbot_graph脚本是整个问答系统的主程序。首先创建了一个ChatBotGraph类,其中包含了问题分类器(QuestionClassifier)、问题解析器(QuestionPaser)和答案搜索器(AnswerSearcher)的实例。然后定义了一个chat_main方法,用于处理用户输入的问题。在chat_main方法中,首先将用户输入的问题进行分类,得到分类结果res_classify。如果没有找到对应的分类,直接返回初始答案。接下来,将分类结果传入问题解析器进行解析,得到SQL查询语句res_sql。然后,将SQL查询语句传入答案搜索器进行搜索,得到最终的答案final_answers。最后,根据搜索结果,如果没有找到合适的最终答案,返回初始答案;否则,将最终答案连接成一个字符串,返回给用户。

                在主程序文件里面的__main__中,创建了一个ChatBotGraph对象,并通过循环不断接收用户的问题,并调用chat_main方法进行回答。

                当我们执行chatbot_graph.py主程序,实现知识图谱医疗问答:

                “请输入您所要咨询的问题医疗AI助手会帮您解决:”

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第70张

                我们输入一个简单的问题:感冒应该怎么治疗?

                问答系统返回的结果如下:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第71张

                再试试其它的问题:比如什么是苯中毒等等

                问答系统返回结果如下:

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第72张

                经过测试本问答系统能回答的问题有很多,基于问句中存在的关键词回答效果表现很好。做出来的基于知识图谱的医疗知识问答系统能够根据用户提出的问题很好的进行解答。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第73张

                做出来的问答系统还是很Nice的。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第74张

                基于很多粉丝私信我做一个简单的flask前端问答,方便一些小伙伴云平台部署。我设计了一个简单的基于 Flask 的聊天机器人应用app.py,并且用户提交的问题数据和问答系统返回的数据都会自动存储到mysql,如果想存储到其他数据库也可以自行修改。这里mysql创建表比较简单就不介绍了。

                项目UI设计

                先导入所需模块

                from flask import Flask, render_template, request
                import mysql.connector
                

                创建一个Flask应用程序实例

                app = Flask(__name__)
                

                然后进行sql数据库连接,主机名、用户、mima和sql数据库名称根据实际情况自行更改。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第75张

                将用户输入和问答系统返回结果输出一起插入sql数据库

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第76张

                这里我设计了两个路由:

                @app.route(‘/’)装饰器定义了一个路由,当用户访问根路径时,会调用index()函数并返回一个名为index.html的模板页面。

                另外,@app.route(‘/ask’, methods=[‘POST’])装饰器定义了另一个路由,当用户通过POST方法提交一个表单到/ask路径时,会调用ask()函数。这个函数获取用户在表单中输入的问题,然后通过调用handler.chat_main(question)方法来获取问题的答案。接着,它将用户的问题和答案插入到一个名为chat_logs的SQL数据库表中,并将结果渲染到index.html模板页面中返回给用户

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第77张

                然后核心部分还是我们的ChatBotGraph 类:这是聊天机器人的核心类。init() 方法初始化了 QuestionClassifier、QuestionPaser 和 AnswerSearcher 三个类的实例。chat_main() 方法接收用户输入的问题 sent,首先使用 QuestionClassifier 对问题进行分类,然后使用 QuestionPaser 对分类结果进行解析,生成 SQL 语句,最后使用 AnswerSearcher 对 SQL 语句进行搜索,得到最终答案 final_answers。最后当我们这个脚本被直接执行时,启动 Flask 应用程序,并在调试模式下运行。如果脚本被作为模块导入,app.run(debug=True) 将不会执行,因此不会启动 Flask 服务器。

                if __name__ == '__main__':
                    app.run(debug=True)
                

                添加了两个文件夹,里面是对flask前端页面的渲染,主要是一些静态文件的放置,如果想加入更多动态页面的设计和js逻辑可以放置到这里,注意哦在flask框架中要引用对应的Flask模板语法{{ url_for(‘static’, filename=‘css/styles.css’) }}来生成样式表文件的路径,不然运行会显示找不到我们的样式文件。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第78张

                在系统页面加了一个显示时间的js逻辑代码,定义了一个名为time的函数,并使用setTimeout函数在页面加载后延迟1秒钟开始执行该函数。time函数的作用是更新页面中具有类名为showTime的元素的内容,这里我设置的是time函数每隔1秒钟执行一次,实现定时更新页面中的时间显示。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第79张

                控制台启动问答系统没问题,启动我们设计的flask框架UI节目进行问答,neo4j数据库打开、mysql数据库连接没问题、问答系统所需要的包都安装,各种环境都没问题,直接启动app.py脚本

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第80张

                本地地址 http://127.0.0.1:5000/

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第81张

                加入了动态UI设计,整体页面展示效果还是挺好的

                我们问一些医学上的问题,医学AI助手会进行回答,然后数据自动存储到sql数据库中的chat_logs表。

                比如:“氢溴酸东莨菪碱片能治疗什么?”

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第82张

                医疗AI助手返回回答结果

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第83张

                数据库中的表数据也是自动添加。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第84张

                整体的代码逻辑和页面效果都是很不错的!背景图也是找了很久才找到页面效果整洁美观的。

                这里我增加了一个问答机器人的动态效果,在控制台问答和UI问答都是没有问题的!

                七、用Python实现增删改查 数据查询及维护

                用Python实现增加节点

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第85张

                用Python实现修改节点

                update_node 方法用于更新节点。它接收要更新的节点的 ID 和新的属性作为参数,并返回更新后的节点。你可以将 node_id_to_update 更改为你想要更新的节点的实际 ID,将 updated_properties 更改为你想要设置的新属性,然后调用 update_node 方法即可修改节点。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第86张

                用Python实现删除节点

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第87张

                用Python实现查询节点

                find_node_by_property 方法接收节点属性的键和值作为参数,然后执行一个 Cypher 查询,查找具有指定属性的节点。查询使用 MATCH 子句和 WHERE 子句来过滤节点,然后返回符合条件的节点。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第88张

                八、结语

                本项目的知识图谱的自动问答拆分为2 个主要步骤:命名实体识别步骤和属性映射步骤。其中,实体识别步骤的目的是找到问句中询问的实体名称,而属性映射步骤的目的在于找到问句中询问的相关属性。你说这个实体识别就是识别出文本中表示医疗实体的词语,如疾病、药物等。这个实体关系抽取是从医疗文本中识别出实体对,并标注它们之间的语义关系,从而构建知识图谱的三元组。

                这里问答系统的主要特征是知识图谱,系统依赖一个或多个领域的实体,并基于图谱进行推理或演绎,深度回答用户的问题,更擅长回答知识性问题,与基于模板的聊天机器人有所不同的是它更直接、直观的给用户答案。本项目问答系统没有复杂的算法,一般采用模板匹配的方式寻找匹配度最高的答案,可以直接给出答案。整体做的还是很nice!

                本文只是详细文档的简要概述,感兴趣的小伙伴,可以点赞收藏私信我或加下面个人名片要详细的项目开发文档、完整项目源码等资料。

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第89张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第90张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第91张

                大数据知识图谱——基于知识图谱+flask的大数据(KBQA)nlp医疗知识问答系统(全网最详细讲解及源码),在这里插入图片描述,第92张

                后面有时间和精力也会分享更多关于大数据领域方面的优质内容,喜欢的小伙伴可以点赞关注收藏,写博客不易,感谢各位的喜欢与支持!

                欢迎各位小伙伴的来访,有需要的都可以添加个人名片/合作交流!