摘要:当前,知识图谱已在金融、电商和医疗等领域开展了诸多实践性探索,并被广泛的应用在了智能问答、知识搜索、个性化推荐和辅助诊断等知识型驱动的任务中。本文从中药和知识图谱研究视角出发,对所收集中药相关数据进行预处理与实体关系抽取,自顶向下构建中药知识图谱。同时利用neo4j对部分数据进行了可视化分析。
知识图谱最初是谷歌知识搜索功能的产品名称,现在是各类结构化知识库的统称,也是一种用图模型描述知识关联关系的技术方法。知识图谱由节点和关系组成,一般用三元组表示不同概念间的复杂关系。图1所示为“中药术语”知识图谱的部分节点关系。
知识图谱构建主要包括自顶向下和自底向上两种方式。自顶向下构建是指在较高质量数据集中提取三元组信息并加入知识库中;而自底向上构建是指利用相关技术从一般数据集中提取可信度较高的三元组经人工审核后将其加入知识库中。知识图谱的构建过程如图2所示,包括数据获取、知识抽取、知识融合和知识加工等几方面,详细内容可参考文献[4]。
知识图谱的核心是“实体-关系-实体”三元组,为此,本文首先简要介绍一些相关的中药术语,定义需要构建中药知识图谱的主要概念,为后续中药知识图谱的构建做铺垫。
中药是以中国传统医药理论为指导,用于预防和治疗疾病的物质。中药学术语主要包括一般概念、中药采集、中药贮藏、中药鉴定、中药炮制、中药性能、中药功效、中药配伍、中药禁忌、和中药用法等10大类,每类又包含相关的多个子类层级,本文提供5级包含关系300+节点的术语图谱,其可视化效果如图3所示。
从中药术语知识图谱可见,如要从中药角度深入挖掘知识是极其庞大的工程,当然其中也蕴含着诸多有价值的东西,有兴趣者可更深入探索。本文主要从中药性能和中药功效角度抽取相关信息,构建知识图谱。具体实体和关系描述如下:
实体定义:中药材(root节点)、中药名、来源、别名、分布、四气、五味、功能、主治。
关系定义:<中药材, include, 中药名>、<中药名, from, 来源>、<中药名, another name, 别名>、<中药名, distribution area,分布>、<中药名, four properties,四气>、<中药名, five flavors,五味>、<中药名, functions,功能>、<中药名, attending,主治>。
说明:该实体和关系的定义旨在学习知识图谱在中医药数据中的应用与处理,仅限自己初步研究,具体应用需根据实际情况调整。
当前互联网资源丰富,各主题相关数据也比较多样,可根据实际需要利用相关技术爬取或人工收集。数据类型一般包括结构化、半结构化和非结构化三种数据类型。为减轻数据处理的工作量,本文通过爬虫收集中医药相关词条的半结构化数据,并对其进行清洗,获得基本实体关系的格式化数据集。
实体抽取即命名实体识别,通常意义的命名实体识别是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。主要方法有基于规则和词典的方法、基于统计的机器学习方法(如:HMM、CRF)、基于深度学习的方法(BI-LSTM+CRF)等。
本文实体抽取属于特定领域的实体抽取任务,主要根据第2部分中实体定义,利用规则和词典获取中药实体。然后对不同来源的实体和关系进行知识融合与加工,得到最终的中药实体关系三元组。如:<中药材, include, 三七>。
对于处理的中药实体关系三元组数据,本文通过py2neo将数据存入neo4j数据库,并进行可视化展示。
demo片段如下:
创建节点
def generateGraph_Node(graph, label, name):
"""
创建知识图谱节点
:param graph: Graph()
:param label: 节点label
:param name: 节点name
:return:
"""
node = Node(label, name=name)
graph.create(node)
return node
创建关系
def generateGraph_Relation(graph, node_1, relation, node_2):
"""
连接知识图谱节点关系
:param graph:Graph()
:param node_1: 头实体节点
:param relation: 关系
:param node_2: 尾实体节点
:return:
"""
r = Relationship(node_1, relation, node_2)
graph.create(r)
生成neo4j知识图谱
def create_graph_zhongyao():
"""
创建中药知识图谱,在neo4j中进行可视化
:return:
"""
# === 连接知识图谱
test_graph = Graph("http://localhost:7474", auth=("neo4j", "123456"))
# 生成节点1
node_name = generateGraph_Node(test_graph, "中药名", "人参")
# 生成节点2
node_other_name = generateGraph_Node(test_graph, "中药名", "棒锤")
# 生成关系
generateGraph_Relation(test_graph, node_name, "别名", node_other_name)
demo数据和代码地址:
https://github.com/fengxi177/Knowlegde_Graph_TCM
https://gitee.com/fengxi177/Knowlegde_Graph_TCM
本文共计生成中药节点标签共计9类65904个,关系类型8类231584个。存入neo4j中的中药知识图谱概况如图4所示。
图5和图6是3000个关系的中药知识图谱可视化效果。
“中药名”节点标签可视化结果如图7
MATCH (n:`中药名`) RETURN n LIMIT 30
中药“主治”节点标签可视化结果如图8
MATCH (n:`主治`) RETURN n LIMIT 20
200关系中药知识图谱可视化结果如图9
MATCH p=()-->() RETURN p LIMIT 200
中药“四气”关系可视化结果如图10
MATCH p=()-[r:`four properties`]->() RETURN p LIMIT 25
中药“五味”关系可视化结果如图11
MATCH p=()-[r:`five flavors`]->() RETURN p LIMIT 25
中药“别名”关系可视化结果如图12
MATCH p=()-[r:`another name`]->() RETURN p LIMIT 50
中药“分布”关系可视化结果如图13
MATCH p=()-[r:`distribution area`]->() RETURN p LIMIT 50
以上就是本文所构建中药知识图谱的部分可视化结果。
当前已有很多包括医疗在内的垂直领域知识图谱,备受相关研究和应用场景人员的关注。本文从知识图谱和中药术语概念开始,自顶向下的构建了一份共计6w+节点和23w+关系的中药知识图谱,并进行了可视化展示。后续将基于该中药知识图谱探索相关的智能问答、知识搜索和辅助诊断相关的应用分析。
主要参考文献
[1] https://zhuanlan.zhihu.com/p/38891715
[2] 刘知远, 韩旭, 孙茂松. 《知识图谱与深度学习》[M]. 清华大学出版社.
[3] 王昊奋, 漆桂林, 陈华钧. 《知识图谱:方法,实践与应用》[M]. 电子工业出版社.
[4] 刘峤,李杨,段宏,刘瑶,秦志光. 知识图谱构建技术综述[J]. 计算机研究与发展, 2016, 53(3): 582-600.