資料集文件

批次映射 (Batch mapping)

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

批次映射

結合 Dataset.map() 的功能與批次模式(batch mode)是非常強大的。它能讓您加速處理流程,並自由控制生成資料集的大小。

追求速度

批次映射的主要目標是加速處理流程。通常,處理批次數據比單一範例要快得多。顯然,批次映射非常適合用於標記化(tokenization)。例如,🤗 Tokenizers 函式庫在處理批次時效率更高,因為它能並行化批次中所有範例的標記化過程。

輸入大小 != 輸出大小

控制生成資料集大小的能力,可用於許多有趣的應用場景。在「操作指南」的 map 章節中,有幾個使用批次映射的範例,例如:

  • 將長句子切分成較短的區塊。
  • 使用額外的標記(tokens)來擴增資料集。

理解其運作原理對於發揮批次映射的用途很有幫助。此時,您可能想知道如何控制生成資料集的大小。答案是:映射函式不必回傳與輸入批次大小相同的輸出

換句話說,您的映射函式可以接收大小為 N 的批次,並回傳大小為 M 的批次。輸出 M 可以大於或小於 N。這意味著您可以串接範例、進行拆分,甚至新增更多範例!

不過請記住,輸出字典中的所有數值都必須包含與字典中其他欄位相同數量的元素。否則,將無法定義映射函式所回傳輸出中的範例數量。該數量在映射函式處理連續批次之間可以有所不同。但在單一批次中,輸出字典的所有數值都必須具有相同的長度(即元素數量)。

舉例來說,若資料集有 1 欄 3 列,若您使用 map 回傳一個列數為兩倍的新欄位,將會導致錯誤。此情況下,您會得到一欄有 3 列、另一欄有 6 列的結果。如您所見,該表格將無效。

>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True)  # new column with 6 elements: [0, 1, 2, 0, 1, 2]
'ArrowInvalid: Column 1 named b expected length 3 but got length 6'

為了使其有效,您必須移除其中一個欄位。

>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True)
>>> len(dataset_with_duplicates)
6

或者,您可以覆蓋現有的欄位以達到相同結果。例如,以下是如何透過覆蓋 "a" 欄位來複製資料集中的每一列:

>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
# overwrites the existing "a" column with duplicated values
>>> duplicated_dataset = dataset.map(
...     lambda batch: {"a": [x for x in batch["a"] for _ in range(2)]},
...     batched=True
... )
>>> duplicated_dataset
Dataset({
    features: ['a'],
    num_rows: 6
})
>>> duplicated_dataset["a"]
[0, 0, 1, 1, 2, 2]
在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.