http://sgcc.smartgrid-challenge.com.cn/

https://aistudio.baidu.com/aistudio/competition/detail/109

  • 坑1:一个db,46个table
  • 坑2:*_name_original是英文,需要来回转换映射(之前模型输入是中文)
  • 坑3:db_content.json中的header顺序与db_schema.json中的column_names顺序不一致,且content中的cell内容是按照header顺序

数据分析处理

注:数据有删改,本篇内所有文件均不提供下载,问就是不想吃官司。

数据表统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

2. 变压器绕组基本信息 | ['设备ID']
3. 杆塔基本信息 | ['杆塔ID']
5. 变电站基本信息 | ['资产单位']
7. 变压器基本信息 | ['资产单位']
12. 电网基本信息 | ['电网ID']
17. 发电厂基本信息 | ['发电厂ID']
22. 直流输电系统基本信息 | ['额定容量']
27. 发电机基本信息 | ['ID']
30. 直流线路基本信息 | ['资产单位']
31. 调控中心基本信息 | ['通信地址']
32. 换流站基本信息 | ['接入直流的交流电压等级']
33. 公司基本信息 | ['公司类型']
34. 公共厂站基本信息 | ['接入电网']
42. 交流线路基本信息 | ['资产单位']
46. 交流线端基本信息 | ['ID']


1. 变压器绕组电力特征值历史数据表 | ['平均值']
4. 变电站电力特征值历史数据表 | ['平均值']
6. 变压器电力特征值历史数据 | ['平均值']

8. 电网总加年电量历史数据表 | ['上报电量值']
9. 电网总加电力特征值历史数据表 | ['对象ID']
10. 电网总加月电量历史数据表 | ['上报电量值']
11. 电网总加日电量历史数据表 | ['上报电量值']


13. 发电厂年电量历史数据表 | ['对象ID']
14. 发电厂电力特征值历史数据表 | ['对象ID']
15. 发电厂月电量历史数据表 | ['对象ID']
16. 发电厂日电量历史数据表 | ['上网电量_上报']

18. 直流输电系统年电量历史数据表 | ['对象ID']
19. 直流输电系统电力特征值历史数据表 | ['平均值']
20. 直流输电系统月电量历史数据表 | ['对象ID']
21. 直流输电系统日电量历史数据表 | ['正向有功电量']

23. 发电机年电量历史数据表 | ['正向有功电量']
24. 发电机电力特征值历史数据表 | ['对象ID']
25. 发电机月电量历史数据表 | ['正向有功电量']
26. 发电机日电量历史数据表 | ['反向无功电量']


28. 直流线路电力特征值历史数据表 | ['对象ID']
29. 直流线路日电量历史数据表 | ['对象ID']

35. 母线电力特征值历史数据表 | ['平均值']
36. 母线参数 | ['母线ID']

38. 交流线路年电量历史数据表 | ['对象ID']
39. 交流线路电力特征历史数据表 | ['量测点厂站ID']
40. 交流线路月电量历史数据表 | ['对象ID']
41. 交流线路日电量历史数据表 | ['DATE']

43. 交流线端年电量历史数据表 | ['线端ID']
44. 交流线端月电量历史数据表 | ['线端ID']
45. 交流线端日电量历史数据表 | ['线端ID']

数据表选择实验

由于在这次比赛中,只提供了一个数据库,包含46张表格,与以往历史数据有较大不同,因此需要处理好这个问题才能套用之前的轮子。故考虑了以下方案:

  1. 多标签分类

    输入Question文本,输出46个table构成的vector,按照阈值判断可能相关联的表,然后动态构建数据库

  2. 二元分类

    输入Question和一个table的信息,包括table_namecolumn_namecolumn_type等信息,判断是否相关,为二元分类

  3. Question + table schema encoding

    没想好

  4. 举办方baseline-ngram

1. 多标签分类

plan_1_dev.json

plan_1_train.json

训练结果

eval_prf_report.json

结果没法看

