支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


知识图谱

发布日期:2025-04-26 23:40:49 浏览次数: 1528 作者:python算法笔记
推荐语

深入探索知识图谱的构建、表示与应用,洞悉其在智能信息处理中的核心价值。

核心内容:
1. 知识图谱的定义与组成要素
2. 实体、关系、属性的表示方法
3. 知识图谱的构建流程及技术挑战

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

知识图谱是一种揭示实体之间关系的语义网络,可以对现实世界的事物及其相互关系进行形式化地描述,在2012年5月首次被Google正式提出,初衷是为了提高搜索引擎的能力,增强用户的搜索质量及搜索体验,现在的知识图谱已被用来泛指各种大规模的知识库

知识图谱组成及表示

知识图谱的组成部分

知识图谱主要由节点(实体)和边(关系)组成的图结构,节点代表实体,如人、地点、事件等,边表示实体之间的各种关系,如“人生活在某地”等。每个实体和关系可以通过特定的属性进行描述,使得知识图谱能够结构化、语义化表示现实世界中的知识。知识图谱主要由以下三个部分组成:

1)实体(Entities) 是图中的节点,代表现实世界中的具体对象或抽象概念,每个实体都有一个唯一的标识符和属性来描述其特征。如实体“姚明”可以有属性“身高”等

2)关系(Relationships) 是连接实体的边,表示实体之间的关系,关系通常是有方向的,并且可以有不同的类型,表示实体之间不同的关联方式。如实体“姚明”和实体“叶莉”之间可以通过“妻子”这一关系相连

3)属性(Attributes) 属性是用于描述实体或关系的特征,如实体“姚明”具有”职业“这一属性

知识图谱的表示方法

一般情况下,三元组是知识图谱的一种通用表示方式,有3种基本形态: 

知识图谱的构建

如何决定哪些是实体,哪些是属性,哪些是关系?取决于图谱的使用方式和想要完成的任务。

知识图谱的架构包括自身的逻辑结构以及体系架构。 在逻辑结构上可分为模式层与数据层两个层次,数据层主要是由一系列的事实组成,而知识将以事实为单位进行存储。如用图数据库Neo4j存储、 这样的三元组。模式层构建在数据层之上,主要是通过本体库来规范数据层的一系列事实表达。本体是结构化知识库的概念模版,通过本体库形成的知识库不仅层次结构较强,且冗余程度叫小

体系架构师其构建模式的结构,见下图:

大规模知识库的构建需要更多种智能信息处理技术,包括知识抽取从非结构化数据中抽取出实体、关系、属性等要素;知识融合消歧提升数据质量;知识推理则是在已有的知识库基础上进一步挖掘隐含的知识,从而丰富扩展知识库;分布式的知识表示形成的综合向量对知识库的构建、推理、融合以及应用均具有重要意义

知识抽取

面向非结构化的数据,过自动化技术抽取出可用的知识单元,包括:实体抽取、关系抽取、属性抽取

  • 实体抽取:实体是知识图谱中的最基本元素,其抽取的完整性、准确率、召回率等将直接影响到知识库的质量。在技术上,更多被称为NER(named entity recognition,命名实体识别),可以基于规则和词典进行实体抽取,也可以基于机器学习的模型预测进行,是一种序列标注问题

  • 关系抽取:目标是解决实体间语义链接问题。早期通过人工构造语义规则及模版的方法识别实体关系,随后逐渐用实体间关系模型替代人工预定义的语法规则

  • 属性抽取:实体的属性可以看成是实体与属性间的一种名称性关系,故可以将实体属性的抽取问题转换为关系抽取问题,因此可以借鉴大部分关系抽取方法

知识融合

