知识图谱初体验-疾病自动问答

楔子

之前一直觉得知识图谱挺有意思,这两天忙里偷闲,在 GitHub 上看到了 liuhuanyong 大佬开源的项目,于是便发动 clone 大法搞下来玩了玩儿。有一说一,大佬流弊,但是文档不是很完善,给东哥这种知识图谱零基础的小白造成了些许困扰,好在 issue 区小伙伴的精彩评论拯救了我,于是便决定把这次游玩的经历记录下来,供像我一样的知识图谱零基础小白上手。

流程图

graph TB
  st(开始)-->op1[克隆代码]
  op1-->op2[安装python依赖]
  op2-->op3[通过docker启动neo4j]
  op3-->op4[向neo4j中导入节点和关系]
  op4-->op5[启动对话机器人]
  op5-->e(结束)

使用 git 克隆代码

代码仓库:https://github.com/liuhuanyong/QASystemOnMedicalKG

GitHub 上的项目介绍:

知识图谱是目前自然语言处理的热门方向,关于较全面的参考资料,可以查看我的 ccks2018 参会总结(https://github.com/liuhuanyong/CCKS2018Summary )。
与知识图谱相关的另一种形态,即事理图谱,本人在这方面也尝试性地积累了一些工作,可参考:(https://github.com/liuhuanyong/ComplexEventExtraction )。
关于知识图谱概念性的介绍就不在此赘述。目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含 7 类规模为 4.4 万的知识实体,11 类规模约 30 万实体关系的知识图谱。 本项目将包括以下两部分的内容:

  1. 基于垂直网站数据的医药知识图谱构建
  2. 基于医药知识图谱的自动问答

完整文档请参考项目主页的 README。

1
2
# clone 代码
git clone https://github.com/liuhuanyong/QASystemOnMedicalKG

安装 python 依赖

1
pip install py2neo pyahocorasick

通过 docker 启动 neo4j

本项目使用 neo4j 图数据库来存储实体和关系,因此需要本地安装启动一个 neo4j 数据库。看了看 neo4j 的安装手册,发现有官方的 docker 镜像,深爱 docker 的东哥顺手写了一个 docker-compose 文件,通过一行命令启动 neo4j,异常舒适。

如果你还没有安装 docker,请参考以下链接:

如果你是 Linux 用户,还需要单独安装 docker-compose 命令:

1
2
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-compose 安装文档:https://docs.docker.com/compose/install/#install-compose

在 docker 和 docker-compose 都安装好了以后,就可以通过 docker-compose 一键启动 neo4j 啦!把我写的docker-compose.yml文件贴出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3"
services:
neo4j:
image: neo4j:latest
restart: always
ports:
- 7474:7474
- 7687:7687
volumes:
- ./data:/data
- ./logs:/logs
- ./import:/var/lib/neo4j/import
- ./plugins:/plugins
environment:
NEO4J_AUTH: neo4j/lhy123 # 用户名/密码

需要在 build_medicalgraph.py 和 answer_search.py 两个文件中,将 Graph 的 user, password 修改 NEO4J_AUTH 设置的值,且用户名必须为 neo4j,否则 neo4j 初始化时会报错:

1
2
3
4
5
6
self.g = Graph(
host="127.0.0.1", # neo4j 搭载服务器的ip地址,ifconfig可获取到
http_port=7474, # neo4j 服务器监听的端口号
user="neo4j", # 改成上面docker-compose文件中NEO4J_AUTH字段设定的值
password="lhy123" # 改成上面docker-compose文件中NEO4J_AUTH字段设定的值
)

在项目目录下新建目录 docker,然后把上面的代码复制粘贴到 docker 目录下的 docker-compose.yml 文件中,通过 docker-compose 命令就可以启动啦!是不是很方便?

1
2
cd docker
docker-compose up -d

用浏览器打开 http://127.0.0.1:7474/browser/ 就可以看到 neo4j 的管理界面
neo4j 管理界面

向 neo4j 中导入节点和关系

build_medicalgraph.py文件中的 main 函数修改为以下内容:

1
2
3
4
if __name__ == '__main__':
handler = MedicalGraph()
handler.create_graphnodes()
handler.create_graphrels()

然后执行python build_medicalgraph.py即可导入。但是这种导入方式耗时长,我第一次导入数据的时候花了大概一个多小时。

所以,我把我导入过的数据分享出来,大家可以直接下载使用,免除导入数据耗时长的烦恼。
下载地址:

将下载得到的压缩包解压,会得到 data、logs、import、plugins 三个文件夹,把它们都移动到 docker 目录内,然后再执行docker-compose up -d即可启动。

启动对话机器人

直接通过python chatbot_graph.py启动即可,效果截图:
东哥和人工智障小勇的对话


知识图谱初体验-疾病自动问答
https://maxoyed.com/2020/05/12/知识图谱初体验-疾病自动问答/
作者
东哥Talk
发布于
2020年5月12日
许可协议