2. 二元分类

text2sql_电网.zip

image

突然发现官方提供的baseline里有一份table select的逻辑,研究一下

为了统一评价方式,对dev中每个样本的table构建vector,计算PRF,最终取所有样本的平均值进行对比。


方案 P R F
方案二:binary 0.9976415094339622 0.9929245283018868 0.994496855345912

随手记

2021年8月24日

跑通了大概的流程,但是评价部分还有问题待解决,现在结果为:train_gold_pred.txt

待处理:

  • [x] 调通value抽取的逻辑
  • [x] 生成*.db文件用于评测
  • [ ] 出两个结果:
    • [x] gold table
    • [x] pred table
2021年8月27日

目前阶段,整体流程全都能跑通,效率可继续优化但不紧急,主要问题是基于dusql训练的模型在电网的新数据上完全没法work。

todo:

  • 用gold table
  • valuenet、ratsql+value抽取,分别进行以下实验:
方法 train dev test
valuenet dusql-train dusql-dev csgsql-train, dev
valuenet dusql-train + csgsql-train dusql-dev csgsql-dev
ratsql+value抽取-no content dusql-train dusql-dev csgsql-train, dev
ratsql+value抽取-no content dusql-train + csgsql-train dusql-dev csgsql-dev
ratsql+value抽取-use content dusql-train dusql-dev csgsql-train, dev
ratsql+value抽取-use content dusql-train + csgsql-train dusql-dev csgsql-dev
2021年8月31日
  • 去掉dev出现在train的500条数据后再次训练表格选择,指标依然很高,猜测原因是虽然训练/验证数据不同,但是文本描述有相似,模型记住了
  • 完成value提取的代码结构重构
  • 完成表格选择的分类代码torch版实现

torch版表格选择二元分类:(0为True

image

2021年9月6日

将以上模型进行封装&启动:

以下接口输入均为:

1
2
3
{
"question": "这里是一段文本这里是一段文本"
}

  1. DL5:8898/get_value

输出:

1
2
3
4
5
6
7
8
{
"input": "这里是一段文本这里是一段文本",
"table_name_candidate": [
"发电厂基本信息",
"调控中心基本信息"
],
"tb_config": {...}
}

  1. DL5:8898/use_dl_model

输出:

1
2
3
4
{
"input": "这里是一段文本这里是一段文本",
"output": true
}

组织方更正:

image

2021年9月18日

image

exact_match_eval_after_training

image

exact_match_eval_when_training

image

exact_match_eval_in_train_data

将验证集做了一个划分,一部分作为在训练过程中eval(800),一部分在训练结束后用来eval(1300+),从目前的训练情况来看,extra难度的明显不太正常,easy难度是因为training中只划分出了5条所以不能说明不正常。下一步将输出在训练数据的结果与eval_when_training的结果比对,如果结果相似则说明在训练过程有问题。

2021年9月26日

image

exact_match_eval_after_training

image

exact_match_eval_when_training

image

exact_match_eval_in_train_data

经横向对比,可以看到使用label_smooth优于softmax

可能有用的数据整理

官方:DuSQL.zip

DuSQL in valuenet format:

1
2
3
4
5
6
7
8
9
10
11
12
13
step1.DuSQL2Spider.py
train: input: 22521 but Final trans: 19177
dev: input: 2482 but Final trans: 2127
test: Final 3708

step2.extract_values.py
train: Extracted 19177 values. 2961 requests failed.
dev: Extracted 2127 values. 305 requests failed.
test: Extracted 3708 values. 430 requests failed.

step3.get_values_from_sql.py
step4.process_data_in_valuenet.py
step5.sql2SemQL.py

dusql_qianyan_in_valuenet_format.zip

DuSQL in ratsql format:

1
2
3
train: input:  22521 but Final trans:  19706 error:  2526
dev: input: 2482 but Final trans: 2168 error: 279
test: Final 3708

dusql_qianyan_in_ratsql_format.zip