金融领域:产业链知识图谱包括上市公司、行业和产品共3类实体,构建并形成了一个节点10w+,关系边16w的十万级别产业链图谱

2023-07-25 15:09:29

在这里插入图片描述

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用 CSDN 平台,自主完成项目设计升级,提升自身的硬实力。

在这里插入图片描述

  1. 专栏订阅:项目大全提升自身的硬实力

  2. [专栏详细介绍:项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

# 金融领域:产业链知识图谱包括上市公司、行业和产品共3类实体,构建并形成了一个节点10w+,关系边16w的十万级别产业链图谱

包括上市公司所属行业关系、行业上级关系、产品上游原材料关系、产品下游产品关系、公司主营产品、产品小类共6大类。 上市公司4,654家,行业511个,产品95,559条、上游材料56,824条,上级行业480条,下游产品390条,产品小类52,937条,所属行业3,946条。

领域知识图谱的数据集,当前还比较缺失,而作为构建难度最大的产业链图谱领域更为空白。产业链作为产业经济学中的一个概念,是各个产业部门之间基于一定的技术经济关联,并依据特定的逻辑关系和时空布局关系客观形成的链条式关联关系形态。从本质上来说,产业链的本质是用于描述一个具有某种内在联系的企业群结构,产业链中大量存在着上下游关系和相互价值的交换,上游环节向下游环节输送产品或服务,下游环节向上游环节反馈信息。

1.项目构成

产业链知识图谱包括A股上市公司、行业和产品共3类实体,包括上市公司所属行业关系、行业上级关系、产品上游原材料关系、产品下游产品关系、公司主营产品、产品小类共6大类。

通过数据处理、抽取,最终建成图谱规模数十万,其中包括上市公司4,654家,行业511个,产品95,559条、上游材料56,824条,上级行业480条,下游产品390条,产品小类52,937条,所属行业3,946条。

2.项目构建

2.1 实体构建

2.1.1 上市公司

目前上市公司已经达到四千多家,是我国重要的公司代表与行业标杆,本图谱选取上市公司作为基础实体之一。通过交易所公开信息中,可以得到上市公司代码、全称、简称、注册地址、挂牌等多个信息。

2.1.2 行业分类

行业是产业链图谱中另一个核心内容,也是承载产业、公司及产品的一个媒介,通过这一领携作用,可以生产出大量的行业指数、热点行业等指标。
目前关于行业,已经陆续出现多个行业规范,代表性的有申万三级行业分类、国民经济行业分类等。中国上市公司所属行业的分类准则是依据营业收入等财务数据为主要分类标准和依据,所采用财务数据为经过会计事务所审计并已公开披露的合并报表数据。
2021年6月,申万发布了2021版的行业分类规范,将1级行业从28个调整至31个、2级行业从104个调整至134个、3级行业从227个调整至346个,新增1级行业美容护理等,新增2级行业,并将上市公司进行了归属。本图谱选用申万行业作为基础数据。

2.1.3 业务产品

业务产品主要指公司主营范围、经营的产品,用于对一个公司的定位。可以从公司的经营范围、年报等文本中进行提取得到。

2.2 关系构建

2.2.1 公司所属行业

通过公开的上市公司行业分类表,可以得到上市公司所对应的行业分类数据。

2.2.2 行业上级关系

通过公开的行业三级分类情况,可以通过组合的形式得到行业之间的上级关系数据。

2.2.3 公司主营产品关系

上市公司的经营产品数据可以从两个方面来获得,一个是从公司简介中的经营范围中结合制定的规则进行提取,另一个是从公司每年发布的半年报、年报中进行提取。这些报告中会有按经营业务、经营产品、经营地域等几个角度对公司的营收占比进行统计,也可以通过制定规则的方式进行提取。第二种方法中,由于已经有统计数据,所以我们可以根据占比数据大小,对主营产品这一关系进行赋值。

4)产品之间的上下游关系
产品之间的上下游关系,是展示产品之间传导逻辑关系的一个重要方法,包括上游原材料以及下游产品两大类。我们可以多种来获取:
一种是基于规则模式匹配的方式进行抽取,如抽取上游原材料这一关系可以由诸如"a是b的原料/原材料/主要构件/重要原材料/ 上游原料"的模式进行抽取",而下游产品,则同理可以通过"A是B的下游成品/产品"等模式进行提取。
另一种是基于序列标注的提取。还有一种是基于现有结构化知识图谱的提取,例如已经结构化好的百科知识三元组,可以通过设定谓词及其扩展进行过滤。

