【问题与表格匹配】探索

目的

目前的模型已具有的能力是,指定表格进行提问(因为需要提供表格信息),在实际中可能存在给定问题不指定表格的情况,那么需要有一种方案去判别当前的句子是在用哪个表格

思路

  • 当作多分类问题:对单个问题选择某个表
  • 当作二分类问题:直接判别问题与某个表是否有关联

计划采用第二种思路,因为在使用过程中表格的数量不确定,因此类别也就不固定。可以考虑选择top-n的表格作为候选,然后再进一步排序等方法确定选择表格。

数据

以比赛所提供的数据作为基础,构建问题表格信息的句子对

数据 相关 不相关 共计
train 37281 112170 149451
dev 4241 12365 16606
test 4396 13170 17566

结果(baseline)

1
2
3
4
5
6
             precision    recall  f1-score   support

0 0.98971 0.96355 0.97645 13170
1 0.89882 0.96997 0.93304 4396

avg / total 0.96696 0.96516 0.96559 17566

优化

  1. 第一版在生成负样本的时候增大了三倍,导致不平衡,本次采用等量级负样本
数据 相关 不相关 共计
train 37387 37348 74735
dev 4135 4169 8304
test 4396 4393 8789

result1: 采用上面的数据进行test

1
2
3
4
5
6
precision    recall  f1-score   support

0 0.98 0.96 0.97 4393
1 0.96 0.98 0.97 4396

avg / total 0.97 0.97 0.97 8789

result2:采用baseline的数据进行test

1
2
3
4
5
6
            precision    recall  f1-score   support

0 0.99 0.96 0.98 13170
1 0.89 0.98 0.93 4396

avg / total 0.97 0.96 0.96 17566

  1. 生成数据时候增加了分隔符,在tokenize的部分用[sep]进行分割
数据 相关 不相关 共计
train 37299 37433 74732
dev 4223 4081 8304
test 4396 4392 8788

result1: 采用上面的数据进行test

1
2
3
4
5
6
            precision    recall  f1-score   support

0 0.98 0.96 0.97 4392
1 0.96 0.98 0.97 4396

avg / total 0.97 0.97 0.97 8788

result2: 采用baseline的数据进行test

1
2
3
4
5
6
            precision    recall  f1-score   support

0 0.99192 0.96006 0.97573 13170
1 0.89085 0.97657 0.93174 4396

avg / total 0.96663 0.96419 0.96472 17566

补充实验

训练模型所需的数据是由比赛的train、valid数据构建的,因此用比赛中的test作为最终的测试结果。

即对test中的每个问题,令其与给定的所有表格进行计算判别,取所有判别为“相关”的数据作为候选,按照logits排序。共计4086个问题,1102个table。

采用top-n对结果进行衡量

[sep]切分文本训练的模型(模型已丢)进行测试

1. 计算结果
n top-n命中正确结果的样本数 accuracy
top_n: 1 1453 0.3556045031815957
top_n: 5 2451 0.5998531571218796
top_n: 10 2810 0.6877141458639257
top_n: 15 3012 0.737151248164464
top_n: 20 3174 0.7767988252569751
top_n: 25 3318 0.8120411160058737
top_n: 30 3405 0.8333333333333334
top_n: 35 3487 0.8534018600097896
top_n: 40 3558 0.8707782672540382
top_n: 45 3614 0.8844836025452766
top_n: 50 3662 0.8962310327949095
top_n: 55 3704 0.9065100342633382
top_n: 60 3737 0.9145863925599609
不约束top-n 3998 0.9784630445423397
2. bad case分析(以top-5为例)

对于某个top-5返回False的例子来说,模型预测的top-5的表格信息如下:

