数据集清理新手指南
有时数据集是原始的、未经过滤的,并且没有 100% 准备好用于训练和其他任务。数据集清理是准备数据集以进行训练的非常常见的任务。
Microsoft Orca Agent Instruct 数据集
一个例子是 Maxime Labonne 清理过的 Microsoft Orca Agent Instruct 数据集,可以在 mlabonne/orca-agentinstruct-1M-v1-cleaned 找到。
Microsoft Orca Agent Instruct 数据集包含大约 100 万个指令示例,涵盖了文本编辑、创意写作、编码、阅读理解和脑筋急转弯等广泛任务。
清理步骤
在数据集卡中,Maxime 概述了清理过程
以下是我做的更改
- 将拆分统一为一个,并添加了新的“split”列
- 将字符串转换为字典列表,以确保与大多数框架兼容
- 移除了空系统提示,以避免出现奇怪的错误
在这篇文章中,我们将详细介绍如何无需离开数据集网页就能轻松完成这项任务。我们将分解上述步骤,并逐步编写一些 SQL 代码,通过 SQL 控制台 来实现。
打开 SQL 控制台
首先,我们将单击数据集页面上的 SQL Console
按钮,这将打开 SQL 控制台并自动加载一个子集和拆分。
你会注意到几点。首先,1/15 已加载拆分表示我们只加载了 creative_content
拆分,还有 14 个未加载的视图。我们可以简单地点击其他拆分以自动将它们加载到 DuckDB 中,这样我们就可以查询它们了。
1. 将字符串转换为 STRUCT
将字符串转换为字典列表相当简单。我们知道 messages
字段是一个包含 role
和 content
键的对话消息列表。我们可以在 DuckDB 中将其表示为 STRUCT,并使用 CAST 将 VARCHAR 类型转换为 Struct。
CAST(messages AS STRUCT(role VARCHAR, content VARCHAR)[]) as messages
2. 删除空系统提示
接下来,让我们过滤掉空消息,并直接以用户消息开始对话。
由于 messages 是一个 LIST 类型,我们可以使用方便的 DuckDB 列表函数:list_filter 来过滤掉空消息。
我们可以从扩展上面的代码开始,使用 list_filter
-- filter out if content is null or empty string
list_filter(messages, x -> x.content != '' AND x.content is not null) as messages
这将过滤掉*所有*空消息。如果想更具体地只过滤掉空系统提示,我们可以更新 lambda 函数来完成。
3. 合并拆分
现在我们正在将消息从字符串转换为结构列表并删除空消息,接下来我们将合并两个拆分并添加一列来指示它是哪个拆分。
让我们开始
- 将所有要连接的拆分作为视图加载
- 使用 SQL UNION 运算符组合所有拆分的结果
我们将只合并两个拆分,因为整个数据集在浏览器中太大。但是对于较小的数据集,它非常适合合并整个数据集!
WITH joined_data as (
SELECT *, 'creative_content' as split FROM creative_content
UNION ALL
SELECT *, 'text_modification' as split FROM text_modification
)
select * from joined_data
我们可以使用 UNION ALL 来合并所有行
最后,我们可以添加其他部分以获得最终清理后的合并结果
-- join the splits together
WITH joined_data as (
SELECT *, 'creative_content' as split FROM creative_content
UNION ALL
SELECT *, 'text_modification' as split FROM text_modification
)
select
list_filter(
CAST(messages AS STRUCT(role VARCHAR, content VARCHAR)[]), -- cast string to list of structs
x -> x.content != '' AND x.content is not null -- filter out empty messages
) AS messages,
split
from joined_data
现在,我们有了一个可以下载和使用的数据集!