关于知识图谱的概念,这里不加赘述,可以参考:知识图谱简介
下文会基于上市公司的基本数据,如:行业、地区、高管等,进行一个简单的实战。
上市公司的信息可以从很多地方获取到,包括证监会或各类财经网站,或者工商局官网等等,基于获取难度与项目要求,使用以下网站:
新浪财经
巨潮资讯网
这里从新浪财经获取,基本没有难度,笔者已经拥有一份数据,这里就不加介绍了,总共包含3000+的上市公司信息,结构如下:
高管数据从新浪也可以直接找到,这里使用巨潮资讯网的数据,可以看到网站提供了高管和股权结构等数据,如下:
网页结构很简单,将股票代码通过网站的接口:http://www.cninfo.com.cn/search/searchzx.jsp,转化为默认结构,再通过:http://www.cninfo.com.cn/information/management/*.html,请求数据即可,获取得到的数据直接存在mongo中,如下:
上述两个网站得到的数据都是结构化数据,可以很轻易的确定实体,及实体关系。
这里只有两个互不相关的数据源,数据基本可以直接使用,忽略数据源的错误。
对于每一个实体,我们希望实体是唯一的,对于上市公司,可以直接使用股票代码,而人物,这里用简单“出生日期+性别+姓名”的哈希码来确定。如下:
hash_md5(person[u'出生年份']+person[u'性别']+person[u'姓名'])
考虑到数据源简单,行业与地区都直接使用名称即可,对原始数据进行处理,分别提取出人物、公司、行业、地区的实体。
上文定义了四个概念:人物、公司、行业、地区,同时分别确定了概念下拥有的属性,如:姓名、学历、股票代码、上市日期等,按照这个规则,我们定义了行业图谱下的本体库。
前面的数据都存在mongo中,图数据库拥有更加友好的可视化界面及关系计算功能,接下来将数据转为三元组,导入到neo4中。
关于neo4j不做介绍,详情请自行了解:neo4j教程
对于neo4j的操作使用python库py2neo,如下:
from py2neo import Graph, Node, Relationship
Graph = Graph(NEO4J_SERVER, username=NEO4J_USR, password=NEO4J_PWD)
在neo4j中,需要为每一个实体创建节点:
for person in persons:
node = Node("Person", **person)
Graph.create(node)
Node的name属性自动成为浏览器界面中节点的名称,如图:
在上文中定义了四个概念,概念间存在“公司–人物”,“公司–行业”,“公司–地区”这三种关系,需要为每一种关系进行创建:
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”关系,同上;
通过上述步骤,一个简单的行业知识图谱就已经构造完成了,
通过构建完毕的图谱,可以查询上市公司之间的关联关系,如:
上述便是简单的浦发银行通过高管与其他公司的关联关系,如果要更加深入,将关系维度扩大即可。
(1)企业实际控制人查询,增加股权结构关系,通过法人持有股份最终追踪到实际控制人
(2)企业风险评估、企业社交图谱等等