1
2
3
4
5
{'title': '08 商业地产重点跟踪公司一览      ', 'header': ['公司名称', '总市值(亿元)', 'EPS2010', 'EPS2011', 'EPS2012', 'EPS2013', 'PE2010', 'PE2011', 'PE2012', 'PE2013', 'PB', 'RNAVP', '折价率', '评级'], 'common': '资料来源:wind', 'id': '69cf5a2e334311e9a575542696d6e445', 'types': ['text', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'text']}
{'title': '25 关注类综合类开发公司估值表 ', 'header': ['代码', '公司名称', '最新股价', 'EPS2011', 'EPS2012E', 'EPS2013E', 'PE2011', 'PE2012E', 'PE2013E', 'PB估值'], 'common': '资料来源:wind', 'id': '69cfabd1334311e9bb3b542696d6e445', 'types': ['text', 'text', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real']}
{'title': '23 非住宅公司估值表', 'header': ['证券代码', '公司名称', '股价', 'EPS2011', 'EPS2012E', 'EPS2013E', 'PE2011', 'PE2012E', 'PE2013E', 'NAV', '折价率', 'PB2012Q1', '评级'], 'common': '资料来源:wind', 'id': '69cf9028334311e99d34542696d6e445', 'types': ['text', 'text', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'text', 'text', 'real', 'text']}
{'title': '62 盈利预测和估值2', 'header': ['公司', '评级', '股价', '总市值', '年初以来涨幅', 'EPS2011', 'EPS2012E', 'EPS2013E', 'PE2011', 'PE2012E', 'PE2013E', 'RNAV', 'P/R-V', 'PB2011'], 'common': '资料来源:wind', 'id': '69d1246b334311e9a6e6542696d6e445', 'types': ['text', 'text', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real']}
{'title': '61 盈利预测和估值1', 'header': ['公司', '评级', '股价', '总市值', '年初以来涨幅', 'EPS2011', 'EPS2012E', 'EPS2013E', 'PE2011', 'PE2012E', 'PE2013E', 'RNAV', 'P/R-V', 'PB2011'], 'common': '资料来源:wind', 'id': '69d116a1334311e9ac14542696d6e445', 'types': ['text', 'text', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'real', 'text', 'text', 'real']}

而正确结果为:

1
{"title": "66 表3:2012年6月12日非住宅开发重点覆盖公司估值表 ", "header": ["证券代码", "公司名称", "股价", "EPS2011", "EPS2012E", "EPS2013E", "PE2011", "PE2012E", "PE2013E", "NAV", "折价率", "PB2012Q1", "评级"], "common": "资料来源:wind", "id": "69d4941c334311e9aefd542696d6e445", "types": ["text", "text", "real", "real", "real", "real", "real", "real", "real", "text", "text", "real", "text"]}

模型的对于表格的输入是取titleheadercommontypes,可以看到上面模型预测的结果与实际结果十分相似,其他的bad case也有很多这种情况出现。

找到了一些相似的表格:

image


image


image

3. 初步结论

根据1.中的表可以看到,不约束top-n得到的accuracy与模型在数据集的结果基本吻合,说明对于给定一个question和大量表格的情况,模型通常能够找到正确的一个。

但这对于实际中使用可能意义不大,因为我们希望模型在n越小的情况下准确率更高,这样才可以通过进一步的排序或其他可以更高效的获取选择的表格,从而确保下游任务的准确率,防止错误叠加。

根据2.的bad case可以看到,如果表格内容的标题列名十分相似,那么很容易造成判别上的失误,因此候选表格的差异性越大,则越容易进行区分

4. todo

取n=25,考虑是否有简易的方法能够从候选中提取正确表格或进行重排序

工时数据实验

取NL2SQL-3-9.xlsx中的51个问题,并将工时数据表信息、专利数据表信息添加到test.tables.json中,共计1104个表格

1. 计算结果
n top-n命中正确结果的样本数 accuracy
top_n: 1 36 0.7058823529411765
top_n: 2 40 0.7843137254901961
top_n: 3 43 0.8431372549019608
top_n: 4 43 0.8431372549019608
top_n: 5 43 0.8431372549019608
top_n: 10 43 0.8431372549019608
top_n: 15 43 0.8431372549019608
top_n: 20 44 0.8627450980392157
2. bad case分析

例1: (找到正确表格但排序靠后):

请问对外销售类的项目有哪些是处于机会阶段?

  • sort_table:(720, 0.9984748), (444, 0.9982322), (1102, 0.9982218), (300, 0.99791163), (256, 0.9978811)
  • tables:

    1
    2
    3
    4
    5
    (720, {'name': 'Table_f6f5fbcc453d11e9b358f40f24344a08', 'title': '', 'header': ['项目名称', '项目类型', '项目负责人', '成员信息', '指导教师'], 'common': '', 'id': 'f6f5fbcc453d11e9b358f40f24344a08', 'types': ['text', 'text', 'text', 'text', 'text']})
    (444, {'name': 'Table_ee2c51ba453d11e99f2af40f24344a08', 'title': '', 'header': ['项目名称', '项目类别', '项目负责人', '院校'], 'common': '', 'id': 'ee2c51ba453d11e99f2af40f24344a08', 'types': ['text', 'text', 'text', 'text']})
    (1102, {'name': 'iwork', 'title': '工时统计', 'header': ['工时起始时间', '工时结束时间', '年', '周', '一级部门', '二级部门', '末级部门', '项目编号', '项目名称', '项目所属部门', '项目所属一级部门', '项目所属二级部门', '项目类型', '项目阶段', '项目状态', '当前负责人', '销售负责人', '员工姓名', '项目工时'], 'common': '', 'id': 'iwork', 'types': ['text', 'text', 'real', 'real', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'text', 'real']})
    (300, {'name': 'Table_aae0d6263b0611e99436f40f24344a08', 'title': '', 'header': ['序号', '课题名称', '负责人', '工作单位', '项目类别', '预期成果', '计划完成时间', '学科', '批准号'], 'common': '', 'id': 'aae0d6263b0611e99436f40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text', 'text', 'real', 'text', 'text']})
    (256, {'name': 'Table_aa62c2513b0611e9bb4ff40f24344a08', 'title': '', 'header': ['所属单位', '批准文号', '项目名称', '负责人', '项目类别'], 'common': '', 'id': 'aa62c2513b0611e9bb4ff40f24344a08', 'types': ['text', 'text', 'text', 'text', 'text']})

例2:(找到结果但是顺序有误)

xxx项目的项目编号什么?

  • sort_table(top-5): (372, 0.9988543), (510, 0.99878293), (622, 0.99878293), (440, 0.9987821), (291, 0.9987771)
  • tables:
1
2
3
4
5
(372, {'name': 'Table_ab96f9423b0611e9bb77f40f24344a08', 'title': '', 'header': ['项目编号', '项目名称', '在哪些实验室(名称)开展项目', '项目负责人', '指导老师', '项目组学生人数(含负责人)', '项目资助金额'], 'common': '', 'id': 'ab96f9423b0611e9bb77f40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text', 'real', 'real']})
(510, {'name': 'Table_f02c7dfa453d11e9afa2f40f24344a08', 'title': '', 'header': ['序号', '课题名称', '项目负责人', '单位', '项目编号'], 'common': '', 'id': 'f02c7dfa453d11e9afa2f40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text']})
(622, {'name': 'Table_f3b3599e453d11e99f94f40f24344a08', 'title': '', 'header': ['序号', '课题名称', '项目负责人', '单位', '项目编号'], 'common': '', 'id': 'f3b3599e453d11e99f94f40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text']})
(440, {'name': 'Table_ee089bd1453d11e99965f40f24344a08', 'title': '', 'header': ['序号', '项目编号', '项目名称', '项目牵头承担单位', '项目负责人', '中央财政经费(万元)', '项目实施周期(年)'], 'common': '', 'id': 'ee089bd1453d11e99965f40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text', 'real', 'real']})
(291, {'name': 'Table_aac5e5633b0611e9917af40f24344a08', 'title': '', 'header': ['序号', '项目编号', '项目名称', '负责人', '单位', '初审结果'], 'common': '', 'id': 'aac5e5633b0611e9917af40f24344a08', 'types': ['real', 'text', 'text', 'text', 'text', 'text']})

