見出し画像

Huggingface Datasets 入門 (2) - データセットの読み込み

以下の記事を参考に書いてます。

Huggingface Datasets - Loading a Dataset

・Huggingface Transformers 4.1.1
・Huggingface Datasets 1.2

1. データセットの読み込み

「Huggingface Datasets」は、様々なデータソースからデータセットを読み込むことができます。

(1) Huggingface Hub
(2) ローカルファイル
(CSV/JSON/テキスト/pandas pickled データフレーム)
(3) インメモリデータ (Python辞書/pandasデータフレームなど)

2. Huggingface Hub からのデータセットの読み込み

NLPタスク用の135を超えるデータセットが、「HuggingFace Hub」で提供されています。「Huggingface Datasets Viewer」を使用してオンラインで表示および探索できます。

「Huggingface Hub」で現在利用可能なすべてのデータセットは、datasets.list_datasets() で一覧表示できます。

# 利用可能なデータセットの一覧
from datasets import list_datasets
datasets_list = list_datasets()
print(datasets_list)
['acronym_identification', 'ade_corpus_v2', 'aeslc', ...]

「Huggingface Hub」からデータセットをロードするには、datasets.load_dataset()を使います。

# squadデータセットの読み込み
from datasets import load_dataset
dataset = load_dataset('squad', split='train')
print(dataset)
Dataset({
    features: ['id', 'title', 'context', 'question', 'answers'],
    num_rows: 87599
})

◎ splitの選択
datasets.load_dataset()に「split」を指定しない場合、データセット内の全ての分割データセットを返します。

from datasets import load_dataset
datasets = load_dataset('squad')
print(datasets)
DatasetDict({
    train: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers'],
        num_rows: 87599
    })
    validation: Dataset({
        features: ['id', 'title', 'context', 'question', 'answers'],
        num_rows: 10570
    })
})

「split」は、データセットの分割範囲の制御にも利用できます。

・split='train[:10%]' :  学習分割の最初の10%のみをロード。
・split='train[:100]+validation[:100]' : 学習分割の最初の100例と検証分割の最初の100例から分割を作成。

splitの構文の詳細については、「splitチュートリアル」を参照してください。

◎ configurationの選択
一部のデータセットは、いくつかの「configuration」で構成されています。「configuration」は、選択可能なデータセットのサブパートです。「split」とは異なり、データセットには単一の「configuration」を選択する必要があり、複数の構成を混在させることはできません。

「configuration」を持つデータセットの例は、次のとおりです。

・10個のサブセット(COLA、SST2、MRPC、QQP、STSB、MNLI、QNLI、RTE、WNLI、AX)で構成されるGLUEデータセット。
・いくつかの言語で提供されているWikipediaデータセット。

データセットに複数のconfigurationが提供されている場合は、configurationを明示的に選択するように求められます。

GLUEの例は、次のとおりです。

from datasets import load_dataset
dataset = load_dataset('glue', 'sst2')
print(dataset)

◎ 手動でのファイルのダウンロード
一部のデータセットは、ライセンス問題やログイン要求の関係で、ファイルを手動でダウンロードする必要があります。

この場合、datasets.load_dataset()を使用してスクリプトを初めて実行するときに、不足しているファイルをダウンロードするための特定の手順が提供されます。

ファイルをダウンロードしたら、次のように「data_dir」を使用して、ファイルをローカルでホストしているフォルダを指定できます。

