python 金融知识图谱_从零搭建金融证券知识图谱-Part2
引言
本文作为本系列文章的第二篇。主要阐述金融证券知识图谱涉及的数据抽取过程及其在相关工作中的应用。具体说明如何实现数据的获取以及如何构建相应的数据分析模型。
本文作为本系列文章的第二篇。主要阐述金融证券知识图谱涉及的数据抽取过程及其在相关工作中的应用。具体说明如何实现数据的获取以及如何构建相应的数据分析模型。
数据抽取和实体对齐
图谱存储和图谱应用
图谱更新
我会将全部代码以Jupyter Notebook的形式在GitHub上开源,并在个人GitHub账号kevin-meng的金融与股票知识图谱中发布此内容,请对这个领域感兴趣的朋友们能够轻松地复制并学习其中的知识点与技术实现细节。如果觉得这篇分享对您有所帮助,请别忘了给个星号支持一下哦!https://github.com/kevin-meng/financial_stock_knowledge_graph github.com
1. 数据抽取
基于前一阶段构建的数据模型,在Neo4j admin import操作的标准格式下提取数据,并将提取的数据按照指定格式导出至指定路径存储。
涉及完整的代码库在 GitHub 上可查看。由于篇幅较长且考虑到阅读体验问题……主要探讨两类节点及一种关系的统一处理方案其中各类具体的实现方法相对固定
1.1 公司
各项数据分散记录于上市公司基本信息表、公募基金列表表以及公募基金公司表三者之中。需对这些数据进行整合处理,并采用公司全称(fullname)字段作为唯一标识。同时为三类公司分别标注相应的标识代码:上市公司的代码为LISTED_COMPANY,基金管理公司的代码为FUND_MANAGER,基金托管公司的代码为FUND_CUSTODIAN。
1.2 实体对齐
在单位名称方面,在经过详细比对后发现在fund_company和fund_basic两张数据表中包含五个银行机构和一家证券公司的名称简称未能完全匹配(即存在一单位名称对应多个简称的情况)。
我们手动筛选出一个子集['\text{中国民生银行}', \text{其他银行名称}]其中每个元素都以"China"开头
comp_simplify_dict = {
'中国民生银行':'民生银行',
'中国光大银行':'光大银行',
'中国工商银行':'工商银行',
'中国建设银行':'建设银行',
'中国农业银行':'农业银行',
'中银国际证券':'中银证券',
'财通证券资管':'财通资管'}
此外,在 fund_basic 中的管理机构中有 12 家公司不在 fund_company 的数据表中记录。需额外补充完整名称。
基金管理人补齐全称
fund_manage_fullname_dict = {
'东证资管':'东方证券资产管理有限公司',
'中泰资管':'中泰证券(上海)资产管理有限公司',
'华泰证券资管':'华华泰证券资产管理公司',
'华融基金':'华融基金管理有限公司',
'博远基金':'博远基金管理有限公司',
'同泰基金':'同泰基金管理有限公司',
'平安基金':'平安基金管理有限公司',
'惠升基金':'惠升基金管理有限公司',
'朱雀基金':'朱雀基金管理有限公司',
'淳厚基金':'淳厚基金管理有限公司',
'睿远基金':'睿远基金管理有限公司',
'西藏东财基金':'西藏东财基金管理有限公司',
'山西证券':'山西证券股份有限公司',
'恒丰银行':'恒丰银行股份有限公司',
'广发银行':'广发银行股份有限公司'}
在实际工作中,在这块区域的对齐工作至关重要,并直接影响后续关系图谱以及上层应用的效果。必须给予高度关注。 对齐方法除了人工之外,则会普遍采用机器学习和自然语言处理相关的模型。
1.3 节点:人(上市公司董事高管)
为了确保公司高管在没有个人身份ID的情况下仍能获得唯一的标识符, 我们采用了将每位高管的姓名. 性别以及出生日期结合起来的方法, 并通过哈希算法生成其独特标识.
import hashlib
def get_md5(string):
"""Get md5 according to the string
"""
byte_string = string.encode("utf-8")
md5 = hashlib.md5()
md5.update(byte_string)
result = md5.hexdigest()
return result
1.4 关系:公司(上市公司)--> 人(董事高管)
通过分析数据集中的信息可知,在上市公司与个人的关系中存在六种主要类型:董事会成员、监事、委员会成员、高管以及核心技术人员之外的其他人员。由于Neo4j平台不具备对边执行索引操作的能力,在实际应用中难以实现高效的图数据库查询功能。因此打算按照类别分别构建这些关系网络以解决这一技术难题。
图谱存储
在完成数据抽取和对齐之后, 下一步我们可以将其导入图数据库Neo4j中. 例如具体的命令如下所示:
neo4j-admin import --database=finance_graph.db \
--nodes node_city-header.csv,node_city.csv \
--nodes node_companies-header.csv,node_companies.csv \
--nodes node_funds-header.csv,node_funds.csv \
--nodes node_industries-header.csv,node_industries.csv \
--nodes node_managers-header.csv,node_managers.csv \
--nodes node_province-header.csv,node_province.csv \
--relationships rel_city_in_province-header.csv,rel_city_in_province.csv \
--relationships rel_company_in_city-header.csv,rel_company_in_city.csv \
--relationships rel_fund_has_custodian-header.csv,rel_fund_has_custodian.csv \
--relationships rel fund has management-(Header), rel fund has management-(includes management).csv
创建一个引用到这两个CSV文件的关系标签:[rel_fund_listed_company portfolio] 和 [rel_fund_listed_company portfolio]
请参考以下改写后的文本
--relationships rel_listed_company_has_manager-header,rel_listed_company_has_manager-name.csv
-- relationships rel_share_in_industry-header .csv , rel_share_in_industry .csv
--ignore-duplicate-nodes=true \
--ignore-missing-nodes=true
导入成功,应该可以看到下面的内容。整个导入时间只要 11s。还是很快的。
最后,在Neo4j默认情况下会将/database下的graph.db作为启动库;为了避免数据丢失或相关问题,在之后的操作中我倾向于使用软连接来关联起所有相关的启动库。你可以访问localhost:7474处可以看到以下界面
备份数据库
cp -r finance_graph.db finance_graph.db.backup
创建软链接
ln -s finance_graph.db graph.db
启动数据库
neo4j console
总结
至此完成金融证券知识图谱的初步构建工作。正如"学以致用"这一理念所言,下一步计划利用已构建的知识图谱解决若干实际问题,以体会其价值所在并展现优势所在。期待接下来能为您带来更加有趣的内容
参考文章
请注意:我的公众号名为'知行并重',热忱欢迎您的关注。我将在这里介绍金融风控、图挖掘技术及相关知识图谱相关内容,并与您共同探讨相关领域的话题
