# 基于 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
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
QASystemOnHepatopathyKG-master.rar (28个子文件)
QASystemOnHepatopathyKG-master
qasystemonhepatopathykg_code
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
资源评论
- weasedg2023-10-25资源很赞,希望多一些这类资源。
甜辣uu
- 粉丝: 8598
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功