这周工作主要是为微调数据集进行改造,抽取数据集变换格式以适应Xtuner需要的格式。
第二周选择DailyDialog数据集是一个高质量的多回合开放域英语对话数据集。它包含13118个对话,分为11118个对话的训练集和1000个对话的验证和测试集。用python查看数据集的一行内容:
为转化为Xtuner微调框架所需要的规范数据,使用脚本将对话集抽取出来,作为数据集使用
对应的脚本和抽取的规范化数据位于repository的data_processor目录中,以下为关键脚本内容:
import json
from datasets import load_from_disk
# 加载数据集
dataset = load_from_disk("./daily_dialog")
# 获取所有对话数据
all_dialogs = dataset['train']['dialog'] + dataset['test']['dialog'] + dataset['validation']['dialog']
# 将数据转换为需要的JSON格式
formatted_data = []
for dialog in all_dialogs:
if len(dialog) % 2 != 0:
# 如果对话数目为奇数,删除最后一个对话
dialog = dialog[:-1]
for i in range(0, len(dialog), 2):
formatted_data.append({
"conversation": [
{
# 有时候会出现字符’,需要替换
"input": dialog[i].replace("’", "\'"),
"output": dialog[i+1].replace("’", "\'")
}
]
})
# 将格式化后的数据保存为JSON文件
with open('formatted_data.json', 'w', encoding='utf-8') as f:
json.dump(formatted_data, f, ensure_ascii=False, indent=4)
提取出来的json文件有30多万行:
以上为第一种数据抽取方式,更为方便的,有第二种抽取方式:
期望数据格式为:
{"conversation": [{"input": "...", "output": " ..."}, {"input": " ...", "output": " ..."}, {"input": " ... ", "output": " ... "}, ...]}
{"conversation": [{"input": "...", "output": " ..."}, {"input": " ...", "output": " ..."}, {"input": " ... ", "output": " ... "}, ...]}
{"conversation": [{"input": "...", "output": " ..."}, {"input": " ...", "output": " ..."}, {"input": " ... ", "output": " ... "}, ...]}
...
对应脚本可以改成:
import json
from datasets import load_from_disk
# 加载数据集
dataset = load_from_disk("./daily_dialog")
# 获取所有对话数据
all_dialogs = dataset['train']['dialog'] + dataset['test']['dialog'] + dataset['validation']['dialog']
# 将数据转换为需要的JSONL格式
with open('formatted_data2.jsonl', 'w', encoding='utf-8') as f:
for dialog in all_dialogs:
conversations = []
for i in range(len(dialog) - 1):
conversations.append({
# 有时候会出现字符’,需要替换
"input": dialog[i].replace("’", "\'"),
"output": dialog[i+1].replace("’", "\'") if i != len(dialog) - 1 else ""
})
formatted_data = {"conversation": conversations}
json.dump(formatted_data, f, ensure_ascii=False)
f.write("\n")
print("数据已成功转换并保存为formatted_data.jsonl文件")
提取出的jsonl文件: