数字是如何被归一化的:从一条附注到一个规范数字
像「1,234(单位:千沙特里亚尔)」这样一个原始单元格,是如何变成一个类型明确、可比较的数字的,这是 Rexfin 在信任任何数字之前所做的口径、币种、期间和符号判断。
作者 The Rexfin team
一份备案文件中,大多数发生在一个数字身上的事情,都发生在它成为一个“数字”之前。一个单元格写着”1,234”。三页之前的一条附注说明该报表以千沙特里亚尔为单位列示。另一个单元格上的括号意味着这个值是负数,或者意味着这是一条该文件按自身惯例印刷的成本类科目。这些信息在单元格本身里都是不可见的,必须从表头、附注和报表结构中读取出来,并附加到该数值上,这个数值才有意义。这一附加步骤就是归一化,它紧接在数据接入定位出某个单元格所属报表之后立即运行。
一个原始单元格实际需要什么
印刷出来的”1,234”不是一条单一信息,而是一个值,与至少四项它赖以被正确读取的信息捆绑在一起:呈现的口径(以元、千、百万为单位)、计价所用的币种、所属的期间(某个时点,如资产负债表日,或某个跨度,如一个财年)以及它的符号(带括号的数字是亏损、备抵科目,还是该文件以正数印刷、但 Rexfin 需要一致存储的成本类科目)。Rexfin 从原始单元格中解析出这些信息,并与数值本身一并存储,同时还包括该数字所属的主体,母公司还是合并集团,这样一个数字就永远不会脱离让它成为一个事实、而非一个数字符号的上下文而单独存在。
口径与币种按每份文件分别读取,而非默认假设
最明显的陷阱是硬编码的假设,一次性认定某笔交易“以千为单位报告”,然后到处套用。Rexfin 不这样做。口径和币种是按每份文件分别检测的,因为同一笔交易可能既包含集团以千沙特里亚尔列示的合并报表,也包含子公司以全额单位列示的独立账目。检测会读取报表页面本身的表头,例如”AED ‘000”这类标签,包括它的 OCR 变体,并在此基础上回退到文字说明,例如某条附注说明数字“以千沙特里亚尔列示”,对于完全是扫描图像的页面则有进一步的回退机制。当以上方法都无法清晰得出结论时,Rexfin 选择拒绝,而不是猜测:口径含糊、币种与文件其余部分不符,或者一份文件混用币种却未加说明,都是把某个数字保留不用、而不是凭猜测将其归一化的理由。这种拒绝的纪律,与数据接入对无法分类页面所采取的态度是一致的,归一化把这种纪律继承到了数字本身。
为什么容差也必须按比例调整
口径判断错误,不仅会给数字贴错标签,还会破坏本应用来捕捉错误的检查机制。为以全额单位印刷的数字设定的对账容差,对于四舍五入到最近千位的报表来说过于严格:如果容差不了解报表的口径,一个仅仅因为四舍五入而相差几个单位的小计,看起来就会像是真正的不一致。因此,为某份文件检测到的口径会直接输入到后续用于合计数对账的容差中,即允许的差距是相对于印刷口径设定的,而不是一个固定的绝对金额,这样一份以千为单位四舍五入的报表就不会触发那种全额单位报表原本永远不会触发的假警报。
另一端出来的是什么
一旦口径、币种、期间、符号和主体范围都已附加完成,资产负债表、利润表和现金流量表中的每一个数字,都被存储在同一基准之上,一笔现金余额绑定到测量它的那个时点,一笔流量绑定到它所涵盖的财年,一笔流出保留其印刷时的符号,而一条成本或费用科目则被存储为正数量级。通过合并已报告期间构建出的季度或滚动十二个月数字,会被标记为计算得出,而非直接取自源头,并且携带其最弱输入项的置信度等级,而不是借用最强输入项的置信度。
正是这种一致性,让跨公司比较,包括以不同币种报告的公司,得以从含义相同的数字出发,而不是从两条没人核对过的附注出发。这也是规范原子存储所保存的内容:不是一个赤裸的数字,而是数字加上使其本身站得住脚的口径、币种、期间和符号。
适合谁
任何比较过两家公司营收科目,后来才发现一家以千为单位、另一家以全额单位列示的人;或者曾经把一张现金流量表加总,却发现某条成本科目的符号与模型假设不一致的人。归一化正是在错误数字到达聊天回答或导出文件之前,先一步捕捉到问题的那一层。想了解它如何融入整个接入流水线的其他部分,请参见支柱内容总览。