Page 277 - 《软件学报》2025年第5期
P. 277
琚江舟 等: 多粒度单元格对比的文本和表格数值问答模型 2177
FinQA 数据集中 76% 的问题需要表格数据作为其支撑事实. 对于 MultiHiertt 数据集, 高达 89.76% 的问题需要表
格信息来生成计算程序. 更值得注意的是, MultiHiertt 数据集有 31.13% 问题的支撑事实包括多个表格, 其涉及更
为复杂的跨表格推理. 上述分析表明, 这两个数据集能够有效地证明本文提出方法的有效性.
表 2 FinQA 和 MultiHiertt 数据集支撑事实类型分布 (%)
数据集 Text Table (=1) Table (>1) Text and Table (=1) Text and Table (>1)
FinQA 23.42 62.43 0.00 14.15 0.00
MultiHiertt 10.24 33.09 7.93 25.54 23.20
4.2 基准模型
在基准模型中, 除非特别指明, 检索器一般使用 BERT-base (110M 参数) [28] 为基础的分类器, 判断来自于非结
构化文本和表格文本的句子是否为支撑事实. FinQA 数据集默认使用 FinQANet 的 BERT-base 的分类器, 以行单
元格句子和文本句子为检索单位. 然后使用分类器返回的 top 3 的检索句子作为生成器的输入, top 3 检索句子的
召回率是 89.66% . MultiHiertt 数据集默认采用 MT2Net 的 BERT-base 分类器作为检索器, 其以单元格句子和文
[5]
本句子为检索单位, 使用分类器返回的 top 10 的检索句子作为生成器的输入, top 10 的检索句子的召回率是
80.8% . 下面本文分别介绍采用的基准模型, 按基准模型的生成器类型大致可以分为 3 种类型.
[8]
(1) 不使用检索器, 文档直接作为生成器输入
Longformer [29] 模型通过修改 Transformer [30] 的 attention 机制, 可以处理输入长度高达 32k 字符, 因此不需要检
索器检索相关事实, 所有非结构化文本和表格文本直接输入模型生成计算程序.
(2) 使用检索器, 生成器直接生成答案
[5]
Retriever+Direct Generation 采用主流的问答模型架构, 唯一差别在于生成器仅生成答案, 而不解码计算程序.
[8]
Retriever+TAPAS 由检索器和生成器构成, 其中在生成器部分使用表格预训练模型直接生成答案.
(3) 使用检索器, 生成器生成计算程序或者计算表达式
TF-IDF+Single Op 是一个简单的启发式方法, 先用 TF-IDF 检索 top 2 的句子. 然后获得每个句子中第 1 个数
[5]
值, 并将这两个数值相除作为问题答案.
Retriever+Seq2Seq 采用检索器和生成器的架构. 相比较于 FinQANet, 其差别在于生成器的 encoder 是双向
[5]
LSTM, decoder 为没有额外 attention 机制的 LSTM.
[31]
Retriever+NeRd 先使用检索器检索相关事实, 其基于指针网络的神经符号生成器生成一个嵌套格式计算表
达式.
Retriever+TAGOP [32] 其通过序列标注识别计算表达式操作数, 通过分类识别操作符, 只能处理操作符简单的
问题.
Retriever+NumNet [33] 提出一个额外的模块建模数值之间的关系, 同时通过分类判别每个数值的符号, 这种方
式只能处理操作符简单的问题.
[5]
FinQANet 由一个检索器和生成器构成. 其生成器的 decoder 包含一个特殊设计的 attention 机制, 与第 2.2.3
节介绍生成器一致.
FinQANet(FinBERT) [34] 与 FinQANet 的差别是生成器的 encoder 换为 FinBERT [35] , 这是一个基于金融领域语
料的预训练语言模型.
[7]
DyRRen 采用检索器和生成器的架构, 其首先提出了一个增强的检索器, 在生成器中提出一种重排机制, 使
生成器每一步动态地对检索排序, 结合事实排序的结果生成计算程序.
[8]
MT2Net 这个模型主要是针对 MultiHiertt 数据集设计的, 其包含检索器和生成器两个部分. 因为 MultiHiertt
有 2 种答案类型, 因此在生成器部分有 2 个子模块, 即计算程序生成子模块, 答案抽取子模块. 对于计算程序子模
块, 其结构与第 2.2.3 节介绍生成器一致. 对于答案抽取模块, 其采用 T5 分别生成答案的开始和结束位置来获得连
续答案片段. 此外, 生成器还嵌入了一个答案类型预测层, 该层的功能是判定哪一子模块应负责输出答案.