LLM 課程文件
如果我的資料集不在 Hub 上怎麼辦?
並獲得增強的文件體驗
開始使用
如果我的資料集不在 Hub 上怎麼辦?
您知道如何使用 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") |
Pickled DataFrames | 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.gz 和 SQuAD_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.json 和 SQuAD_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?",
},
...
],
},
...
],
}
太棒了,我們載入了第一個本地資料集!但這對於訓練集是有效的,我們真正想要的是將 train
和 test
拆分都包含在一個 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 使用的規則(例如,透過設定 data_files="*.json"
將目錄中的所有 JSON 檔案作為單個拆分進行 glob)來全域性匹配檔案。有關更多詳細資訊,請參閱 🤗 Datasets 文件。
🤗 Datasets 中的載入指令碼實際上支援輸入檔案的自動解壓縮,因此我們可以透過將 data_files
引數直接指向壓縮檔案來跳過使用 gzip
:
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 或文字格式儲存的資料集(有關這些格式的更多資訊,請參閱文件)。