金融領(lǐng)域:十萬級別產(chǎn)業(yè)鏈知識圖譜包括上市公司、行業(yè)和產(chǎn)品

金融領(lǐng)域:產(chǎn)業(yè)鏈知識圖譜包括上市公司、行業(yè)和產(chǎn)品共3類實體,構(gòu)建并形成了一個節(jié)點(diǎn)10w+,關(guān)系邊16w的十萬級別產(chǎn)業(yè)鏈圖譜
包括上市公司所屬行業(yè)關(guān)系、行業(yè)上級關(guān)系、產(chǎn)品上游原材料關(guān)系、產(chǎn)品下游產(chǎn)品關(guān)系、公司主營產(chǎn)品、產(chǎn)品小類共6大類。 上市公司4,654家,行業(yè)511個,產(chǎn)品95,559條、上游材料56,824條,上級行業(yè)480條,下游產(chǎn)品390條,產(chǎn)品小類52,937條,所屬行業(yè)3,946條。
領(lǐng)域知識圖譜的數(shù)據(jù)集,當(dāng)前還比較缺失,而作為構(gòu)建難度最大的產(chǎn)業(yè)鏈圖譜領(lǐng)域更為空白。產(chǎn)業(yè)鏈作為產(chǎn)業(yè)經(jīng)濟(jì)學(xué)中的一個概念,是各個產(chǎn)業(yè)部門之間基于一定的技術(shù)經(jīng)濟(jì)關(guān)聯(lián),并依據(jù)特定的邏輯關(guān)系和時空布局關(guān)系客觀形成的鏈條式關(guān)聯(lián)關(guān)系形態(tài)。從本質(zhì)上來說,產(chǎn)業(yè)鏈的本質(zhì)是用于描述一個具有某種內(nèi)在聯(lián)系的企業(yè)群結(jié)構(gòu),產(chǎn)業(yè)鏈中大量存在著上下游關(guān)系和相互價值的交換,上游環(huán)節(jié)向下游環(huán)節(jié)輸送產(chǎn)品或服務(wù),下游環(huán)節(jié)向上游環(huán)節(jié)反饋信息。

1.項目構(gòu)成
產(chǎn)業(yè)鏈知識圖譜包括A股上市公司、行業(yè)和產(chǎn)品共3類實體,包括上市公司所屬行業(yè)關(guān)系、行業(yè)上級關(guān)系、產(chǎn)品上游原材料關(guān)系、產(chǎn)品下游產(chǎn)品關(guān)系、公司主營產(chǎn)品、產(chǎn)品小類共6大類。
通過數(shù)據(jù)處理、抽取,最終建成圖譜規(guī)模數(shù)十萬,其中包括上市公司4,654家,行業(yè)511個,產(chǎn)品95,559條、上游材料56,824條,上級行業(yè)480條,下游產(chǎn)品390條,產(chǎn)品小類52,937條,所屬行業(yè)3,946條。

2.項目構(gòu)建
2.1 實體構(gòu)建
2.1.1 上市公司
目前上市公司已經(jīng)達(dá)到四千多家,是我國重要的公司代表與行業(yè)標(biāo)桿,本圖譜選取上市公司作為基礎(chǔ)實體之一。通過交易所公開信息中,可以得到上市公司代碼、全稱、簡稱、注冊地址、掛牌等多個信息。

2.1.2 行業(yè)分類
行業(yè)是產(chǎn)業(yè)鏈圖譜中另一個核心內(nèi)容,也是承載產(chǎn)業(yè)、公司及產(chǎn)品的一個媒介,通過這一領(lǐng)攜作用,可以生產(chǎn)出大量的行業(yè)指數(shù)、熱點(diǎn)行業(yè)等指標(biāo)。
目前關(guān)于行業(yè),已經(jīng)陸續(xù)出現(xiàn)多個行業(yè)規(guī)范,代表性的有申萬三級行業(yè)分類、國民經(jīng)濟(jì)行業(yè)分類等。中國上市公司所屬行業(yè)的分類準(zhǔn)則是依據(jù)營業(yè)收入等財務(wù)數(shù)據(jù)為主要分類標(biāo)準(zhǔn)和依據(jù),所采用財務(wù)數(shù)據(jù)為經(jīng)過會計事務(wù)所審計并已公開披露的合并報表數(shù)據(jù)。
2021年6月,申萬發(fā)布了2021版的行業(yè)分類規(guī)范,將1級行業(yè)從28個調(diào)整至31個、2級行業(yè)從104個調(diào)整至134個、3級行業(yè)從227個調(diào)整至346個,新增1級行業(yè)美容護(hù)理等,新增2級行業(yè),并將上市公司進(jìn)行了歸屬。本圖譜選用申萬行業(yè)作為基礎(chǔ)數(shù)據(jù)。

