【建议收藏】|信息抽取与经济学文本量化分析(下)

简介: 【建议收藏】|信息抽取与经济学文本量化分析

数据分割部分实现还待改变,通过 sklearn 的 kflod 五折交叉验证会获取到更好的关系抽取模型。

训练采用 early stop 策略,在 loss 五个 epoch 没有降低后停止训练。训练过程中保存相关模型。

加载模型并对企业固定长度 10-128 长度字符进行关系推理预测。

model.load_weights('best_model.weights')
def evaluate_data(data):
    """评估函数,计算f1、precision、recall
    """
    X, Y, Z = 1e-10, 1e-10, 1e-10
    f = open('dev_pred.jsonl', 'w', encoding='utf-8')
    pbar = tqdm()
    for d in data:
        R = set([SPO(spo) for spo in extract_spoes(d)])
        if len(R) < 1:
            continue
        T = set()
        X += len(R & T)
        Y += len(R)
        Z += len(T)
        f1, precision, recall = 2 * X / (Y + Z), X / Y, X / Z
        pbar.update()
        pbar.set_description(
            'f1: %.5f, precision: %.5f, recall: %.5f' % (f1, precision, recall)
        )
        s = json.dumps({
            'text': d,
            'spo_list': list(R),
        },
                       ensure_ascii=False)
        f.write(s + '\n')
    pbar.close()
    f.close()
    return f1, precision, recall
evaluate_data(word_list_10000)

形成如下数据结果

{"text": "公司与员工签订劳动合同,规范劳动关系管理工作。公司制定了合理的薪酬管理制度,对公司 员工薪酬设计和管理原则、福利与年假、定级和调薪等方面进行了明确规定。公司高度重视对员工的培训 工作,提升员工素质,实现员工与企业共同成长。",
 "spo_list": [["提升员工素质", "Influence", "实现员工与企业共同成长"]]}

对其中的五万条数据进行可视化

读取通过海通大数据金融因果数据集构建的因果抽取模型预估的因果关系抽取结果

import json
dev_pred = open("dev_pred_50000.jsonl").readlines()
all_data = []
for dev_pred_one in dev_pred:
    all_data.append(json.loads(dev_pred_one))

利用 networkx 计算 pagerank 及对关系图进行可视化。

import networkx as nx
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['FZSongYi-Z13S'] # 指定默认字体
from matplotlib import font_manager
# fname中选择一个你本机查询出来的字体 若没有中文字体则需要你本人手动安装
font = font_manager.FontProperties(fname="./simhei.ttf")
plt.figure(figsize=(30, 30))
G = nx.DiGraph()
all_nodes = []
all_relation = []
for one_data in all_data:
    for spo_one in one_data["spo_list"]:
        all_nodes.append(spo_one[0].replace(" ",""))
        all_nodes.append(spo_one[2].replace(" ",""))
        all_relation.append((spo_one[0].replace(" ",""),spo_one[2].replace(" ","")))
all_set_nodes = list(set(all_nodes))
# G.add_nodes_from(all_set_nodes[:200])   # 添加节点 1 2 3
G.add_edges_from(all_relation)   # 添加多条边
pagerank_list = nx.pagerank(G, alpha=1)

在 jupyter 中打印前三十排序的节点

a = sorted(pagerank_list.items(),key = lambda x:x[1],reverse = True)
a[:30]

返回以下相关结果

