NLP 課程文件

如果我的資料集不在 Hub 上怎麼辦?

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強文件體驗

開始

如果我的資料集不在 Hub 上怎麼辦?

Ask a Question Open In Colab Open In Studio Lab

您知道如何使用 Hugging Face Hub 下載資料集,但您經常會發現自己處理儲存在筆記型電腦或遠端伺服器上的資料。在本節中,我們將向您展示如何使用 🤗 Datasets 載入不在 Hugging Face Hub 上的資料集。

處理本地和遠端資料集

🤗 Datasets 提供載入指令碼以處理本地和遠端資料集的載入。它支援幾種常見的資料格式,例如

資料格式 載入指令碼 示例
CSV & TSV csv load_dataset("csv", data_files="my_file.csv")
文字檔案 text load_dataset("text", data_files="my_file.txt")
JSON & JSON Lines json load_dataset("json", data_files="my_file.jsonl")
醃製後的 DataFrame pandas load_dataset("pandas", data_files="my_dataframe.pkl")

如表所示,對於每種資料格式,我們只需要在 load_dataset() 函式中指定載入指令碼的型別,以及一個 data_files 引數,該引數指定一個或多個檔案路徑。讓我們首先從本地檔案載入資料集;稍後我們將看到如何使用遠端檔案執行相同的操作。

載入本地資料集

對於此示例,我們將使用 SQuAD-it 資料集,這是一個用於義大利語問答的大規模資料集。

訓練和測試拆分託管在 GitHub 上,因此我們可以使用簡單的 wget 命令下載它們

!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-train.json.gz
!wget https://github.com/crux82/squad-it/raw/master/SQuAD_it-test.json.gz

這將下載兩個名為 SQuAD_it-train.json.gzSQuAD_it-test.json.gz 的壓縮檔案,我們可以使用 Linux gzip 命令解壓縮它們

!gzip -dkv SQuAD_it-*.json.gz
SQuAD_it-test.json.gz:	   87.4% -- replaced with SQuAD_it-test.json
SQuAD_it-train.json.gz:	   82.2% -- replaced with SQuAD_it-train.json

我們可以看到壓縮檔案已被 SQuAD_it-train.jsonSQuAD_it-test.json 替換,並且資料以 JSON 格式儲存。

✎ 如果您想知道上面 shell 命令中為什麼有 ! 字元,那是因為我們是在 Jupyter notebook 中執行它們。如果您想在終端中下載和解壓縮資料集,只需刪除字首即可。

要使用 load_dataset() 函式載入 JSON 檔案,我們只需要知道我們是否正在處理普通的 JSON(類似於巢狀字典)或 JSON Lines(換行符分隔的 JSON)。與許多問答資料集一樣,SQuAD-it 使用巢狀格式,所有文字都儲存在 data 欄位中。這意味著我們可以透過如下指定 field 引數來載入資料集

from datasets import load_dataset

squad_it_dataset = load_dataset("json", data_files="SQuAD_it-train.json", field="data")

預設情況下,載入本地檔案會建立一個具有 train 拆分的 DatasetDict 物件。我們可以透過檢查 squad_it_dataset 物件來檢視這一點

squad_it_dataset
DatasetDict({
    train: Dataset({
        features: ['title', 'paragraphs'],
        num_rows: 442
    })
})

這向我們展示了訓練集的行數和與之關聯的列名。我們可以透過索引到 train 拆分中來檢視其中一個示例,如下所示

squad_it_dataset["train"][0]
{
    "title": "Terremoto del Sichuan del 2008",
    "paragraphs": [
        {
            "context": "Il terremoto del Sichuan del 2008 o il terremoto...",
            "qas": [
                {
                    "answers": [{"answer_start": 29, "text": "2008"}],
                    "id": "56cdca7862d2951400fa6826",
                    "question": "In quale anno si è verificato il terremoto nel Sichuan?",
                },
                ...
            ],
        },
        ...
    ],
}

太好了,我們載入了第一個本地資料集!但雖然這對訓練集有效,但我們真正想要的是將 traintest 拆分都包含在一個 DatasetDict 物件中,以便我們可以同時對這兩個拆分應用 Dataset.map() 函式。為此,我們可以向 data_files 引數提供一個字典,該字典將每個拆分名稱對映到與該拆分關聯的檔案

data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")
squad_it_dataset
DatasetDict({
    train: Dataset({
        features: ['title', 'paragraphs'],
        num_rows: 442
    })
    test: Dataset({
        features: ['title', 'paragraphs'],
        num_rows: 48
    })
})

這正是我們想要的。現在,我們可以應用各種預處理技術來清理資料、對評論進行標記化等等。

load_dataset() 函式的 data_files 引數非常靈活,可以是單個檔案路徑、檔案路徑列表或將拆分名稱對映到檔案路徑的字典。您還可以根據 Unix shell 使用的規則來 glob 與指定模式匹配的檔案(例如,您可以透過將 data_files 設定為 "*.json" 來將目錄中的所有 JSON 檔案 glob 為單個拆分)。有關更多詳細資訊,請參閱 🤗 Datasets 的 文件

🤗 Datasets 中的載入指令碼實際上支援輸入檔案的自動解壓縮,因此我們可以跳過使用 gzip,直接將 data_files 引數指向壓縮檔案

data_files = {"train": "SQuAD_it-train.json.gz", "test": "SQuAD_it-test.json.gz"}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")

如果您不想手動解壓縮許多 GZIP 檔案,這將非常有用。自動解壓縮也適用於其他常見格式,如 ZIP 和 TAR,因此您只需將 data_files 指向壓縮檔案即可!

既然您知道如何在筆記型電腦或桌上型電腦上載入本地檔案,那麼讓我們看看如何載入遠端檔案。

載入遠端資料集

如果您在公司擔任資料科學家或程式設計師,則您要分析的資料集很可能儲存在某些遠端伺服器上。幸運的是,載入遠端檔案與載入本地檔案一樣簡單!我們不是提供本地檔案的路徑,而是將 load_dataset()data_files 引數指向儲存遠端檔案的的一個或多個 URL。例如,對於託管在 GitHub 上的 SQuAD-it 資料集,我們可以將 data_files 指向 SQuAD_it-*.json.gz URL,如下所示

url = "https://github.com/crux82/squad-it/raw/master/"
data_files = {
    "train": url + "SQuAD_it-train.json.gz",
    "test": url + "SQuAD_it-test.json.gz",
}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")

這返回了上面獲得的相同的 DatasetDict 物件,但節省了我們手動下載和解壓縮 SQuAD_it-*.json.gz 檔案的步驟。這結束了我們對各種載入不在 Hugging Face Hub 上託管的資料集的方法的探索。現在我們有了一個可以使用的資料集,讓我們開始動手使用各種資料整理技術吧!

✏️ 試試看!選擇另一個託管在 GitHub 或 UCI 機器學習庫 上的資料集,並嘗試使用上面介紹的技術在本地和遠端載入它。作為加分項,嘗試載入以 CSV 或文字格式儲存的資料集(有關這些格式的更多資訊,請參閱 文件)。

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