dataset = load_dataset("xtreme", "PAN-X.fr")
Downloading and preparing dataset xtreme/PAN-X.fr (download: Unknown size, generated: 5.80 MiB, total: 5.80 MiB) to /Users/thomwolf/.cache/huggingface/datasets/xtreme/PAN-X.fr/1.0.0...
AssertionError: The dataset xtreme with config PAN-X.fr requires manual data.
Please follow the manual download instructions: You need to manually download the AmazonPhotos.zip file on Amazon Cloud Drive (https://www.amazon.com/clouddrive/share/d3KGCRCIYwhKJF0H3eWA26hjg2ZCRhjpEQtDL70FSBN). The folder containing the saved file can be used to load the dataset via 'datasets.load_dataset("xtreme", data_dir="<path/to/folder>")'

datasets.load_dataset()は、データのキャッシュ場所(cache_dir)、プロキシなどのダウンロードプロセス自体のオプション、ダウンロードキャッシュが必要かどうかを制御する引数を提供します。

引数の詳細については、datasets.load_dataset()のリファレンスを参照してください。

3. ローカルファイル からのデータセットの読み込み

ローカルファイルからデータセットを読み込むこともできます。

・CSV
・JSON
・テキスト
・pandas pickled データフレーム

ファイルの読み込み方法をより適切に制御したい場合、またはHuggingFace Hubで提供されているデータセットと同じファイル形式のファイルがある場合は、独自のローディングスクリプトを作成するか、提供されているローディングスクリプトをカスタマイズすることで、より柔軟に対応できます。この場合は、「データセットローディングスクリプトの作成」を参照してください。

datas.load_dataset()のdata_files引数は、1つまたは複数のファイルへのパスを提供するために使用されます。この引数は現在、次の3種類の入力を受け入れます。

・str : 単一ファイルへのパスとしての単一文字列(デフォルトで学習データとみなされる)。
・List[str] : ファイルリストへのパスとしての文字列リスト(デフォルトで学習データとみなされる)。
・Dict[Union[str, List[str]]] : split名を単一ファイルまたはファイルリストにマッピングする辞書。

データセットにファイルを提供する例は、次のとおりです。

from datasets import load_dataset
dataset = load_dataset('csv', data_files='my_file.csv')
dataset = load_dataset('csv', data_files=['my_file_1.csv', 'my_file_2.csv', 'my_file_3.csv'])
dataset = load_dataset('csv', data_files={'train': ['my_train_file_1.csv', 'my_train_file_2.csv'], 'test': 'my_test_file.csv'})

◎ CSV
データセット内の全てのCSVは、同じ構成、特に列の同じデータ型である必要があります。

以下の機能が、バックエンドによって提供されています。

・マルチスレッドまたはシングルスレッドの読み取り。
・入力ファイルの自動解凍。
・CSVファイルの最初の行からの列名の取得。
・列ごとの型推論と、null、int64、float64、timestamp[s]、文字列、バイナリデータのいずれかへの変換。
・NaNや#N/Aなどのnull値のさまざまなスペルを検出。

CSVを読み込む例は、次のとおりです。

from datasets import load_dataset
dataset = load_dataset('csv', data_files=['my_file_1.csv', 'my_file_2.csv'])

CSVローディングスクリプトは、CSVの解析と読み取りを制御するためのいくつかの簡単なアクセスオプションを提供します。

・skip_rows (int) : スキップするファイルの最初の行数(デフォルト:0)
・column_names (list, optional) : ターゲットテーブルの列名。 空の場合は、autogenerate_column_namesにフォールバックします(デフォルト:empty)。
・delimiter (1-character string) : CSVデータ内の個々のセルを区切る文字(デフォルト:',')。
・quotechar (1-character string) : CSV値を引用するためにオプションで使用される文字(デフォルト:‘”’)。
・quoting (bool) : 引用動作を制御(デフォルト:0、これを3に設定すると、引用が無効になる。詳細については、pandas.read_csvドキュメントを参照)。

より詳細な制御が必要な場合、CSVスクリプトは、Apache Arrow pyarrow.csv.ReadOptions、pyarrow.csv.ParseOptions、pyarrow.csv.ConvertOptionsを介して、読み取り、パーソング、および変換を完全に制御します。

・read_options : pyarrow.csv.ReadOptionsを指定して、全ての読み取りオプションを制御できる。skip_rows、column_names、autogenerate_column_namesも指定されている場合(上記を参照)、これらはread_optionsの属性よりも優先される。
・parse_options : 全ての解析オプションを制御するためにpyarrow.csv.ParseOptionsとともに提供できる。
delimiterまたはquote_charも指定されている場合(上記を参照)、parse_optionsの属性よりも優先される。
・convert_options : pyarrow.csv.ConvertOptionsを指定して、全ての変換オプションを制御できる。

◎ JSON
以下のような1行毎のJSONオブジェクトが、最も効率的な形式になります。

{"a": 1, "b": 2.0, "c": "foo", "d": false}
{"a": 4, "b": -5.5, "c": null, "d": true}

以下の機能が、バックエンドによって提供されています。

・マルチスレッドの読み取り。
・入力ファイルの自動解凍。
・洗練された型推論。

JSONを読み込む例は、次のとおりです。

from datasets import load_dataset
dataset = load_dataset('json', data_files='my_file.json')

ただし、JSONは様々な形式を持つことができるため、JSONスクリプトは様々なJSON形式を処理します。

{"version: "0.1.0",
"data": [{"a": 1, "b": 2.0, "c": "foo", "d": false},
         {"a": 4, "b": -5.5, "c": null, "d": true}]
}

この場合、次のように「field」を使用して、データセットを含むフィールドを指定する必要があります。

from datasets import load_dataset
dataset = load_dataset('json', data_files='my_file.json', field='data')

◎ テキスト
テキストから、テキスト行を単一列とするデータセットを生成することができます。

from datasets import load_dataset
dataset = load_dataset('text', data_files={'train': ['my_text_1.txt', 'my_text_2.txt'], 'test': 'my_test_file.txt'})

◎ データセットの特徴の指定
ローカルファイルからデータセットを読み込むと、datasets.Apache Arrow自動型推論に基づく自動型推論システムを使用して、データセットの特徴が自動的に推測されます。

ただし、datasets.ClassLabelを使用してラベルの名前とインデックスを制御する場合など、データセットの機能を自分で定義したい場合があります。この場合、datasets.load_dataset()にdatasets.Featuresインスタンスを提供し、データセットの特徴を定義して、デフォルトの事前計算された特徴をオーバーライドできます。

4. インメモリデータ からのデータセットの読み込み

インメモリデータからデータセットを読み込むこともできます。

・Python辞書
・pandasデータフレーム

◎ Python辞書
Pythonのインメモリオブジェクトに既にいくつかのデータをロードしているとします。

my_dict = {'id': [0, 1, 2],
           'name': ['mary', 'bob', 'eve'],
           'age': [24, 53, 19]}

次に、datasets.Datasetクラスのdatasets.Dataset.from_dict()またはdatasets.Dataset.from_pandas()を使用して、datasets.Datasetオブジェクトをインスタンス化できます。

from datasets import Dataset
dataset = Dataset.from_dict(my_dict)

◎ pandasデータフレーム
pandasのDataFrameからdatasets.Datasetオブジェクトをインスタンス化できます。

from datasets import Dataset
import pandas as pd
df = pd.DataFrame({"a": [1, 2, 3]})
dataset = Dataset.from_pandas(df)

インスタンス化されたdatasets.Datasetのスキーマとタイプが意図したとおりであることを確認するために、データセットの機能をdatasets.Featureオブジェクトとしてfrom_dict()とfrom_pandas()に明示的に提供できます。

5. カスタムデータセットローディングスクリプト

提供されているHubデータセットまたはローカルファイルのローディングスクリプトがユースケースに適合していない場合は、独自のデータセットローディングスクリプトを作成することもできます。

通常のショートカット名の代わりにパスを指定するだけで、ローカルローディングスクリプトを使用できます。

from datasets import load_dataset
dataset = load_dataset('PATH/TO/MY/LOADING/SCRIPT', data_files='PATH/TO/MY/FILE')

データセットローディングスクリプトの作成方法については、「データセットローディングスクリプトの作成」を参照してください。また、GitHubリポジトリで提供されているローディングスクリプトを参考にすることができます。




この記事が気に入ったらサポートをしてみませんか?