[('对公司的经营业绩产生不利影响', 0.0008828635052164171),
 ('增加公司的经营风险', 0.000840754589394436),
 ('对公司经营业绩产生不利影响', 0.000629184609583069),
 ('提高生产效率', 0.0005525447685727118),
 ('公司的盈利能力', 0.0005452975937731509),
 ('降低生产成本', 0.0005247477884018558),
 ('投资者在证券交易中遭受损失', 0.0005004412738005438),
 ('利润', 0.000495572338004653),
 ('差异', 0.0004899555161635981),
 ('业绩同比较大增长', 0.0004629239604155248),
 ('公司的经营业绩', 0.00039319747216364984),
 ('提高客户的满意度和忠诚度', 0.0003917398023592222),
 ('研发费用变动', 0.0003686641308238447),
 ('促进公司的新能源汽车业务持续发展', 0.00036793980326920686),
 ('对公司的经营业绩造成不利影响', 0.00036793529592163085),
 ('促进企业与员工和谐共赢、共同发展', 0.00036501995631277545),
 ('影响公司盈利能力', 0.00036501995631277545),
 ('医药行业在国民经济的比重日益扩大', 0.00036501995631277545),
 ('促进公司经营业绩的提升', 0.00036501995631277545),
 ('筹资活动产生的现金流量净额变动', 0.0003423087022285049),
 ('债务人信用风险的预期变动', 0.0003412154498751841),
 ('现金及现金等价物净增加额同比减少', 0.0003397577800707564),
 ('提升企业整体盈利水平', 0.00033609035859508547),
 ('提高企业市场竞争力', 0.0003178754563592766),
 ('机器人高精密减速机业务获得高速发展', 0.00031595327363316507),
 ('行业高质量发展水平持续提升', 0.00031595327363316507),
 ('夯实公司的行业领先地位', 0.00031595327363316507),
 ('提升经济效', 0.00031595327363316507),
 ('增强公司竞争力', 0.00031595327363316507),
 ('良好的基本面没有发生改变', 0.00031595327363316507)]

对当前图进行可视化

plt.figure(figsize=(90, 90))
nx.draw(G, pos=layout, node_size=10,node_color='r', with_labels=True)
plt.savefig('./2021企业年报因果抽取-pagerank.jpg', dpi=200, bbox_inches = 'tight')

640.jpg

编辑切换为居中

基于海通大数据的因果关系抽取可视化 200 节点可视化

基于 pyvis 的因果关系抽取可视化

from pyvis.network import Network
import os
import pandas as pd
import networkx as nx
G = nx.Graph()
nt = Network('1500px', '1500px', notebook=True, neighborhood_highlight=False, select_menu=True, filter_menu=False, )
for one_data in all_relation_data:
    try:
        if relation_counts[one_data[0].strip()] > 1:
            G.add_edge(one_data[0].strip(),one_data[2].strip(), label=one_data[1])
    except:
        continue
nt.from_nx(G)
nt.show_buttons(filter_=['physics'])
nt.show("2021企业事件因果可视化.html")

可视化结果

640.png

编辑切换为居中

添加图片注释,不超过 140 字(可选)

通过对高频的数据进行可视化可以聚焦当前数据中的高频任务。代码读取过程中对头节点出现的次数进行统计。面向原因进行统计。

import json
all_relation = open("dev_pred_50000.jsonl").readlines()
all_relation_data = []
entities_id_mapping = {}
relation_count = []
for one in all_relation:
    relations = json.loads(one)["spo_list"]
    for relation in relations:
        all_relation_data.append((relation[0].replace(" ",""),
                                  relation[1],
                                  relation[2].replace(" ","")))
    relation_count.append(relation[0].replace(" ",""))
all_relation_data = list(set(all_relation_data))
len(all_relation_data)

通过 Counter 统计头节点出现的频次

from collections import Counter
count = Counter(relation_count)  # 统计词频
relation_counts = dict(count)

在构建图的时候对头节点出现大于 5 次的加入 graph

from pyvis.network import Network
import os
import pandas as pd
import networkx as nx
G = nx.Graph()
nt = Network('1500px', '1500px', notebook=True)
for one_data in all_relation_data:
    try:
        if relation_counts[one_data[0].strip()] > 5:
            G.add_edge(one_data[0].strip(),one_data[2].strip(), label="导致")
    except:
        continue
nt.from_nx(G)
# nt.show_buttons(filter_=['physics'])
nt.show("2021企业事件因果可视化.view.top.5.html")

形成可视化结果

640.png

编辑切换为居中

添加图片注释,不超过 140 字(可选)

致至此通过 gplinker 非结构文档中的企发展因果关系抽取完成。