5)产品之间的小类关系
对于一个产品而言,其是有大小层级分类的,在缺少大类产品名称的时候,可以通过计算小类产品来得到相应指标。与产品之间的上下游数据类似,可以通过启发式规则的方式进行提取,如“A是一种B”,也可以通过字符之间的组成成分进行匹配生成,如“螺纹钢”是“精细螺纹钢”的一个大类。

3.项目运行

  • data文件夹下包括了本项目的数据信息:
    1)company.json:公司实体数据
    2)industry.json:行业实体数据
    3)product.json:产品实体数据
    4)company_industry.json:公司-行业关系数据
    5)industry_industry.json:行业-行业关系数据
    6)product_product.json:产品-产品数据
    7)company_product.json:公司-产品数据

2、项目运行:

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 搭载服务器的ip地址,ifconfig可获取到
            http_port=7474,  # neo4j 服务器监听的端口号
            user="neo4j",  # 数据库user name,如果没有更改过,应该是neo4j
            password="123456")

    '''建立节点'''
    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



    """加载数据"""
    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



    '''创建知识图谱实体节点类型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

    '''创建实体关系边'''
    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")


    '''创建实体关联边'''
    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


    '''创建实体关联边'''
    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, "权重", 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.项目总结

产业链图谱是众多领域知识图谱中较为棘手的一种,本项目通过现有的数据,借助数据处理、结构化提取方式,设计、构建并形成了一个节点100,718,关系边169,153的十万级别产业链图谱。就产业链图谱的构建而言,我们需要至少从以上三个方面加以考虑:

  • 其一,产业链的主观性与标准性。产业链的主观性较强,不同的人对产业链的构建、产业链节点、关系的类型,产业链的颗粒度问题都有不同的理解。不同的设定会直接导致不同的应用结果。正如我们所看到的,目前存在不同的行业标准,不同的网站、机构也将公司归为不同的行业。

  • 其二,产业链的动态性和全面性。产业链需要具备足够大的复用性和扩展性,几千家上市公司实际上是冰山一角。国内有几千万家公司,而且不断会有新增,如何将新增的公司融入到这个额产业链中,也是一个很大挑战。此外,产业本身是动态的, 随着行业的发展,不断会有新的行业出现。如何捕捉这种行业的变化,使得整个图谱变得与时俱进,也是需要考量的点。

  • 其三,产业链的定量推理特性。单纯定性的构建产业链知识图谱,如果没有足够的参数,仅有知识表达是无法进行推理的,推理要求知识图谱Schema具备节点间推理传导的必备参数,以及影响推理传导的其他关键参数。对于必备参数来说,从公司到产品必须有主营占比、市场占比、产能占比等数据,从产品到产品必须有成本占比和消耗占比等数据。

  • 参考数据来源
    1、申万行业:http://www.swsindex.com
    2、深交所: http://www.szse.cn
    3、上交所: http://www.sse.com.cn

项目码源见文章顶部or文末

https://download.csdn.net/download/sinat_39620217/87999923

更多推荐

C++设计模式_04_Strategy 策略模式

接上篇,本篇将会介绍C++设计模式中的Strategy策略模式,和上篇模板方法TemplateMethod一样,仍属于“组件协作”模式,它与TemplateMethod有着异曲同工之妙。文章目录1.动机(Motivation)2.代码演示Strategy策略模式2.1传统方法处理2.2怎么用扩展的方式来支持未来的变化呢

PROB: Probabilistic Objectness for Open World Object Detection(论文解析)

PROB:ProbabilisticObjectnessforOpenWorldObjectDetection摘要2相关工作摘要开放世界目标检测(OWOD)是一个新的、具有挑战性的计算机视觉任务,它弥合了传统的目标检测(OD)基准和现实世界中的目标检测之间的差距。除了检测和分类已知/标记的对象外,OWOD算法还应该能够

【论文阅读】Untargeted Backdoor Attack Against Object Detection(针对目标检测的无目标后门攻击)

文章目录一.论文信息二.论文内容0.摘要1.论文概述2.背景介绍3.作者贡献4.重点图表一.论文信息论文题目:UntargetedBackdoorAttackAgainstObjectDetection(针对目标检测的无目标后门攻击)发表年份:2023-ICASSP(CCF-B)作者信息:ChengxiaoLuo(清华

为什么JWT要结合Redis使用

JWT解决了什么问题存储token的情况:校验token需要重复调用数据库耗时的问题JWT本身缺陷alg不要指定为none算法不要指定数组,只使用一种算法令牌长度可能会超过允许的URL长度,和cookie长度如果需要跟踪用于速率限制和IP白名单的API这些功能,那么使用无状态是不现实的以上都是容易避免的问题,JWT最大

Java实现截取视频第一帧

目录前言一、通过Java借助第三方库实现1.引用ffmpeg使用maven,导入pom依赖:工具类2.引用jcodec二、使用第三方存储自带的方法实现(如阿里云OSS、华为云OBS)前言在实际项目中,会遇到上传视频后,需要截取视频的首帧或指定帧为图片,作为展示使用的需求。这个需求本身并不难,而且网上一搜一大把,今天就针

Sui Move智能合约提供更智能和简单的编程

编写区块链和其他计算环境的代码有很多相似之处,但区块链的重点大部分都集中在构建智能合约上。智能合约部署编译后的代码,本质上是在区块链上自动执行交易的apps。Sui网络本地的Sui虚拟机使用SuiMove编程语言编写智能合约。术语“智能合约”意味着区块链网络独特的以交易为中心的环境。考虑到区块链的无需许可以及公共环境的

[设计模式]springboot优雅实现策略器模式(加入注册器实现)

优雅实现策略器模式场景废话少说,源码地址。讲解关于本文创建登陆策略创建环境(注册器)简化代码创建父类对象,也方便后期扩展具体策略实现类用户名密码登陆手机号登陆触发点调试简言场景登陆场景使用(登陆之后返回用户信息和token所做操作基本一致,杜绝多个判断)用户名密码登陆,指纹登录手机号登陆楼主之前写过一次通过注解实现的,

NoSQL之 Redis配置与优化

1、关系数据库与非关系型数据库1.1关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。主流的关系型数据库包括Oracle、MySQL、SQLServer、Micros

软件设计模式系列之三———工厂方法模式

1模式的定义工厂方法模式是一种常见的设计模式,属于创建型设计模式之一,它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化,将具体对象的实例化延迟到子类中完成,以便在不同情况下可以创建不同类型的对象,而客户端代码不需要知道实际创建的对象类型。2举例说明不同公司都生产自己的手机,就符合工厂方法模式。比如

探索GmSSL+Nginx实践及原理

前言随着大国崛起步伐的迈进,敏感单位的数据安全问题越发受到重视,数据的加密安全传输尤为重要,对于安全问题,国家自研加密算法提供了有力的保障。作为信创行业的国有企业,十分有必要在网络通信中使用国密算法加密通信,保障客户数据安全,做出客户放心满意的产品。本文将介绍如何制作出支持国密算法的nginx,及相关原理。GmSSL介

Java线程池详解

好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。线程池一般用于执行多个不相关联的耗时任务,

热文推荐