一、概述
1.概念

知识图谱(Knowledge Graph)是人工智能的重要分支技术,它在2012年由谷歌提出,是结构化的语义知识库,用于以符号形式描述物理世界中的概念及其相互关系,其基本组成单位是“实体—关系—实体”三元组,以及实体及其相关属性—值对,实体间通过关系相互联结,构成网状的知识结构。
从字面上看,知识图谱就是用图的形式将知识表示出来。图中的结点代表语义实体或概念,边代表结点间的各种语义关系。
上图不同节点之间的关系可以表示为三元组,例如<上海星时网络科技有限公司,公司法人,杜耀斐>表示公司的法人是某某某。
这是一种常用的基于符号的知识表示方式——资源描述框架(Resource Description Framework,RDF),它把知识表示为一个包含主语(Subject)、谓语(Predicate)和宾语(Object)的三元组。
2.知识图谱分类
知识图谱按照功能和应用场景可以分为通用知识图谱和领域知识图谱。
其中通用知识图谱面向的是通用领域,强调知识的广度,形态通常为结构化的百科知识,针对的使用者主要为普通用户;
领域知识图谱则面向某一特定领域,强调知识的深度,通常需要基于该行业的数据库进行构建,针对的使用者为行业内的从业人员以及潜在的业内人士等。
企业用户画像图谱(neo4j,123456)属于领域知识图谱。
实体关系的抽取的分类与划分:

3.知识图谱的表示和存储
知识表示的方式主要有以下几种:

根据最新的统计(2018 年上半年),图数据库仍然是增长最快的存储系统。相反,关系型数据库的增长基本保持在一个稳定的水平。同时,我们也列出了常用的图数据库系统以及他们最新使用情况的排名。 其中 Neo4j 系统目前仍是使用率最高的图数据库,它拥有活跃的社区,而且系统本身的查询效率高,但唯一的不足就是不支持准分布式。相反,OrientDB 和 JanusGraph(原 Titan)支持分布式,但这些系统相对较新,社区不如 Neo4j 活跃,这也就意味着使用过程当中不可避免地会遇到一些刺手的问题。如果选择使用 RDF 的存储系统,Jena 或许一个比较不错的选择。

4.知识图谱的应用
行业领域

人与机器通过自然语言进行问答与对话也是人工智能实现的标志之一,知识图谱也广泛应用于人机问答交互中。借助自然语言处理和知识图谱技术,比如基于语义解析、基于图匹配、基于模式学习、基于表示学习和深度学习的知识图谱模型。

在上面的信息抽取阶段我们都比较熟悉,而在知识融合阶段中的知识融合、指代消歧和实体歧会比较陌生,下面来简单介绍一下:
在实体命名识别和关系抽取过程中,有两个比较棘手的问题:一个是实体统一,也就是说有些实体写法上不一样,但其实是指向同一个实体。比如“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.图谱预览
