前些日子参加了天池的[Text-to-SQL挑战赛](2022 WAIC 黑客松蚂蚁财富赛道:AntSQL大规模金融语义解析中文Text-to-SQL挑战赛-天池大赛-阿里云天池 (aliyun.com)),侥幸拿到了第七名,为什么这么说呢,因为纯粹是躺在巨人的肩膀上的。

本来打算摸鱼玩玩,没想到后面玩上头了,对于Text2Sql问题,目前有两种解决思路,一种就是分开提取各种槽位,各种关系之类的最后再合并到一起;另一种就是生成式模型直接上。目前常见的两个数据集是Wikisql和Spider,懒狗自然用开源,所以选了[HydraNet](lyuqin/HydraNet-WikiSQL: Code and trained model for Hybrid ranking network for text-to-SQL on WikiSQL (github.com))作为基本模型结构。

由于数据集是金融领域的,所以选择了finbert作为embedding。一开始我还是想改一下模型结构,后面发现改来改去效果也没有见得提升多少,反而因为加对抗加层数导致训练时间过长,对于上班狗而且就一个2080ti可以玩,这个时间确实有点紧张,做了一些traderoff决定:干脆不动模型结构,只在数据上面下功夫,毕竟garbage in,garbage out。

这个竞赛的数据很奇怪,训练集基本上是各类模板生成的,也就是所谓的专家系统,而测试集则有一部分专家系统数据,还有一部分线上真实数据,因此造成了分布不一致问题,其实还是很影响结果的。所以我先想办法抽取模板,把模板词汇过滤出来,这样将训练集数据从8万简化到了4万左右,训练时间也提高很多,至少一晚上可以训练2个epoch。随后,对测试集出现的span错误情况,进行数据增强,使用nlpcda将表内信息提取重构,增加了8000条左右训练数据。

最后,就是预处理和后处理。为什么要着重强调这两个,因为这俩真的很重要!训练数据里面太多的标准化数据需要映射为非标数据,而测试集里面太多的错字和非标信息需要转换。后处理则是将识别到的非标数据再反向映射到标准数据上面以便提升分数。

说来说去我还是觉得这个名次是躺来的,真的没啥学术参考价值,要看参考价值还不如看看Wikisql和Spider排行榜上面的论文,最多就是警示算法狗们:数据分布一致很重要!

最后的最后还是要diss DataFontain平台,玩不起别玩!