知识图谱:行业图谱实战

一、前言

关于知识图谱的概念,这里不加赘述,可以参考:知识图谱简介
下文会基于上市公司的基本数据,如:行业、地区、高管等,进行一个简单的实战。

二、构建步骤

1、数据抽取

上市公司的信息可以从很多地方获取到,包括证监会或各类财经网站,或者工商局官网等等,基于获取难度与项目要求,使用以下网站:
新浪财经
巨潮资讯网

(1)上市公司基本数据

这里从新浪财经获取,基本没有难度,笔者已经拥有一份数据,这里就不加介绍了,总共包含3000+的上市公司信息,结构如下:
知识图谱:行业图谱实战_第1张图片

(2)上市公司高管数据

高管数据从新浪也可以直接找到,这里使用巨潮资讯网的数据,可以看到网站提供了高管和股权结构等数据,如下:
知识图谱:行业图谱实战_第2张图片
网页结构很简单,将股票代码通过网站的接口:http://www.cninfo.com.cn/search/searchzx.jsp,转化为默认结构,再通过:http://www.cninfo.com.cn/information/management/*.html,请求数据即可,获取得到的数据直接存在mongo中,如下:
知识图谱:行业图谱实战_第3张图片

上述两个网站得到的数据都是结构化数据,可以很轻易的确定实体,及实体关系。

2、数据融合

这里只有两个互不相关的数据源,数据基本可以直接使用,忽略数据源的错误。
对于每一个实体,我们希望实体是唯一的,对于上市公司,可以直接使用股票代码,而人物,这里用简单“出生日期+性别+姓名”的哈希码来确定。如下:

hash_md5(person[u'出生年份']+person[u'性别']+person[u'姓名'])

考虑到数据源简单,行业与地区都直接使用名称即可,对原始数据进行处理,分别提取出人物、公司、行业、地区的实体。

3、本体概念确定

上文定义了四个概念:人物、公司、行业、地区,同时分别确定了概念下拥有的属性,如:姓名、学历、股票代码、上市日期等,按照这个规则,我们定义了行业图谱下的本体库。

4、关系图谱搭建

前面的数据都存在mongo中,图数据库拥有更加友好的可视化界面及关系计算功能,接下来将数据转为三元组,导入到neo4中。
关于neo4j不做介绍,详情请自行了解:neo4j教程

(1)连接创建

对于neo4j的操作使用python库py2neo,如下:

from py2neo import Graph, Node, Relationship
Graph = Graph(NEO4J_SERVER, username=NEO4J_USR, password=NEO4J_PWD)
(2)创建节点

在neo4j中,需要为每一个实体创建节点:

for person in persons:
    node = Node("Person", **person)
    Graph.create(node)

Node的name属性自动成为浏览器界面中节点的名称,如图:
知识图谱:行业图谱实战_第4张图片

(3)创建关系

在上文中定义了四个概念,概念间存在“公司–人物”,“公司–行业”,“公司–地区”这三种关系,需要为每一种关系进行创建:

   node = Node("Company", **company)
   neo4j.Graph.create(node)
   industry = company['industry']
   if industry:
       r_node = neo4j.Graph.find_one("Industry", "name", industry)
       company_r_industry = Relationship(node, "Profit", r_node)
       neo4j.Graph.create(company_r_industry)

对于人物与公司之间定义了“Manage”关系,找到公司对应的高管在neo4j中的实体节点,然后构建关系;
公司与行业之间定义了“Profit”关系,同上;
公司与地区之前定义了“Located”关系,同上;

三、实例

通过上述步骤,一个简单的行业知识图谱就已经构造完成了,

查询公司关联

通过构建完毕的图谱,可以查询上市公司之间的关联关系,如:
知识图谱:行业图谱实战_第5张图片
上述便是简单的浦发银行通过高管与其他公司的关联关系,如果要更加深入,将关系维度扩大即可。

其他

(1)企业实际控制人查询,增加股权结构关系,通过法人持有股份最终追踪到实际控制人
(2)企业风险评估、企业社交图谱等等

你可能感兴趣的:(知识图谱,自然语言基础)