make_dataset.md
March 12, 2024 · View on GitHub
数据预处理
对任务数据进行预处理,规整格式,最终的结果对应于config文件中的path路径。
UltraEval对来自HuggingFace、数据集GitHub官网等权威公开渠道的原始数据集,进行统一格式化处理,以确保评测数据的可溯源和透明度。这些处理步骤在 datasets/{dataset_name}/make_dataset.py 中进行,原始数据集下载后保留在 RawData/ 目录下。
以下是UltraEval通常保留的字段说明:
- passage: 补充信息,除问题之外的其他文本。
- question: 问题。
- target_scores: (选择题类型任务)选项及正确答案。字典形式,键为不同选项的得分,正确选项的值为1,错误选项为0。在PPL评测方式中,这些选项会直接拼接到模型输入的句子末尾,以计算各选项的负对数概率(negative loglikelihood)。特别注意,当任务要求将选项插入句子中间而非末尾时,应特别处理,可参考
chid数据集的实现方式(即target_scores中的所有键为选项及后续句子的拼接)。 - answer: (填空题类型任务)正确答案。
注:当任务为单项选择题的时候,answer通常为空字符串;当任务为填空题时,target_scores通常为空字典。对于多项选择题的处理,可参考agieval 数据集中gaokao-physics任务的实现方式 ,此时同时保留了target_score字段(用以存放选项)和answer字段(用以存放答案)。另外,用户可以根据个人需求自定义其他字段,但需确保这些字段与同一数据集目录下的 transform.py中的字段保持逻辑上的一致性。
- 以ax-b为例:
import json
import os
def transform_entry(data_entry):
# ax-b数据集关注于判断两个句子之间的蕴含关系。它提供的回答是有限的,因此选择将其处理成选择题的形式。
# 在这里,我们使用target_scores字段来表示每个选项("Yes"或"No")是否正确,同时将answer字段置为空字符串。
return {
"passage": [data_entry["sentence1"], data_entry["sentence2"]],
"question": "",
"target_scores": {
"Yes": int(data_entry["label"] == "entailment"),
"No": int(data_entry["label"] == "not_entailment")
},
"answer": ""
}
def convert(input_file_path, output_file_path):
# 打开输入文件和输出文件,以进行读取和写入操作。
# 输入文件是官方提供的原始格式数据,输出文件是转换后的UltraEval版的JSONL格式。
with open(input_file_path, 'r', encoding='utf-8') as infile, \
open(output_file_path, 'w', encoding='utf-8') as outfile:
for line in infile:
# 对于输入文件的每一行,将其转换成JSON格式,然后应用transform_entry函数进行UltraEval格式化处理。
data_entry = json.loads(line.strip())
transformed_entry = transform_entry(data_entry)
outfile.write(json.dumps(transformed_entry, ensure_ascii=False) + '\n')
def main():
script_dir = os.path.dirname(os.path.realpath(__file__))
# 定义官方数据集的路径和转换后的数据集路径。
# 注意,转换后的数据应保持为JSONL格式。
# 当一个数据集包含多个子任务时,可参考mmlu数据集的处理方式,并确保每个子任务对应一个JSONL文件。
input_path = '../../RawData/ax-b/AX-b.jsonl'
output_path = './data/ax-b.jsonl'
input_file_path = os.path.join(script_dir, input_path)
output_file_path = os.path.join(script_dir, output_path)
convert(input_file_path, output_file_path)
if __name__ == "__main__":
main()
用户使用时,既可以单独运行特定数据集的make_dataset.py来对单一数据集进行UltraEval格式的任务集创建,也可以运行主目录下的data_process.py实现全部数据集的UltraEval格式的数据集创建。