Hub documentation

编辑数据集

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

编辑数据集

Hub 支持对社区和研究数据集进行协作式整理。我们鼓励您探索 Hub 上可用的数据集,并为其改进做出贡献,以帮助壮大机器学习社区并加速所有人的进步。欢迎所有贡献!

如果还没有,请先创建一个 Hugging Face Hub 账户。

使用 Hub UI 进行编辑

目前,此功能仅适用于 CSV、TSV 和 Parquet 数据集。

Hub 的 Web 界面允许没有任何技术背景的用户编辑数据集。

打开数据集页面并导航至 Data Studio 标签页以开始编辑。

点击 切换编辑模式 以启用数据集编辑。

您可以编辑任意数量的单元格,最后点击 Commit 以提交更改并留下提交信息。

使用 huggingface_hub 客户端库

huggingface_hub 库可以管理 Hub 仓库,包括编辑数据集。

例如,以下是如何使用 Hugging Face FileSystem API 编辑 CSV 文件:

from huggingface_hub import hffs

path = f"datasets/{repo_id}/data.csv"

with hffs.open(path, "r") as f:
    content = f.read()
edited_content = content.replace("foo", "bar")
with hffs.open(path, "w") as f:
    f.write(edited_content)

你也可以在本地磁盘上应用编辑并提交更改:

from huggingface_hub import hf_hub_download, upload_file

local_path = hf_hub_download(repo_id=repo_id, path_in_repo= "data.csv", repo_type="dataset")

with open(path, "r") as f:
    content = f.read()
edited_content = content.replace("foo", "bar")
with open(path, "w") as f:
    f.write(edited_content)

upload_file(repo_id=repo_id, path_in_repo=local_path, repo_type="dataset")

若要本地获取整个数据集仓库并一次性编辑多个文件,请使用 snapshot_download 和 upload_folder,而不是 hf_hub_download 和 upload_file

访问客户端库的文档以了解更多信息。

集成库

如果 Hub 上的数据集与某个受支持的库兼容,那么加载、编辑和推送该数据集只需几行代码。

以下是如何使用 Pandas 编辑 CSV 文件:

import pandas as pd

# Load the dataset
df = pd.read_csv(f"hf://datasets/{repo_id}/data.csv")

# Edit
df = df.apply(...)

# Commit the changes
df.to_csv(f"hf://datasets/{repo_id}/data.csv")

Polars 和 DuckDB 等库也实现了 hf:// 协议,用于在 Hugging Face 上读取、编辑和写入文件。此外,Spark、Dask 或 🤗 Datasets 等其他库对于编辑由许多文件组成的数据集也很有用。完整的受支持库列表请参见 此处

有关在网站上访问数据集的信息,您可以点击数据集页面上的“使用此数据集”按钮来查看操作方法。 例如,samsum 在下方展示了如何使用 🤗 Datasets 进行操作。

仅上传新数据

Hugging Face 的存储由 Xet 提供支持,它利用分块去重技术使上传更加高效。 与传统云存储不同,Xet 在提交更改时无需重新上传整个数据集。 相反,它会自动检测数据集中哪些部分发生了变化,并指示客户端库仅上传已更新的部分。 为此,Xet 使用一种智能算法来查找 Hugging Face 上已存在的 64kB 分块。

让我们看看之前使用 Pandas 的示例:

import pandas as pd

# Load the dataset
df = pd.read_csv(f"hf://datasets/{repo_id}/data.csv")

# Edit part of the dataset
df = df.apply(...)

# Commit the changes
df.to_csv(f"hf://datasets/{repo_id}/data.csv")

此代码首先加载数据集,然后对其进行编辑。 编辑完成后,to_csv() 会在内存中生成文件,将其分块,询问 Xet 哪些块已存在于 Hugging Face 上以及哪些块已更改,然后仅上传新数据。

优化的 Parquet 编辑

需要上传的数据量取决于编辑内容和文件结构。

Parquet 格式采用列式存储,并在页面级别进行压缩(页面大小约为 1MB)。 我们针对 Xet 优化了 Parquet,采用了 Parquet 内容定义分块,这通常可确保未更改的数据对应未更改的页面。

例如,此代码上传 df 的内容,然后对于 edited_df,由于只上传了发生变化的块,因此上传速度更快:

import pandas as pd

df.to_parquet(
    "hf://datasets/username/my_dataset/imdb.parquet",
    # Optimize for Xet
    use_content_defined_chunking=True,
    write_page_index=True,
)

edited_df = ...  # e.g. with added/modified/removed rows or columns

edited_df.to_parquet(
    "hf://datasets/username/my_dataset/imdb.parquet",
    # Optimize for Xet
    use_content_defined_chunking=True,
    write_page_index=True,
)

数据块大小约为 64kB,而 Parquet 按列存储数据,因此实际编辑优化后的 Parquet 文件时,会发生以下情况:

  • 添加新列 -> 仅上传新列的块
  • 添加/编辑/删除一行 -> 每列上传一个数据块

此外,包含元数据的 Parquet 文件尾块也会被上传。

请在支持的库页面中查看您的库是否支持 Optimized Parquet。

流式

对于大型数据集,建议使用具备数据集流式处理功能的库,以构建端到端的流式处理管道。 在这种情况下,随着旧数据的到达和新数据上传到 Hub,数据集处理会逐步进行。

请在支持的库页面中查看你的库是否支持流式传输。

Update on GitHub