2.1.3 業(yè)務(wù)產(chǎn)品
業(yè)務(wù)產(chǎn)品主要指公司主營范圍、經(jīng)營的產(chǎn)品,用于對一個公司的定位??梢詮墓镜慕?jīng)營范圍、年報等文本中進(jìn)行提取得到。

2.2 關(guān)系構(gòu)建
2.2.1 公司所屬行業(yè)
通過公開的上市公司行業(yè)分類表,可以得到上市公司所對應(yīng)的行業(yè)分類數(shù)據(jù)。

2.2.2 行業(yè)上級關(guān)系
通過公開的行業(yè)三級分類情況,可以通過組合的形式得到行業(yè)之間的上級關(guān)系數(shù)據(jù)。

2.2.3 公司主營產(chǎn)品關(guān)系
上市公司的經(jīng)營產(chǎn)品數(shù)據(jù)可以從兩個方面來獲得,一個是從公司簡介中的經(jīng)營范圍中結(jié)合制定的規(guī)則進(jìn)行提取,另一個是從公司每年發(fā)布的半年報、年報中進(jìn)行提取。這些報告中會有按經(jīng)營業(yè)務(wù)、經(jīng)營產(chǎn)品、經(jīng)營地域等幾個角度對公司的營收占比進(jìn)行統(tǒng)計,也可以通過制定規(guī)則的方式進(jìn)行提取。第二種方法中,由于已經(jīng)有統(tǒng)計數(shù)據(jù),所以我們可以根據(jù)占比數(shù)據(jù)大小,對主營產(chǎn)品這一關(guān)系進(jìn)行賦值。

4)產(chǎn)品之間的上下游關(guān)系
產(chǎn)品之間的上下游關(guān)系,是展示產(chǎn)品之間傳導(dǎo)邏輯關(guān)系的一個重要方法,包括上游原材料以及下游產(chǎn)品兩大類。我們可以多種來獲?。?br>一種是基于規(guī)則模式匹配的方式進(jìn)行抽取,如抽取上游原材料這一關(guān)系可以由諸如"a是b的原料/原材料/主要構(gòu)件/重要原材料/ 上游原料"的模式進(jìn)行抽取",而下游產(chǎn)品,則同理可以通過"A是B的下游成品/產(chǎn)品"等模式進(jìn)行提取。
另一種是基于序列標(biāo)注的提取。還有一種是基于現(xiàn)有結(jié)構(gòu)化知識圖譜的提取,例如已經(jīng)結(jié)構(gòu)化好的百科知識三元組,可以通過設(shè)定謂詞及其擴(kuò)展進(jìn)行過濾。

5)產(chǎn)品之間的小類關(guān)系
對于一個產(chǎn)品而言,其是有大小層級分類的,在缺少大類產(chǎn)品名稱的時候,可以通過計算小類產(chǎn)品來得到相應(yīng)指標(biāo)。與產(chǎn)品之間的上下游數(shù)據(jù)類似,可以通過啟發(fā)式規(guī)則的方式進(jìn)行提取,如“A是一種B”,也可以通過字符之間的組成成分進(jìn)行匹配生成,如“螺紋鋼”是“精細(xì)螺紋鋼”的一個大類。

