並獲得增強文件體驗
開始
如果我的資料集不在 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") |
| 醃製後的 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.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_datasetDatasetDict({
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 上託管的資料集的方法的探索。現在我們有了一個可以使用的資料集,讓我們開始動手使用各種資料整理技術吧!