由于知识图谱中知识来源广泛,存在知识质量良莠不齐、来自不同数据源的知识重复、知识间的关联不够明确等问题,所以必须要进行知识融合。知识融合是高层次的知识组织,使来自不同知识源的知识在统一框架下进行异构数据整合、消歧、加工、推理验证、更新等步骤,达到数据、信息、方法、经验及人的思想的融合,形成高质量知识库,包括:实体链接、知识合并

  • 实体链接:将抽取到的实体对象链接到知识库中对应正确实体对象
  • 知识合并:将不同来源的知识认定为真实世界的同一实体

知识加工

事实本身不等于知识,要想最终获得结构化、网络化的知识体系,还需要经历知识加工的过程,包括:本体构建、知识推理和质量评估

  • 知识推理:在已有的知识库基础上进一步挖掘隐含知识,从而丰富、扩展知识库

如基于规则+句法:传递性:A-儿子-B,B-儿子-C, A-?-C

基于模型的知识补全:给出两个实体推断其关系,如h + r -> t, h + t -> r , (h, r, t) -> {0, 1}

知识表示

将知识图谱中的实体,关系,属性等转化为向量,利用向量间的计算关系反映实体间的关联性,使得学习到的实体表示可以在文本相关的任务中使用

知识图谱的技术框架

构建知识图谱通常需要使用以下几类技术:

图数据库

图数据库如Neo4j用于存储知识图谱的数据结构,擅长处理节点(实体)和边(关系)的查询和操作,尤其适用于大规模知识图谱的存储和查询

自然语言处理(NLP)

NLP用于从非结构化文本中提取实体和关系,如通过命名实体识别(NER)和关系抽取(Relation Extraction)可以从大量文本中自动构建知识图谱。

知识图谱简单实现

本文用周杰伦的一些歌曲、专辑、电影及电视剧等信息构建一个相关的图数据库,然后基于该图数据库实现简单的问答任务

相关图数据库搭建

  • 数据准备:建立图数据库时,首先需要两个文件:实体-关系-实体三元组文件、实体-属性-属性值三元组文件,如:
#实体-关系-实体三元组文件
不能说的秘密(2007年周杰伦自编自导电影) 导演 周杰伦
不能说的秘密(2007年周杰伦自编自导电影) 对白语言 华语
不能说的秘密(2007年周杰伦自编自导电影) 拍摄地点 淡江中学
不能说的秘密(2007年周杰伦自编自导电影) 色彩 彩色
不能说的秘密电影原声带 专辑歌手 周杰伦
不作你的朋友 MV导演 周杰伦
布拉格广场(蔡依林、周杰伦演唱歌曲) 编曲 钟兴民
布拉格广场(蔡依林、周杰伦演唱歌曲) 歌曲语言 国语


#实体-属性-属性值三元组文件
不能说的秘密(2007年周杰伦自编自导电影) imdb编码 tt1037850
不能说的秘密(2007年周杰伦自编自导电影) 编剧 杜致朗、周杰伦
不能说的秘密(2007年周杰伦自编自导电影) 出品公司 安乐影片有限公司
不能说的秘密(2007年周杰伦自编自导电影) 类型 剧情、音乐、奇幻、情感
不能说的秘密(2007年周杰伦自编自导电影) 片长 101分钟
不能说的秘密(2007年周杰伦自编自导电影) 上映时间 2007年7月27日(中国台湾)
不能说的秘密(2007年周杰伦自编自导电影) 外文名 Secret
不能说的秘密(2007年周杰伦自编自导电影) 制片地区 中国台湾,中国香港
不能说的秘密(2007年周杰伦自编自导电影) 制片人 江志强
不能说的秘密(2007年周杰伦自编自导电影) 中文名 不能说的秘密
不能说的秘密(2007年周杰伦自编自导电影) 主演 周杰伦,桂纶镁,黄秋生,曾恺玹,苏明明
不能说的秘密(2007年周杰伦自编自导电影) 主要奖项 第44届台湾电影金马奖年度杰出电影
不能说的秘密电影原声带 制作人 周杰伦,TerdsakJanpan

  • 读取数据并构建cypher语句,为所有实体增加属性并将一个实体的所有属性拼接成类似字典的表达式,执行建表脚本
