知識圖譜:行業圖譜實戰
一、前言
關於知識圖譜的概念,這裡不加贅述,可以參考:知識圖譜簡介
下文會基於上市公司的基本資料,如:行業、地區、高管等,進行一個簡單的實戰。
二、構建步驟
1、資料抽取
上市公司的資訊可以從很多地方獲取到,包括證監會或各類財經網站,或者工商局官網等等,基於獲取難度與專案要求,使用以下網站:
新浪財經
巨潮資訊網
(1)上市公司基本資料
這裡從新浪財經獲取,基本沒有難度,筆者已經擁有一份資料,這裡就不加介紹了,總共包含3000+的上市公司資訊,結構如下:
(2)上市公司高管資料
上述兩個網站得到的資料都是結構化資料,可以很輕易的確定實體,及實體關係。
2、資料融合
這裡只有兩個互不相關的資料來源,資料基本可以直接使用,忽略資料來源的錯誤。
對於每一個實體,我們希望實體是唯一的,對於上市公司,可以直接使用股票程式碼,而人物,這裡用簡單“出生日期+性別+姓名”的雜湊碼來確定。如下:
hash_md5(person[u'出生年份']+person[u'性別']+person[u'姓名'])
考慮到資料來源簡單,行業與地區都直接使用名稱即可,對原始資料進行處理,分別提取出人物、公司、行業、地區的實體。
3、本體概念確定
上文定義了四個概念:人物、公司、行業、地區,同時分別確定了概念下擁有的屬性,如:姓名、學歷、股票程式碼、上市日期等,按照這個規則,我們定義了行業圖譜下的本體庫。
4、關係圖譜搭建
前面的資料都存在mongo中,圖資料庫擁有更加友好的視覺化介面及關係計算功能,接下來將資料轉為三元組,匯入到neo4中。
關於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)企業風險評估、企業社交圖譜等等