3.項目運(yùn)行
data文件夾下包括了本項目的數(shù)據(jù)信息:
1)company.json:公司實體數(shù)據(jù)
2)industry.json:行業(yè)實體數(shù)據(jù)
3)product.json:產(chǎn)品實體數(shù)據(jù)
4)companyindustry.json:公司-行業(yè)關(guān)系數(shù)據(jù) 5)industryindustry.json:行業(yè)-行業(yè)關(guān)系數(shù)據(jù)
6)productproduct.json:產(chǎn)品-產(chǎn)品數(shù)據(jù) 7)companyproduct.json:公司-產(chǎn)品數(shù)據(jù)
2、項目運(yùn)行:
python build_graph.py
import os
import json
from py2neo import Graph,Node
class MedicalGraph:
? ?def __init__(self):
? ? ? ?cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
? ? ? ?self.company_path = os.path.join(cur_dir, 'data/company.json')
? ? ? ?self.industry_path = os.path.join(cur_dir, 'data/industry.json')
? ? ? ?self.product_path = os.path.join(cur_dir, 'data/product.json')
? ? ? ?self.company_industry_path = os.path.join(cur_dir, 'data/company_industry.json')
? ? ? ?self.company_product_path = os.path.join(cur_dir, 'data/company_product.json')
? ? ? ?self.industry_industry = os.path.join(cur_dir, 'data/industry_industry.json')
? ? ? ?self.product_product = os.path.join(cur_dir, 'data/product_product.json')
? ? ? ?self.g = Graph(
? ? ? ? ? ?host="127.0.0.1", ?# neo4j 搭載服務(wù)器的ip地址,ifconfig可獲取到
? ? ? ? ? ?http_port=7474, ?# neo4j 服務(wù)器監(jiān)聽的端口號
? ? ? ? ? ?user="neo4j", ?# 數(shù)據(jù)庫user name,如果沒有更改過,應(yīng)該是neo4j
? ? ? ? ? ?password="123456")
? ?'''建立節(jié)點(diǎn)'''
? ?def create_node(self, label, nodes):
? ? ? ?count = 0
? ? ? ?for node in nodes:
? ? ? ? ? ?bodies = []
? ? ? ? ? ?for k, v in node.items():
? ? ? ? ? ? ? ?body = k + ":" + "'%s'"% v
? ? ? ? ? ? ? ?bodies.append(body)
? ? ? ? ? ?query_body = ', '.join(bodies)
? ? ? ? ? ?try:
? ? ? ? ? ? ? ?sql = "CREATE (:%s{%s})"%(label, query_body)
? ? ? ? ? ? ? ?self.g.run(sql)
? ? ? ? ? ? ? ?count += 1
? ? ? ? ? ?except:
? ? ? ? ? ? ? ?pass
? ? ? ? ? ?print(count, len(nodes))
? ? ? ?return 1
? ?"""加載數(shù)據(jù)"""
? ?def load_data(self, filepath):
? ? ? ?datas = []
? ? ? ?with open(filepath, 'r') as f:
? ? ? ? ? ?for line in f:
? ? ? ? ? ? ? ?line = line.strip()
? ? ? ? ? ? ? ?if not line:
? ? ? ? ? ? ? ? ? ?continue
? ? ? ? ? ? ? ?obj = json.loads(line)
? ? ? ? ? ? ? ?if not obj:
? ? ? ? ? ? ? ? ? ?continue
? ? ? ? ? ? ? ?datas.append(obj)
? ? ? ?return datas
? ?'''創(chuàng)建知識圖譜實體節(jié)點(diǎn)類型schema'''
? ?def create_graphnodes(self):
? ? ? ?company = self.load_data(self.company_path)
? ? ? ?product = self.load_data(self.product_path)
? ? ? ?industry = self.load_data(self.industry_path)
? ? ? ?self.create_node('company', company)
? ? ? ?print(len(company))
? ? ? ?self.create_node('product', product)
? ? ? ?print(len(product))
? ? ? ?self.create_node('industry', industry)
? ? ? ?print(len(industry))
? ? ? ?return
? ?'''創(chuàng)建實體關(guān)系邊'''
? ?def create_graphrels(self):
? ? ? ?company_industry = self.load_data(self.company_industry_path)
? ? ? ?company_product = self.load_data(self.company_product_path)
? ? ? ?product_product = self.load_data(self.product_product)
? ? ? ?industry_industry = self.load_data(self.industry_industry)
? ? ? ?self.create_relationship('company', 'industry', company_industry, "company_name", "industry_name")
? ? ? ?self.create_relationship('industry', 'industry', industry_industry, "from_industry", "to_industry")
? ? ? ?self.create_relationship_attr('company', 'product', company_product, "company_name", "product_name")
? ? ? ?self.create_relationship('product', 'product', product_product, "from_entity", "to_entity")
? ?'''創(chuàng)建實體關(guān)聯(lián)邊'''
? ?def create_relationship(self, start_node, end_node, edges, from_key, end_key):
? ? ? ?count = 0
? ? ? ?for edge in edges:
? ? ? ? ? ?try:
? ? ? ? ? ? ? ?p = edge[from_key]
? ? ? ? ? ? ? ?q = edge[end_key]
? ? ? ? ? ? ? ?rel = edge["rel"]
? ? ? ? ? ? ? ?query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s]->(q)" % (
? ? ? ? ? ? ? ?start_node, end_node, p, q, rel)
? ? ? ? ? ? ? ?self.g.run(query)
? ? ? ? ? ? ? ?count += 1
? ? ? ? ? ? ? ?print(rel, count, all)
? ? ? ? ? ?except Exception as e:
? ? ? ? ? ? ? ?print(e)
? ? ? ?return
? ?'''創(chuàng)建實體關(guān)聯(lián)邊'''
? ?def create_relationship_attr(self, start_node, end_node, edges, from_key, end_key):
? ? ? ?count = 0
? ? ? ?for edge in edges:
? ? ? ? ? ?p = edge[from_key]
? ? ? ? ? ?q = edge[end_key]
? ? ? ? ? ?rel = edge["rel"]
? ? ? ? ? ?weight = edge["rel_weight"]
? ? ? ? ? ?query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{%s:'%s'}]->(q)" % (
? ? ? ? ? ? ? ?start_node, end_node, p, q, rel, "權(quán)重", weight)
? ? ? ? ? ?try:
? ? ? ? ? ? ? ?self.g.run(query)
? ? ? ? ? ? ? ?count += 1
? ? ? ? ? ? ? ?print(rel, count)
? ? ? ? ? ?except Exception as e:
? ? ? ? ? ? ? ?print(e)
? ? ? ?return
if __name__ == '__main__':
? ?handler = MedicalGraph()
? ?handler.create_graphnodes()
? ?handler.create_graphrels()
4.項目總結(jié)
產(chǎn)業(yè)鏈圖譜是眾多領(lǐng)域知識圖譜中較為棘手的一種,本項目通過現(xiàn)有的數(shù)據(jù),借助數(shù)據(jù)處理、結(jié)構(gòu)化提取方式,設(shè)計、構(gòu)建并形成了一個節(jié)點(diǎn)100,718,關(guān)系邊169,153的十萬級別產(chǎn)業(yè)鏈圖譜。就產(chǎn)業(yè)鏈圖譜的構(gòu)建而言,我們需要至少從以上三個方面加以考慮:
其一,產(chǎn)業(yè)鏈的主觀性與標(biāo)準(zhǔn)性。產(chǎn)業(yè)鏈的主觀性較強(qiáng),不同的人對產(chǎn)業(yè)鏈的構(gòu)建、產(chǎn)業(yè)鏈節(jié)點(diǎn)、關(guān)系的類型,產(chǎn)業(yè)鏈的顆粒度問題都有不同的理解。不同的設(shè)定會直接導(dǎo)致不同的應(yīng)用結(jié)果。正如我們所看到的,目前存在不同的行業(yè)標(biāo)準(zhǔn),不同的網(wǎng)站、機(jī)構(gòu)也將公司歸為不同的行業(yè)。
其二,產(chǎn)業(yè)鏈的動態(tài)性和全面性。產(chǎn)業(yè)鏈需要具備足夠大的復(fù)用性和擴(kuò)展性,幾千家上市公司實際上是冰山一角。國內(nèi)有幾千萬家公司,而且不斷會有新增,如何將新增的公司融入到這個額產(chǎn)業(yè)鏈中,也是一個很大挑戰(zhàn)。此外,產(chǎn)業(yè)本身是動態(tài)的, 隨著行業(yè)的發(fā)展,不斷會有新的行業(yè)出現(xiàn)。如何捕捉這種行業(yè)的變化,使得整個圖譜變得與時俱進(jìn),也是需要考量的點(diǎn)。
其三,產(chǎn)業(yè)鏈的定量推理特性。單純定性的構(gòu)建產(chǎn)業(yè)鏈知識圖譜,如果沒有足夠的參數(shù),僅有知識表達(dá)是無法進(jìn)行推理的,推理要求知識圖譜Schema具備節(jié)點(diǎn)間推理傳導(dǎo)的必備參數(shù),以及影響推理傳導(dǎo)的其他關(guān)鍵參數(shù)。對于必備參數(shù)來說,從公司到產(chǎn)品必須有主營占比、市場占比、產(chǎn)能占比等數(shù)據(jù),從產(chǎn)品到產(chǎn)品必須有成本占比和消耗占比等數(shù)據(jù)。
參考數(shù)據(jù)來源 1、申萬行業(yè):http://www.swsindex.com
2、深交所: http://www.szse.cn
3、上交所: http://www.sse.com.cn
項目鏈接:
[鏈接跳轉(zhuǎn)] https://blog.csdn.net/sinat_39620217/article/details/131918468
更多優(yōu)質(zhì)內(nèi)容請關(guān)注公號:汀丶人工智能;會提供一些相關(guān)的資源和優(yōu)質(zhì)文章,免費(fèi)獲取閱讀。
