You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OCR转换的财务报表文本文件中定位目标字段对应行及首个数值

财务报表指定表格数值提取方案

该场景完全不需要引入ML或NLP技术,仅通过优化正则规则+增加表格范围定位逻辑就能低成本且稳定解决问题,比机器学习方案的开发、维护成本低很多,准确率也更可控。

具体优化思路

  • 第一步:先定位目标表格范围,过滤无关内容
    你现在的核心问题是关键词会出现在正文和其他表格里,先做范围截断即可解决90%的问题:先遍历全文匹配到Consolidated statements of cash flow标题行,从这一行之后开始记录内容,直到遇到下一个报表类标题(比如匹配Consolidated|Statement|Budget|Estimated这类其他表格的开头关键词)或者连续3行都没有;和数字组合的表格格式特征就停止,中间的内容就是你要处理的唯一目标范围,天然规避了正文、其他表格的误匹配。
  • 第二步:优化关键词匹配规则,适配表述变体
    针对字段表述不固定的问题,写宽松的正则匹配规则即可,比如匹配Stock-based compensation的所有变体可以用正则r'stock.*compensation|compensation',开启忽略大小写的匹配模式,因为已经限定了只在目标表格内搜索,不会出现误匹配。
  • 第三步:修正数值提取逻辑,覆盖异常格式
    原有代码没有处理数值带括号(代表负数)的特殊格式,提取时可以先按分号切割再统一清洗,容错率更高。

优化后代码示例

import re

def find_target_value(target_keyword_pattern, target_table_title="Consolidated statements of cash flow"):
    txt_path = r"fina.txt"
    in_target_table = False
    empty_table_row_count = 0
    # 匹配表格行特征:至少包含1个分号+数字
    table_row_pattern = re.compile(r';.*\d')
    keyword_pattern = re.compile(target_keyword_pattern, flags=re.IGNORECASE)

    with open(txt_path, 'r', encoding='utf-8') as f:
        for row in f:
            row = row.strip()
            if not row:
                continue
            # 定位目标表格起始位置
            if target_table_title.lower() in row.lower():
                in_target_table = True
                continue
            # 处于目标表格范围内的处理逻辑
            if in_target_table:
                # 判断是否到达表格结尾
                if not table_row_pattern.search(row):
                    empty_table_row_count += 1
                    if empty_table_row_count >= 3:
                        break
                    continue
                empty_table_row_count = 0
                # 匹配到目标字段行
                if keyword_pattern.search(row):
                    # 切取第一个数值并清洗
                    first_val = row.split(';')[1].strip()
                    clean_val = re.sub(r'[^\d\,\-]', '', first_val)
                    return clean_val
    return None

# 调用示例:匹配Stock-based compensation的所有表述变体
print(find_target_value(r'stock.*compensation|compensation'))

后续如果遇到更多特殊表格格式,只需要调整表格范围的判定规则即可,完全不需要引入额外的NLP模型,避免了标注数据、模型调优、准确率波动的问题。

内容的提问来源于stack exchange,提问作者Onu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:24:09