数据集清理新手指南

社区文章 发布于 2024 年 11 月 18 日

有时数据集是原始的、未经过滤的,并且没有 100% 准备好用于训练和其他任务。数据集清理是准备数据集以进行训练的非常常见的任务。

Microsoft Orca Agent Instruct 数据集

一个例子是 Maxime Labonne 清理过的 Microsoft Orca Agent Instruct 数据集,可以在 mlabonne/orca-agentinstruct-1M-v1-cleaned 找到。

Microsoft Orca Agent Instruct 数据集包含大约 100 万个指令示例,涵盖了文本编辑、创意写作、编码、阅读理解和脑筋急转弯等广泛任务。

清理步骤

在数据集卡中,Maxime 概述了清理过程

以下是我做的更改

  1. 将拆分统一为一个,并添加了新的“split”列
  2. 将字符串转换为字典列表,以确保与大多数框架兼容
  3. 移除了空系统提示,以避免出现奇怪的错误

在这篇文章中,我们将详细介绍如何无需离开数据集网页就能轻松完成这项任务。我们将分解上述步骤,并逐步编写一些 SQL 代码,通过 SQL 控制台 来实现。

打开 SQL 控制台

首先,我们将单击数据集页面上的 SQL Console 按钮,这将打开 SQL 控制台并自动加载一个子集和拆分。

image/png

你会注意到几点。首先,1/15 已加载拆分表示我们只加载了 creative_content 拆分,还有 14 个未加载的视图。我们可以简单地点击其他拆分以自动将它们加载到 DuckDB 中,这样我们就可以查询它们了。

1. 将字符串转换为 STRUCT

将字符串转换为字典列表相当简单。我们知道 messages 字段是一个包含 rolecontent 键的对话消息列表。我们可以在 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. 合并拆分

现在我们正在将消息从字符串转换为结构列表并删除空消息,接下来我们将合并两个拆分并添加一列来指示它是哪个拆分。

让我们开始

  1. 将所有要连接的拆分作为视图加载
  2. 使用 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

image/png

现在,我们有了一个可以下载和使用的数据集!

资源

社区

注册登录 评论