1. 程式人生 > >知識圖譜:行業圖譜實戰

知識圖譜:行業圖譜實戰

一、前言

關於知識圖譜的概念,這裡不加贅述,可以參考:知識圖譜簡介
下文會基於上市公司的基本資料,如:行業、地區、高管等,進行一個簡單的實戰。

二、構建步驟

1、資料抽取

上市公司的資訊可以從很多地方獲取到,包括證監會或各類財經網站,或者工商局官網等等,基於獲取難度與專案要求,使用以下網站:
新浪財經
巨潮資訊網

(1)上市公司基本資料

這裡從新浪財經獲取,基本沒有難度,筆者已經擁有一份資料,這裡就不加介紹了,總共包含3000+的上市公司資訊,結構如下:
這裡寫圖片描述

(2)上市公司高管資料

上述兩個網站得到的資料都是結構化資料,可以很輕易的確定實體,及實體關係。

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屬性自動成為瀏覽器介面中節點的名稱,如圖:
這裡寫圖片描述

(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”關係,同上;

三、例項

通過上述步驟,一個簡單的行業知識圖譜就已經構造完成了,

查詢公司關聯

通過構建完畢的圖譜,可以查詢上市公司之間的關聯關係,如:
這裡寫圖片描述
上述便是簡單的浦發銀行通過高管與其他公司的關聯關係,如果要更加深入,將關係維度擴大即可。

其他

(1)企業實際控制人查詢,增加股權結構關係,通過法人持有股份最終追蹤到實際控制人
(2)企業風險評估、企業社交圖譜等等