例3: (完全没找到正确的表格)

2019年第9周xxx都参与了哪些项目?

  • sort_table:[(1098, 0.99640155), (1057, 0.9587623), (1079, 0.92949605), (1097, 0.9289557), (1091, 0.9287066), (1095, 0.9277953), (1082, 0.92476124), (1096, 0.9241249), (1083, 0.9241075), (1080, 0.9186452), (1094, 0.90010804), (1093, 0.8983552), (1099, 0.8900752)]
  • tables

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (1057, {'name': 'Table_4d2702b33aaa11e98410f40f24344a08', 'title': '图表 19   2019年第 4周(1.21-1.27)网页游戏开服排行榜TOP5(仅列上市公司游戏)', 'header': ['排名', '游戏', '服务器', '开发商', '发行商'], 'common': '资料来源:9K9K,华创证券', 'id': '4d2702b33aaa11e98410f40f24344a08', 'types': ['real', 'text', 'real', 'text', 'text']})
    (1079, {'name': 'Table_4d290c423aaa11e9bca6f40f24344a08', 'title': '表5:2019年第7周(2019.02.18 - 2019.02.24)影投票房排名TOP10', 'header': ['影投公司', '周票房(亿)', '观影人次(万)', '场均人次'], 'common': '资料来源:艺恩网,光大证券研究所', 'id': '4d290c423aaa11e9bca6f40f24344a08', 'types': ['text', 'real', 'real', 'real']})
    (1080, {'name': 'Table_4d29122b3aaa11e99decf40f24344a08', 'title': '表6:2019年第7周(2019.02.18 - 2019.02.24)电视剧和网剧总播放量TOP10', 'header': ['排名', '剧集名称', '播放量(亿)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d29122b3aaa11e99decf40f24344a08', 'types': ['real', 'text', 'real', 'text']})
    (1082, {'name': 'Table_4d291df53aaa11e9a2b5f40f24344a08', 'title': '表8:2019年第7周(2019.02.18 - 2019.02.24)电视综艺播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d291df53aaa11e9a2b5f40f24344a08', 'types': ['real', 'text', 'real', 'text']})
    (1083, {'name': 'Table_4d2922cc3aaa11e9bcc4f40f24344a08', 'title': '表9:2019年第7周(2019.02.18 - 2019.02.24)网络综艺播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d2922cc3aaa11e9bcc4f40f24344a08', 'types': ['real', 'text', 'real', 'text']})
    (1091, {'name': 'Table_4d2999003aaa11e99af6f40f24344a08', 'title': '表5:2019年第2周(2019.1.14 - 2019.1.20)全国电影票房TOP10', 'header': ['影片名称', '周票房(万)', '票房占比(%)', '场均人次'], 'common': '资料来源:艺恩电影智库,光大证券研究所', 'id': '4d2999003aaa11e99af6f40f24344a08', 'types': ['text', 'text', 'real', 'real']})
    (1093, {'name': 'Table_4d29c00a3aaa11e990d5f40f24344a08', 'title': '表11:2019年第2周(2019.1.14 - 2019.1.20)电视综艺播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d29c00a3aaa11e990d5f40f24344a08', 'types': ['real', 'text', 'real', 'text']})
    (1094, {'name': 'Table_4d29c5573aaa11e9a1d6f40f24344a08', 'title': '表12:2019年第2周(2019.1.14 - 2019.1.20)网络综艺播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d29c5573aaa11e9a1d6f40f24344a08', 'types': ['real', 'text', 'text', 'text']})
    (1095, {'name': 'Table_4d29d0513aaa11e9b911f40f24344a08', 'title': '表3:2019年第4周(2019.01.28 - 2019.02.03)全国电影票房TOP10', 'header': ['影片名称', '周票房(万)', '票房占比(%)', '场均人次'], 'common': '资料来源:艺恩电影智库,光大证券研究所', 'id': '4d29d0513aaa11e9b911f40f24344a08', 'types': ['text', 'real', 'real', 'real']})
    (1096, {'name': 'Table_4d29d67d3aaa11e98adbf40f24344a08', 'title': '表4:2019年第4周(2019.01.28 - 2019.02.03)全国院线票房TOP10', 'header': ['院线名称', '周票房(万)', '观影人次(万)', '平均票价'], 'common': '资料来源:艺恩网,光大证券研究所', 'id': '4d29d67d3aaa11e98adbf40f24344a08', 'types': ['text', 'real', 'real', 'real']})
    (1097, {'name': 'Table_4d29fb703aaa11e9aa6af40f24344a08', 'title': '表11:2019年第4周(2019.01.28 - 2019.02.03)国漫播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d29fb703aaa11e9aa6af40f24344a08', 'types': ['real', 'text', 'real', 'text']})
    (1098, {'name': 'Table_4d2a165c3aaa11e9a032f40f24344a08', 'title': '表6:2019年第1周(2019.01.07 - 2019.01.13)影投票房排名TOP10', 'header': ['影投公司', '周票房(万)', '观影人次(万)', '场均人次'], 'common': '资料来源:艺恩网,光大证券研究所', 'id': '4d2a165c3aaa11e9a032f40f24344a08', 'types': ['text', 'real', 'real', 'real']})
    (1099, {'name': 'Table_4d2a2fe83aaa11e99004f40f24344a08', 'title': '表10:2019年第1周(2019.01.07 - 2019.01.13)电视综艺播放量TOP10', 'header': ['排名', '剧集名称', '播放量(万)', '播出平台'], 'common': '资料来源:骨朵传媒,光大证券研究所', 'id': '4d2a2fe83aaa11e99004f40f24344a08', 'types': ['real', 'text', 'real', 'text']})

时隔很久后,再一次进行试验

原始:database_select.rar

格式为:问题,db_id,sql query,涉及的table名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[
[
"1964年及其之后成立,或者主场馆不为波尔多体育场,球队最大容纳人数有多少?",
"欧洲杯球队",
"select 所属地区 , max ( 容纳人数 ) from 球队 where 成立时间 >= 1964 or 主场馆 != '波尔多体育场' group by 所属地区",
[
"球队"
]
],
[
"饱和脂肪含量升序排前3或不饱和脂肪含量降序排前5的名称有什么?",
"坚果",
"( select 名称 from 坚果 order by 饱和脂肪含量 asc limit 3 ) union ( select 名称 from 坚果 order by 不饱和脂肪含量 desc limit 5 )",
[
"坚果"
]
],
]

构建0-1数据集:

1
2
3
4
5
6
7
8
9
_tmp('train')
_tmp('dev_from_dev_after_training')
_tmp('dev_from_dev_in_training')
_tmp('dev_from_train')

final: 51309
final: 4771
final: 1190
final: 2703

格式:tmp['db_string'] = "|".join(tmp["table_names"]) + "+" + "|".join([_i[1] for _i in tmp["column_names"]])

1
2
3
4
5
6
7
8
[
[
"朝代的数量最少的都城,朝代的人口数量的最大值",
"朝代",
"汽车公司|汽车公司中国事业部|汽车产品|车型+*|词条id|名称|所属国家|经营范围|母公司|主要车系数量|世界500强排名|主要荣誉|公司id|中国事业部名称|位于城市|所属省份|总投资金额|负责产品数量|主要产品|词条id|名称|推出时间|车型|车款数量|保值率|生产公司id|词条id|名称|排量|油耗|售价|所属产品id|关注指数|累计销量|安全排行|性能排行|油耗排行|空间排行|舒适排行",
"0"
],
]

for_baseline.rar

方案一:baseline

epoch 4:

1
2
3
4
5
6
7
8
              precision    recall  f1-score   support

0 0.9971 0.9994 0.9983 1720
1 0.9990 0.9949 0.9969 983

accuracy 0.9978 2703
macro avg 0.9980 0.9972 0.9976 2703
weighted avg 0.9978 0.9978 0.9978 2703

Todo:question直接选择db_id

方案二:GCN

1. Question+schema word embedding avg

方案描述:

Step1. 对每个schema构建邻接矩阵A和特征矩阵X,其中:

  • 邻接矩阵A:
    1. 根据foreign_keys的table之间信息,构建shape为[table_nums, table_name]的矩阵
    2. 对每个节点添加自链接
    3. 计算度矩阵以及
  • 特征矩阵X:
    1. 对于每个table所包含的column,计算column_name每个字的word embedding并相加求平均,当作table对应的特征(todo:忘了加上table_name的embedding了
    2. 构建成shape为[table_nums, word_embedding_dim]的矩阵
  • 为了方便写代码,将以上内容离线处理好并用pickle保存,等训练的时候加载

Step2. 模型部分

对Question用bert并用[CLS]获取句子表示,根据db_id获取对应的邻接矩阵和特征矩阵。

这里由于每个db的矩阵的维度都不同,没法用torch.tensor包装成batch传入,因此,这里先传入一个batch的db_id,然后在forward函数里进行操作。

具体地,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
schema_A, schema_X = schema_a_x[db_name]
schema_A = torch.tensor(schema_A, dtype=torch.float32)
schema_X = torch.tensor(schema_X, dtype=torch.float32)
ax = torch.mm(schema_A, schema_X).cuda()
axw = torch.mm(ax, self.W_0)

axw_ping = torch.reshape(axw, (-1, )) # 拉平然后接一个linear
# 注这里linear是在init里进行初始化的:self.linears = [nn.Linear(i * 100, 100).cuda() for i in range(1, 20)]
tab_nums = int(axw_ping.shape[0] / 100)
if tab_nums in list(range(1, 20)):
_t = self.linears[tab_nums -1]
else:
_t = nn.Linear(axw_ping.shape[0], 100).cuda()

_tt = _t(axw_ping)
_relu = F.relu(_tt)
_dropout = F.dropout(_relu)
axw_final.append(_dropout)

然后将question和schema的embedding进行拼接再接到传统的流程上即可

但是目前来看训练过程不能收敛,还在找原因


2022年3月8日:有问题,没有收敛

2. Question+schema embedding use BERT

刚刚Schema部分使用的是静态的word embedding,这次考虑用bert进行生成

方案描述如下:

Question获取表示的部分不变,对于特征矩阵X的构建则利用bert的能力:

  1. 将每个column name转为token以及input_ids等,然后通过bert获取embedding,再通过torch.squeeze(_bert_output[:, 0:1, :], dim=1)获取表示,用于表示一个table的内容,这样将构建[table_nums, 768]维度的矩阵
  2. 按照上面的流程进行处理

2022年3月8日:有问题,没有收敛

3. 细化节点

上面的方案中,以table为单位设定节点,对于不同table中的外键column,将链接连在table上,因此邻接矩阵的shape往往很小,然而特征矩阵的构成需要联合每个table所有column的embedding属性,用bert获取相对还算平和可以取拼接后的[CLS]位置变量,若是静态embedding则只能求平均了,这一点还是略有点吃亏

4. 一个特殊的想法

考虑到问题在于table的schema shape不统一,如果有一种方法,可以设定为 Question+固定schema进行二分类,然后将schema的embedding输出当作词典

2022年3月7日尝试:构建单个schema的二分类数据,还是不收敛,应该是有其他问题

2022年3月8日:有问题,没有收敛

2022年3月9日:用question+schema column句子拼接的方式做最基础的二分类,不能收敛,所以应该是这种构建数据集的方式有问题。既然这样的话,固定schema进行二元分类的方案基本上被否决了

5. GCN节点:从table为单位到{T, C}为单位

以table name和column name为节点,会领图的节点数增加,这样没发再用[nn.Linear() for _ in range(20)]了,因此还是在二元分类的数据上实现,只不过把邻接矩阵和特征矩阵的逻辑进行修改

6. 句子+schema embedding(来自于nn.Embedding)
  • 随机初始化
  • gcn初始化
7. 暂时不考虑外键关联,用treelstm进行编码

阶段性总结

  • 构建图的方式想到两种:
    1. 以table为节点,外键的连接都当作table上的
      • 优点:生成的邻接矩阵、度矩阵等较小
      • 缺点:对于每个table的所有column和相关信息,需要合成一个向量放置于特征矩阵的一行
    2. 以table、column、root为节点
      • 优点:信息保留得更全
      • 缺点:不同schema差别更大了
  • 对于计算完awx后的矩阵shape不一致问题,若shape较小可以批量一个[nn.Linear(i * 100, 100).cuda() for i in range(1, 20)]
  • 对于计算完的awx,还可以考虑用个cnn去卷一下

所以,目前一个最大的困难就是:对于不定长的schema,咋写

随手记

  • 情况一:多个数据库,每个数据库的table不是很多 | 需要对多个db进行筛选,类似于dusql
  • 情况二:单个或少量数据库,每个库的table非常多 | 需要对单个库的table进行筛选,类似于电网的数据
  • 情况三:情况1+2

在二元分类的数据集中,对于schema来说,应该分为三类:

  1. 在训练集中出现,且有question与其匹配
  2. 在训练集中出现,没有question匹配(Q+S=False
  3. 没有在训练集中出现