CREATE (不能说的秘密:电影 {imdb编码:'tt1037850',编剧:'杜致朗、周杰伦',出品公司:'安乐影片有限公司',类型:'剧情、音乐、奇幻、情感',片长:'101分钟',上映时间:'2007年7月27日(中国台湾)',外文名:'Secret',制片地区:'中国台湾,中国香港',制片人:'江志强',中文名:'不能说的秘密',主演:'周杰伦,桂纶镁,黄秋生,曾恺玹,苏明明',主要奖项:'第44届台湾电影金马奖年度杰出电影',NAME:'不能说的秘密'})
CREATE (不能说的秘密电影原声带 {制作人:'周杰伦,TerdsakJanpan',NAME:'不能说的秘密电影原声带'})
CREATE (布拉格广场:歌曲 {发行时间:'2003年3月',歌曲时长:'4:52',歌曲原唱:'蔡依林,周杰伦',所属专辑:'《看我72变》',中文名称:'布拉格广场',NAME:'布拉格广场'})
CREATE (扯:歌曲 {曲目编码:'08',中文名称:'扯',NAME:'扯'})
CREATE (陈天佳 {喜欢的名人:'唐禹哲、周杰伦',NAME:'陈天佳'})
CREATE (床边故事:歌曲 {发行时间:'2016-06-24',歌曲时长:'3:45',外文名称:'BedtimeStories',中文名称:'床边故事',NAME:'床边故事'})
CREATE (大灌篮:电影 {主演:'周杰伦,曾志伟,王刚,蔡卓妍,陈柏霖,吴孟达,吴宗宪',NAME:'大灌篮'})
CREATE (大灌篮2 {主演:'周杰伦,蔡卓妍',NAME:'大灌篮2'})
CREATE (大明星:歌曲 {中文名称:'大明星',NAME:'大明星'})
CREATE (淡江中学 {知名校友:'周杰伦、古龙',NAME:'淡江中学'})

最终构建数据示例如下

自然语言处理

NLP用于从非结构化文本中提取实体和关系,如通过命名实体识别(NER)和关系抽取(Relation Extraction),可以从大量文本中自动构建知识图谱

  • 获取问题中的实体、关系和属性:可以基于词表获取实体,也可以使用NER模型;对于问题中关系识别可以使用文本分类模型 在本案例中使用文本匹配方式获取需要的信息
   #获取问题中谈到的实体,可以使用基于词表的方式,也可以使用NER模型
    def get_mention_entitys(self, sentence):
        return re.findall("|".join(self.entity_set), sentence)

    # 获取问题中谈到的关系,也可以使用各种文本分类模型
    def get_mention_relations(self, sentence):
        return re.findall("|".join(self.relation_set), sentence)

    # 获取问题中谈到的属性
    def get_mention_attributes(self, sentence):
        return re.findall("|".join(self.attribute_set), sentence)

    # 获取问题中谈到的标签
    def get_mention_labels(self, sentence):
        return re.findall("|".join(self.label_set), sentence)

    #对问题进行预处理,提取需要的信息
    def parse_sentence(self, sentence):
        entitys = self.get_mention_entitys(sentence)
        relations = self.get_mention_relations(sentence)
        labels = self.get_mention_labels(sentence)
        attributes = self.get_mention_attributes(sentence)
        return {"%ENT%":entitys,
                "%REL%":relations,
                "%LAB%":labels,
                "%ATT%":attributes}

    #将提取到的值分配到键上
    def decode_value_combination(self, value_combination, cypher_check):
        res = {}
        for index, (key, required_count) in enumerate(cypher_check.items()):
            if required_count == 1:
                res[key] = value_combination[index][0]
            else:
                for i in range(required_count):
                    key_num = key[:-1] + str(i) + "%"
                    res[key_num] = value_combination[index][i]
        return res

    #对于找到了超过模板中需求的实体数量的情况,需要进行排列组合
    #info:{"%ENT%":["周杰伦", "方文山"], “%REL%”:[“作曲”]}
    def get_combinations(self, cypher_check, info):
        slot_values = []
        for key, required_count in cypher_check.items():
            slot_values.append(itertools.combinations(info[key], required_count))
        value_combinations = itertools.product(*slot_values)
        combinations = []
        for value_combination in value_combinations:
            combinations.append(self.decode_value_combination(value_combination, cypher_check))
        return combinations
  • 根据提取到的实体、关系等信息,将问题模版展开成待匹配的文本
  • 通过问题匹配的方式确定匹配的cypher并解析结果 这里,我们提问几个问题,最终展示系统知识图谱回答内容
