# 基于 neo4j 知识图谱和规则匹配的肝病问答系统
该项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含 7 类规模为 4.4 万的知识实体,11 类规模约 30 万实体关系的知识图谱。
原始数据包含 8000 多种病,和肝病相关的有 200 多种病。
> 项目是找的中科院软件所刘焕勇老师在 GitHub 上的开源项目,基于知识图谱的医药领域问答项目
>
> [链接](https://github.com/liuhuanyong/QASystemOnMedicalKG)
## 一、项目介绍
该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本 data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模 4.4 万,实体关系规模 30 万。schema 的设计根据所采集的结构化数据生成,对网页的结构化数据进行 xpath 解析。
项目的数据存储采用 Neo4j 图数据库,问答系统采用了规则匹配方式完成,数据操作采用 neo4j 声明的 cypher。
项目的不足之处在于疾病的引发原因、预防等以大段文字返回,这块可引入事件抽取,可将原因结构化表示出来。
![](https://www.writebug.com/myres/static/uploads/2022/1/9/2f54711c071ccb692c4319f7085b1d94.writebug)
项目主要文件目录如下:
```
├── QASystemOnMedicalKG
├── answer_search.py # 问题查询及返回
├── build_medicalgraph.py # 将结构化json数据导入neo4j
├── chatbot_graph.py # 问答程序脚本
├── QASystemOnMedicalKG/data
├── hepatopathy.json # 肝病知识数据
├── medical.json # 全科知识数据
├── QASystemOnMedicalKG/dict
├── check.txt # 诊断检查项目实体库
├── deny.txt # 否定词库
├── department.txt # 医疗科目实体库
├── disease.txt # 疾病实体库
├── drug.txt # 药品实体库
├── food.txt # 食物实体库
├── producer.txt # 在售药品库
├── symptom.txt # 疾病症状实体库
├── QASystemOnMedicalKG/prepare_data
├── build_data.py # 数据库操作脚本
├── data_spider.py # 数据采集脚本
├── max_cut.py # 基于词典的最大前向/后向匹配
├── question_classifier.py # 问句类型分类脚本
├── question_parser.py # 问句解析脚本
```
## 二、爬虫部分
爬虫部分我没有实际操作,简单看了一下源码。
数据来源为寻医问药网的疾病百科 [http://jib.xywy.com/](http://jib.xywy.com/) 。点入具体的疾病页面如下:
![](https://www.writebug.com/myres/static/uploads/2022/1/9/5b08c1a14b58a447bb442e0be20b5388.writebug)
爬取疾病介绍页的简介、病因、预防、症状、检查、治疗、并发症、饮食保健等详情页的内容。
爬虫模块使用的是 urllib 库,数据存在 MongoDB 数据库中。
其中并发症使用了自己写的 max_cut 匹配脚本中的双向最大向前匹配 `max_biward_cut`。
## 三、知识库部分
知识库包含 7 类规模为 4.4 万的知识实体,11 类规模约 30 万实体关系,具体如下:
![](https://www.writebug.com/myres/static/uploads/2022/1/9/35376211cf2ef53f3b8515fc37be159c.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/9/e16e808da92344430b9a9a43ae265fad.writebug)
(注意:belongs_to 包括 科室属于科室 和 疾病属于科室 两种关系)
![](https://www.writebug.com/myres/static/uploads/2022/1/9/677951081378ed4861c7e9d3e216a160.writebug)
(注意:疾病的属性还包括 cure_department)
知识库的构建是通过 `build_medicalgraph.py` 脚本实现。
### build_medicalgraph.py
该脚本构建了一个 `MedicalGraph` 类,定义了 `Graph` 类的成员变量 `g` 和 JSON 数据路径成员变量 `data_path`。
```python
class MedicalGraph:
def __init__(self):
cur_dir = '\\'.join(os.path.abspath(__file__).split('\\')[:-1]) # 获取当前绝对路径的上层目录 linux中应用'/'split和join
self.data_path = os.path.join(cur_dir, 'data\hepatopathy.json') # 获取json文件路径
self.g = Graph(
host="127.0.0.1", # neo4j 搭载服务器的ip地址,ifconfig可获取到
http_port=7474, # neo4j 服务器监听的端口号
user="neo4j", # 数据库user name,如果没有更改过,应该是neo4j
password="******")
```
类中的函数如下:
#### read_nodes 函数:
读取数据文件
- 定义节点变量(list 类型)
disease_infos 包含了所有的疾病信息,为元素为 disease_dict(dict 类型)的 list
- 定义节点实体关系变量(list 类型)
- 逐行读取 JSON 数据,每行一个 disease_dict(dict 类型),包含疾病的各种属性(注意:除上述 8 种属性还有 cure_department 和 symptom 两种实体也列入疾病 dict 里)
- 对于 JSON 里的字典键,如果是疾病的属性,则加入 disease_dict 中:
- ```
disease_dict['desc'] = data_json['desc']
```
- 如果和疾病有关系,则加入对应的关系列表:
- ```
for acompany in data_json['acompany']:
rels_acompany.append([disease, acompany])
```
- 如果是某个其他实体,则加入对应的实体列表:
- ```
check = data_json['check']
checks += check
```
**注意**:
- symptoms 既是疾病的属性,又有疾病—症状的关系。
- cure_department 在 JSON 中有两种形式,除了添加 cure_department 属性到 disease_dict 实体字典里和 departments 实体列表里。还需要提取关系,如果只有一个科室则直接提取疾病—科室关系(rels_category),如果有两个科室,还需要提取科室—科室关系(rels_department)。
```python
if 'cure_department' in data_json:
cure_department = data_json['cure_department']
if len(cure_department) == 1:
rels_category.append([disease, cure_department[0]])
if len(cure_department) == 2:
big = cure_department[0]
small = cure_department[1]
rels_department.append([small, big]) # 提取科室——科室关系
rels_category.append([disease, small])
disease_dict['cure_department'] = cure_department
departments += cure_department
```
- drug_details 的形式为 `"drug_detail" : [ "惠普森穿心莲内酯片(穿心莲内酯片)", "北京同仁堂百咳静糖浆(百咳静糖浆)"]`,即包括药品名和生产厂商,因为字符串和括号的原因,提取药品—在售药品的关系的方式略有不同:
```python
if 'drug_detail' in data_json:
drug_detail = data_json['drug_detail']
producer = [i.split('(')[0] for i in drug_detail]
rels_drug_producer += [[i.split('(')[0], i.split('(')[-1].replace(')', '')] for i in drug_detail]
producers += producer
```
- 函数返回 set 去重后的所有实体、疾病属性信息和实体间关系。
#### create_graphnodes 函数:
创建知识图谱实体节点类型 schema
首先调用 read_nodes 函数得到存储实体和实体间关系的变量。
知识图谱中主要包含两类节点,一类为中心疾病节点,包含各种疾病属性;一类为普通实体节点,即药品、食物等,不包含属性,分别调用以下两个函数创建:
#### create_diseases_nodes 函数:
创建知识图谱中心疾病的节点
对每一条 disease_infos,调用 py2neo 库中 Graph 类的 create 函数,在 neo4j 中创建 label 为"Diseas
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含 7 类规模为 4.4 万的知识实体,11 类规模约 30 万实体关系的知识图谱。 原始数据包含 8000 多种病,和肝病相关的有 200 多种病。 项目是找的中科院软件所刘焕勇老师在 GitHub 上的开源项目,基于知识图谱的医药领域问答项目 链接 一、项目介绍 该项目的数据来自垂直类医疗网站寻医问药,使用爬虫脚本 data_spider.py,以结构化数据为主,构建了以疾病为中心的医疗知识图谱,实体规模 4.4 万,实体关系规模 30 万。schema 的设计根据所采集的结构化数据生成,对网页的结构化数据进行 xpath 解析。 项目的数据存储采用 Neo4j 图数据库,问答系统采用了规则匹配方式完成,数据操作采用 neo4j 声明的 cypher。 项目的不足之处在于疾病的引发原因、预防等以大段文字返回,这块可引入事件抽取,可将原因结构化表示出来。
资源推荐
资源详情
资源评论
收起资源包目录
基于 neo4j 知识图谱和规则匹配的肝病问答系统.zip (28个子文件)
qasystemonhepatopathykg
printFileDirectoryTree.py 2KB
data
test.json 12KB
medical.json 44.96MB
hepatopathy.json 1.21MB
LICENSE 1KB
prepare_data
max_cut.py 4KB
build_data.py 5KB
data_spider.py 6KB
.idea
vcs.xml 180B
workspace.xml 7KB
misc.xml 288B
modules.xml 300B
deployment.xml 357B
QASystemOnMedicalKG_last.iml 453B
question_parser.py 9KB
build_medicalgraph.py 12KB
chatbot_graph.py 1KB
answer_search.py 7KB
question_classifier.py 12KB
README.md 22KB
dict
food.txt 73KB
producer.txt 496KB
drug.txt 73KB
disease.txt 173KB
symptom.txt 97KB
deny.txt 227B
check.txt 70KB
department.txt 593B
共 28 条
- 1
资源评论
- 小左左爱跑跑2023-12-25资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
- zhou13051825672024-01-06这个资源值得下载,资源内容详细全面,与描述一致,受益匪浅。
- weixin_474939582023-02-26超级好的资源,很值得参考学习,对我启发很大,支持!
- 2301_774810552023-08-10资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- 2301_766474872023-04-26这个资源总结的也太全面了吧,内容详实,对我帮助很大。
甜辣uu
- 粉丝: 8492
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功