有一个需求,就是将魔塔社区的数据集搬到huggingface上来用,并且转换格式。所以需要将jsonl文件进行一下变换。
jsonl按照一个数据行,加载数据文件
使用的是json_lines库
with json_lines.open(file_path) as file:
for i,data in enumerate(file):
pass
通过上面的方式就可以单个数据加载数据了。
将单个数据写入文件
在jsonl中,单个数据是被{}用字典包裹起来的,同时行与行之间是没有间隔符号的。
{
"instruction": "我们如何在日常生活中减少用水?",
"input": "",
"output": "1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n5. 洗澡时间缩短,使用低流量淋浴头节约用水。 \n6. 收集雨水,用于园艺或其他非饮用目的。 \n7. 刷牙或擦手时关掉水龙头。 \n8. 减少浇水草坪的时间。 \n9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 \n10. 只购买能源效率高的洗碗机和洗衣机。"
}
{
"instruction": "编辑文章,使其更吸引读者。",
"input": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入。自主机器人在各个行业中被越来越广泛地应用,从制造业到医疗保健再到安全。",
"output": "自主机器人是计算机控制的机器,被编程执行特定任务而不需要任何人类输入,从而实现了新的效率、精确度和可靠性水平。自主机器人在各个行业中被越来越广泛地应用,从制造业,它们可以使用精度和一致的质量组装复杂的组件,到医疗保健,可以协助进行医疗测试和处理,再到安全,可以监控大面积地区,保障人们和财产的安全。自主机器人还可以减少在危险或有害环境中的错误和增加安全,在工业流程的检查或维修期间等。由于其多样性,自主机器人将彻底改变我们工作方式的方式,使任务变得更加简单、快速,最终更加愉悦。"
}
针对于处理好的数据,需要将数据转换成json对象,然后存入jsonl中。以上面的数据为例子。jsonl的第一行数据在python中使用dict对象存储的。dict对象中有三个键值对,分别是instruction,input,output。这些都是python对象(字典,字符串)。
#首先是构造数据
data_dict = {}
data_dict['instruction'] = "我们如何在日常生活中减少用水?"
data_dict['input'] = ''
data_dict['output'] = "1. 使用节水装置,如节水淋浴喷头和水龙头。 \n2. 使用水箱或水桶收集家庭废水,例如洗碗和洗浴。 \n3. 在社区中提高节水意识。 \n4. 检查水管和灌溉系统的漏水情况,并及时修复它们。 \n5. 洗澡时间缩短,使用低流量淋浴头节约用水。 \n6. 收集雨水,用于园艺或其他非饮用目的。 \n7. 刷牙或擦手时关掉水龙头。 \n8. 减少浇水草坪的时间。 \n9. 尽可能多地重复使用灰水(来自洗衣机、浴室水槽和淋浴的水)。 \n10. 只购买能源效率高的洗碗机和洗衣机。"
#将python对象转换成json对象
data_json = json.dumps(data_dict)
#写入文件,这里不需要用json_lines打开文件
with open(file_path,'a+') as file:
file.write(data_json + '\n')
通过上面构成的数据,就可以使用load_datase()方法进行加载了。
其中还有一个细节,加载本地数据集的时候,要显示的指明路径:
dataet = load_dataset('json', data_files=file_path)
如果使用dataet = load_dataset(‘json’,file_path)会报错