一、概述
1.概念
知识图谱(Knowledge Graph)是人工智能的重要分支技术,它在2012年由谷歌提出,是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系,其基本组成单位是“实体—关系—实体”三元组,以及实体及其相关属性—值对,实体间通过关系相互联结,构成网状的知识结构。
从字面上看,知识图谱就是用图的形式将知识表示出来。图中的结点代表语义实体或概念,边代表结点间的各种语义关系。
上图不同节点之间的关系可以表示为三元组,例如<上海星时网络科技有限公司,公司法人,杜耀斐>表示公司的法人是某某某。
这是一种常用的基于符号的知识表示方式——资源描述框架(Resource Description Framework,RDF),它把知识表示为一个包含主语(Subject)、谓语(Predicate)和宾语(Object)的三元组<S,P,O>。
2.知识图谱分类
知识图谱按照功能和应用场景可以分为通用知识图谱和领域知识图谱。
其中通用知识图谱面向的是通用领域,强调知识的广度,形态通常为结构化的百科知识,针对的使用者主要为普通用户;
领域知识图谱则面向某一特定领域,强调知识的深度,通常需要基于该行业的数据库进行构建,针对的使用者为行业内的从业人员以及潜在的业内人士等。
企业用户画像图谱(neo4j,123456)属于领域知识图谱。
实体关系的抽取的分类与划分:
3.知识图谱的表示和存储
知识表示的方式主要有以下几种:
- 语义网络:是一个通过语义关系连接的概念网络,将知识表示为相互连接的点和边的模式。节点:实体、事件、值;边:对象间的语义关系。语义网络中最基本的语义单元称为语义基元,用<节点1,关系,节点2>表示。如“珊瑚是一种动物”,<珊瑚,属于,动物>。
在语义网络的基础上,万维网联盟W3C制定了一系列的标准语言来对知识进行表示和建模,如RDF、RDFS(RDF Schema)和OWL(Ontology Web Language)。 - 框架:是一种描述所讨论对象(事物、事件、概念等)属性和行为的数据结构。框架的最高层次是固定的,以框架的结构存储,根据实际情况对框架内的具体值进行填充,填充的部分称为槽(Slots)。在槽中填入具体值,就可以得到一个描述具体事务的框架,每一个槽都可以有一些附加说明–被称为侧面(Facet),其作用是指出槽的取值范围和求值方法等。
框架举例:<教师>包含九个槽,若存在一个教师的实体,需要对教师框架中的槽(或部分槽)进行填充。
<教师实例>{<姓名>{张三},<年龄>{30},<学校>{北京大学},<院系>{人工智能学院},<职称>{讲师}}
知识图谱的存储方式:
知识图谱的主要数据模型有RDF图和属性图两种,形成了RDF数据的三元组库和属性图的图数据库。由此得出知识图谱主要有两种存储方式:一种是基于 RDF 的存储;另一种是基于图数据库的存储。它们之间的区别如下图所示。RDF 一个重要的设计原则是数据的易发布以及共享,图数据库则把重点放在了高效的图查询和搜索上。其次,RDF 以三元组的方式来存储数据而且不包含属性信息,但图数据库一般以属性图为基本的表示形式,所以实体和关系可以包含属性,这就意味着更容易表达现实的业务场景。
根据最新的统计(2018 年上半年),图数据库仍然是增长最快的存储系统。相反,关系型数据库的增长基本保持在一个稳定的水平。同时,我们也列出了常用的图数据库系统以及他们最新使用情况的排名。 其中 Neo4j 系统目前仍是使用率最高的图数据库,它拥有活跃的社区,而且系统本身的查询效率高,但唯一的不足就是不支持准分布式。相反,OrientDB 和 JanusGraph(原 Titan)支持分布式,但这些系统相对较新,社区不如 Neo4j 活跃,这也就意味着使用过程当中不可避免地会遇到一些刺手的问题。如果选择使用 RDF 的存储系统,Jena 或许一个比较不错的选择。
4.知识图谱的应用
行业领域
- 医疗领域
医疗知识图谱可以辅助药理学研究和药物发现,构建医疗信息系统,以及问答和搜索框架。 - 金融投资领域
与传统的金融信息数据平台不同,金融知识引擎并不仅仅局限在金融数据的整合和信息平台的范围,而是通过构建知识图谱,加上自然语言处理和语义搜索引擎,让用户可以更方便地获取各种素材并加工再使用。
金融知识图谱关注事件和事件之间的依赖,以及对结果的关联和推理,从而可为用户提供自动化语义分析、根据特定行情判断走势等功能。 - 电商领域
在电商领域积聚了海量的商品和交易数据,它以商品、产品、品牌和条码为核心,可以构建百亿级别的商品知识图谱,广泛应用于搜索、导购、平台治理、智能问答等业务,同时保持每天千万级别的恶意攻击拦截量,极大提升了消费者的购物体验。 - 政企管理
其核心技术是整理、分析不同来源的结构化和非结构化数据,为相关人员提供决策支持。例如在军事情报分析系统中,将多源异构信息进行整合,如电子表格、电话、文档、传感器数据、动态视频等,可以对人员、装备、事件进行全方位实时的监控分析,使调度人员第一时间掌握战场态势,并做出预判。
技术领域 - 聊天机器人领域
人与机器通过自然语言进行问答与对话也是人工智能实现的标志之一,知识图谱也广泛应用于人机问答交互中。借助自然语言处理和知识图谱技术,比如基于语义解析、基于图匹配、基于模式学习、基于表示学习和深度学习的知识图谱模型。
- 搜索领域
互联网的终极形态是万物互联,而搜索的终极目标是对万物直接进行搜索。传统的搜索是靠网页之间的超链接实现网页的搜索,而语义搜索是直接对事物进行搜索,比如人、物、机构、地点等,这些事物可以来自文本、图片、视频、音频、物联网设备等。知识图谱和语义技术提供了关于这些事物的分类、属性和关系的描述,这样搜索引擎就可以直接对事物进行搜索。比如我们想知道“《觉醒年代》的导演是谁?”,那么在进行搜素时,搜索引擎会把这句话进行分解,获得“《觉醒年代》”,“导演”,再与现有的知识库中的词条进行匹配,最后展现在用面前。传统的搜索模式下,我们进行这样的搜索后得到的通常是包含其中关键词的网页链接,我们还需要在多个网页中进行筛选。可以看出基于知识图谱的搜索更加便捷与准确。 - 推荐系统领域
知识图谱中包含了不同类型的知识主体(如人物、地点等),附着在知识主体上的属性(如人物描述,物品特点),以及主体和主体之间、主体和属性之间的关系。如果我们能够对知识图谱中的主体进行 Embedding 化,就可以发现主体之间的潜在关系,这对于基于内容和知识的推荐系统是非常有帮助的。
基于随机游走的 Graph Embedding 方法Deep Walk可以通过在图结构上进行随机游走,产生大量物品序列,然后将这些物品序列作为训练样本输入 Word2vec 进行训练,最终得到物品的 Embedding。
5.知识图谱一般构建流程
在上面的信息抽取阶段我们都比较熟悉,而在知识融合阶段中的知识融合、指代消歧和实体歧会比较陌生,下面来简单介绍一下:
在实体命名识别和关系抽取过程中,有两个比较棘手的问题:一个是实体统一,也就是说有些实体写法上不一样,但其实是指向同一个实体。比如“NYC”和“New York”表面上是不同的字符串,但其实指的都是纽约这个城市,需要合并。实体统一不仅可以减少实体的种类,也可以降低图谱的稀疏性(Sparsity);另一个问题是指代消解,也是文本中出现的“it”, “he”, “she”这些词到底指向哪个实体,比如在本文里两个被标记出来的“it”都指向“hotel”这个实体。指代消解总的来说是为了避免代词指代不清的情况。
而知识融合则包括实体统一和指代消解两个任务,它们都用来判断知识库中的同名实体是代表同一含义、是否有其他实体也表示相同含义。实体消歧专门用于解决同名实体产生歧义的问题,通常采用聚类法、空间向量模型、语义模型等。
最后知识加工的阶段中,知识推理也是很重要的一环。推理是模拟思维的基本形式之一,是从一个或多个现有判断(前提)中推断出新判断(结论)的过程。基于知识图的知识推理旨在识别错误并从现有数据中推断新结论。通过知识推理可以导出实体间的新关系,并反馈以丰富知识图,从而支持高级应用。鉴于知识图的广泛应用前景,大规模知识图的知识推理研究成为近年来自然语言处理领域的一个研究热点。
二、实体关系抽取的模型搭建与应用
1.基于Pipeline的抽取
Pipeline识别流程举例:
代码模型架构:
实体识别阶段模型示意图:
关系识别阶段模型:
BertForSequenceClassification 是在 BertModel 的基础上,添加了一个线性层 + 激活函数,用于分类。而 Huggingface 提供的预训练模型 bert-base-uncased 只包含 BertModel 的权重,不包括线性层 + 激活函数的权重。我们使用model = BertForSequenceClassification.from_pretrained(“bert-base-uncased”, config=config)来加载模型,那么线性层 + 激活函数的权重就会随机初始化,最后通过微调,学习到线性层 + 激活函数的权重。
Pipeline识别的优缺点:
2.实体关系联合抽取
联合抽取流程举例:
整体是由两个部分组成,首先BERT+CRF抽取Subject和Object,构成统一标签B-{SUB,OBJ,BOTH},I-{SUB,OBJ,BOTH}以及O;然后重用bert的编码向量序列,借鉴R-BERT思路,将[CLS], Subject, Object的向量表征拼接在一起预测关系标签。
代码模型架构:
R-Bert模型示意图:
3.级联指针标注框架(Cascade Binary Tagging Framework)
该模型是做实体和关系的联合抽取,采用层叠式指针标注框架进行训练,可以很好的解决嵌套实体识别的问题和 EPO 实体对多关系问题。
该模型首先在输入的句子中识别三元组 SPO 中的所有 subject,然后,针对候选subject 和所有关系进行一一匹配判断,看是否有 object 存在。
Cascade Binary Tagging Framework模型示意图:
代码模型架构:
三、企业画像图谱
由于base_info当中数据过多,插入结点数量会很大,初始版本中选取了前500条数据来绘制结点。
1.实体结点
一共八类结点集合:
company = [] # 公司名
tag_list = [] # 公司标签
location = [] # 公司地点
registered_capital = [] # 注册资金
juridical_person = [] # 法人信息
company_industry = [] # 公司所在行业
company_type = [] # 公司类型
staff_number = [] # 成员人数
2.实体属性
每个公司结点一共14个属性:
disease_dict[‘name’] = name # 公司名
disease_dict[‘company_id’] = ‘’ # 公司id
disease_dict[‘company_profile’] = ‘’ # 公司描述
disease_dict[‘products’] = ‘’ # 公司产品
disease_dict[‘websites’] = ‘’ # 公司网站
disease_dict[‘credit_number’] = ‘’ # 统一社会信用代码
disease_dict[‘org_code’] = ‘’ # 组织机构代码
disease_dict[‘business_status’] = ‘’ # 企业状态
disease_dict[‘establish_time’] = ‘’ # 创建时间
disease_dict[‘business_period’] = ‘’ # 营业期限
disease_dict[‘issuing_authority’] = ‘’ # 发证机关(登记机关)
disease_dict[‘approve_date’] = ‘’ # 核准时间
disease_dict[‘address’] = ‘’ # 公司地址
disease_dict[‘business_scope’] = ‘’ # 经营范围
3.结点关系
company_rel_tag_list = [] # 名字-标签关系
company_rel_location = [] # 名字-地点关系
company_rel_registered_capital = [] # 名字-资金关系
company_rel_juridical_person = [] # 名字-法人关系
company_rel_company_industry = [] # 名字-产业关系
company_rel_company_type = [] # 名字-企业类型关系
company_rel_staff_number = [] # 名字-检查关系
juridical_person_rel_registered_capital = [] # 法人-资金关系
location_rel_company_industry = [] # 地点-产业关系
location_rel_staff_number = [] # 地点-人数关系
4.图谱预览