if __name__ == "__main__":
    graph = GraphQA()
    res = graph.query("谁导演的不能说的秘密")
    print(res)
    res = graph.query("发如雪的谱曲是谁")
    print(res)
    res = graph.query("爱在西元前的谱曲是谁")
    print(res)
    res = graph.query("周杰伦的星座是什么")
    print(res)
    res = graph.query("周杰伦的血型是什么")
    print(res)
    res = graph.query("周杰伦的身高")
    print(res)
    res = graph.query("周杰伦和淡江中学是什么关系")
    print(res)

#output 最终答案
不能说的秘密的导演是周杰伦
周杰伦
周杰伦
摩羯座
O型
175cm
毕业院校

#过程
===============
============
谁导演的不能说的秘密
info: {'%ENT%': ['不能说的秘密'], '%REL%': ['导演'], '%LAB%': [], '%ATT%': ['导演']}
[['不能说的秘密的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"不能说的秘密"}) return n.NAME''n.NAME'], ['谁导演的不能说的秘密''Match (n)<-[:导演]-(m {NAME:"不能说的秘密"}) return n.NAME''不能说的秘密的导演是n.NAME'], ['不能说的秘密的导演是什么''Match (n) where n.NAME="不能说的秘密" return n.导演''n.导演']]
谁导演的不能说的秘密 不能说的秘密的谱曲是谁 0.5833333333333334
谁导演的不能说的秘密 谁导演的不能说的秘密 1.0
谁导演的不能说的秘密 不能说的秘密的导演是什么 0.6666666666666666
不能说的秘密的导演是周杰伦
============
发如雪的谱曲是谁
info: {'%ENT%': ['发如雪'], '%REL%': ['谱曲'], '%LAB%': [], '%ATT%': ['谱曲']}
[['发如雪的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"发如雪"}) return n.NAME''n.NAME'], ['谁导演的发如雪''Match (n)<-[:导演]-(m {NAME:"发如雪"}) return n.NAME''发如雪的导演是n.NAME'], ['发如雪的谱曲是什么''Match (n) where n.NAME="发如雪" return n.谱曲''n.谱曲']]
发如雪的谱曲是谁 发如雪的谱曲是谁 1.0
发如雪的谱曲是谁 谁导演的发如雪 0.5
发如雪的谱曲是谁 发如雪的谱曲是什么 0.7
周杰伦
============
爱在西元前的谱曲是谁
info: {'%ENT%': ['爱在西元前'], '%REL%': ['谱曲'], '%LAB%': [], '%ATT%': ['谱曲']}
[['爱在西元前的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"爱在西元前"}) return n.NAME''n.NAME'], ['谁导演的爱在西元前''Match (n)<-[:导演]-(m {NAME:"爱在西元前"}) return n.NAME''爱在西元前的导演是n.NAME'], ['爱在西元前的谱曲是什么''Match (n) where n.NAME="爱在西元前" return n.谱曲''n.谱曲']]
爱在西元前的谱曲是谁 爱在西元前的谱曲是谁 1.0
爱在西元前的谱曲是谁 谁导演的爱在西元前 0.5833333333333334
爱在西元前的谱曲是谁 爱在西元前的谱曲是什么 0.75
周杰伦
============
周杰伦的星座是什么
info: {'%ENT%': ['周杰伦'], '%REL%': [], '%LAB%': [], '%ATT%': ['星座']}
[['周杰伦的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"周杰伦"}) return n.NAME''n.NAME'], ['谁导演的周杰伦''Match (n)<-[:导演]-(m {NAME:"周杰伦"}) return n.NAME''周杰伦的导演是n.NAME'], ['周杰伦的星座是什么''Match (n) where n.NAME="周杰伦" return n.星座''n.星座']]
周杰伦的星座是什么 周杰伦的谱曲是谁 0.4166666666666667
周杰伦的星座是什么 谁导演的周杰伦 0.3333333333333333
周杰伦的星座是什么 周杰伦的星座是什么 1.0
摩羯座
============
周杰伦的血型是什么
info: {'%ENT%': ['周杰伦'], '%REL%': [], '%LAB%': [], '%ATT%': ['血型']}
[['周杰伦的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"周杰伦"}) return n.NAME''n.NAME'], ['谁导演的周杰伦''Match (n)<-[:导演]-(m {NAME:"周杰伦"}) return n.NAME''周杰伦的导演是n.NAME'], ['周杰伦的血型是什么''Match (n) where n.NAME="周杰伦" return n.血型''n.血型']]
周杰伦的血型是什么 周杰伦的谱曲是谁 0.4166666666666667
周杰伦的血型是什么 谁导演的周杰伦 0.3333333333333333
周杰伦的血型是什么 周杰伦的血型是什么 1.0
O型
============
周杰伦的身高
info: {'%ENT%': ['周杰伦'], '%REL%': [], '%LAB%': [], '%ATT%': ['身高']}
[['周杰伦的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"周杰伦"}) return n.NAME''n.NAME'], ['谁导演的周杰伦''Match (n)<-[:导演]-(m {NAME:"周杰伦"}) return n.NAME''周杰伦的导演是n.NAME'], ['周杰伦的身高是什么''Match (n) where n.NAME="周杰伦" return n.身高''n.身高']]
周杰伦的身高 周杰伦的谱曲是谁 0.4
周杰伦的身高 谁导演的周杰伦 0.4444444444444444
周杰伦的身高 周杰伦的身高是什么 0.6666666666666666
175cm
============
周杰伦和淡江中学是什么关系
info: {'%ENT%': ['周杰伦''淡江中学'], '%REL%': [], '%LAB%': [], '%ATT%': []}
[['周杰伦的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"周杰伦"}) return n.NAME''n.NAME'], ['淡江中学的谱曲是谁''Match (n)<-[:谱曲]-(m {NAME:"淡江中学"}) return n.NAME''n.NAME'], ['谁导演的周杰伦''Match (n)<-[:导演]-(m {NAME:"周杰伦"}) return n.NAME''周杰伦的导演是n.NAME'], ['谁导演的淡江中学''Match (n)<-[:导演]-(m {NAME:"淡江中学"}) return n.NAME''淡江中学的导演是n.NAME'], ['周杰伦和淡江中学是什么关系''Match (n {NAME:"周杰伦"})-[REL]->(m {NAME:"淡江中学"}) return REL''REL']]
周杰伦和淡江中学是什么关系 周杰伦的谱曲是谁 0.23529411764705882
周杰伦和淡江中学是什么关系 淡江中学的谱曲是谁 0.29411764705882354
周杰伦和淡江中学是什么关系 谁导演的周杰伦 0.17647058823529413
周杰伦和淡江中学是什么关系 谁导演的淡江中学 0.23529411764705882
周杰伦和淡江中学是什么关系 周杰伦和淡江中学是什么关系 1.0
毕业院校

在这里,我们可以看出示例是通过计算待匹配的问题文本个模版之间的距离得到相似度来确定匹配的cypher,也可以使用别的文本匹配方式进行



53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询