640.png

编辑切换为居中

基于原因节点频次的可视化

本文实现了关系抽取 迁移预测 基于 networkx 的 pagerank 节点重要性计算、networkx 的图结构可视化、pyvis 的图结构可视化、pyvis 的高频图结构可视化。

相关文章
|
传感器 编解码 IDE
ESP32开发板引脚介绍【附有引脚使用实例】
ESP32开发板引脚介绍👨‍🏫内容1:背景👨‍⚖️内容2:限制类引脚👨‍💻内容3:ESP32 周边设备🍉文末备注 👨‍🏫。
ESP32开发板引脚介绍【附有引脚使用实例】
|
消息中间件 JSON druid
Druid:通过 Kafka 加载流数据
Druid:通过 Kafka 加载流数据
213 0
|
应用服务中间件 nginx 数据安全/隐私保护
你好,MinIO
不花钱的对象就是香!
1236 0
|
6月前
|
机器学习/深度学习 存储 人工智能
SEARCH-R1: 基于强化学习的大型语言模型多轮搜索与推理框架
SEARCH-R1是一种创新的强化学习框架,使大型语言模型(LLM)具备多轮搜索与推理能力。它通过强化学习自主生成查询并优化基于检索结果的推理,无需人工标注数据。相比传统RAG或工具使用方法,SEARCH-R1显著提升问答性能,在多个数据集上实现26%以上的相对性能提升。其核心优势在于强化学习与搜索的深度融合、交错式多轮推理机制及令牌级损失屏蔽技术,推动了LLM在复杂推理和实时知识获取方面的边界。尽管存在奖励函数设计简化等局限性,SEARCH-R1为构建更智能的交互系统提供了重要参考。
443 7
SEARCH-R1: 基于强化学习的大型语言模型多轮搜索与推理框架
|
3月前
|
人工智能 API 开发者
智能体(AI Agent)开发实战之【LangChain】(一)接入大模型输出结果
LangChain 是一个开源框架,专为构建与大语言模型(LLMs)相关的应用设计。通过集成多个 API、数据源和工具,助力开发者高效构建智能应用。本文介绍了 LangChain 的环境准备(如安装 LangChain、OpenAI 及国内 DeepSeek 等库)、代码实现(以国内开源大模型 Qwen 为例,展示接入及输出结果的全流程),以及核心参数配置说明。LangChain 的灵活性和强大功能使其成为开发对话式智能应用的理想选择。
|
11月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
2149 14
MySQL事务日志-Redo Log工作原理分析
|
11月前
|
存储 数据采集 安全
CDAM数据资产管理的策略制定与落地
在数字化时代,数据成为企业的核心资产,直接影响决策效率与市场竞争力。本文探讨数据资产管理策略的制定与实施,涵盖目标设定、组织架构搭建、政策流程制定、工具技术应用、数据战略规划、人才培养、风险管理及持续优化等方面,旨在为企业提供全方位的实践指导。
|
人工智能 语音技术 Python
FunAudioLLM试炼
音频基座大模型FunAudioLLM,可以想你朋友一样和你对话,情感语境的识别,突破物理限制。
553 5
|
存储 安全 数据管理
磁盘分区全解:快速搞定硬盘分区
本文介绍了磁盘分区的重要性和好处,如数据管理、性能提升和安全增强,并为初学者提供了Windows系统下的磁盘分区指南。文章提到了三种磁盘分区工具:磁盘管理器、Diskpart命令行工具和第三方软件DiskGenius。同时,详细阐述了如何在磁盘管理器中创建新分区、使用DiskGenius一键重新分区、拆分现有分区以及通过Diskpart命令创建分区的步骤。最后,文章强调了磁盘分区在数据管理和系统优化中的价值。
|
XML 前端开发 IDE
在 Compose 中使用 Jetpack 组件库
Jeptack Compose 主要目的是提高 UI 层的开发效率,但一个完整项目还少不了逻辑层、数据层的配合。幸好 Jetpack 中不少组件库已经与 Compose 进行了适配。
1068 0