見出し画像

HuggingFaceのdatasetsライブラリーについて

HuggingFaceのdatasetsライブラリーについての記事になります。

datasetライブラリーの便利なメソッドをご紹介します。

目次から辞書代わりに使ってください。

datasetsライブラリーは、
自然言語処理や大規模言語モデル開発において非常に重宝します!

まずは、datasetsライブラリーをインストールします。

!pip install datasets

目次は以下の通り。




データセットを読み込む:load_dataset()


HuggingFaceのデータセットだけでなく、
ローカルのデータセット(JSONやCSV)も読み込むことができます!

HuggingFaceのデータセットを読み込む場合

第一引数に、HuggingFaceのデータセット名を入れます。

from datasets import load_dataset

dataset = load_dataset("kunishou/databricks-dolly-15k-ja")


ローカルのデータセット(JSONファイルなど)を読み込む場合

第一引数にファイルソース、data_filesにデータセットのパスを入れます。


dataset = load_dataset("json",data_files="/content/dolly-ja.json",split="train)



load_dataset()の引数について

❶path(必須):

  • 読み込みたいHugging Face Hub 上のデータセット名や、データセットのソース("json","csv"など)を指定します。

❷data_files(オプション):

  • ローカルに保存しているカスタムデータセットをロードする場合、そのファイルのパスを指定します。

split(オプション)

読み込みたいデータの分割(例: "train", "test", "validation")。
分割を指定しない場合、デフォルトで全体をロードします。


データセットのデータ構造について

datasetを実行すると以下が出力されます。
これはデータセットのデータ構造です。
split引数を使う場合と使わなかった場合で出力が異なります。

split引数を使わない場合

❶features:
データの特徴量(カラム)です。
このデータセットにはoutput, input, index, category, instructionがあります。

❷num_rows:
データの件数です。このデータセットは全部で15,015のデータがあります。

load_datasetでsplit引数を使っていないので、
データセット全体がロードされています。

最初がDatasetDictで始まるのは、
これがデータセット全体であることを示しています。

DatasetDictの中に、trainデータとしてDatasetが格納されています。

DatasetDict: 複数のデータ分割(例: train, test)を含む辞書形式。
Dataset: 指定した分割(例: train のみ)の辞書形式。

split="train"を入力すると、train部分だけがロードされます。

split="train"とした場合

個別のデータにアクセスしたい場合は、
辞書オブジェクトと同じように扱えばOKです。

#1つめのデータにアクセスする
dataset["train"][0]

#1つめのデータのoutputの中身にアクセスする
dataset["train"][0]["output"]



カラム名の取得:column_names

データセット内のカラム名を取得します。

dataset.column_names

出力結果

{'train': ['output', 'input', 'index', 'category', 'instruction']}



カラム名の変更:rename_column()

引数に、("変更前のカラム名", "変更後のカラム名")を入力することで、カラム名を変更できます

renamed_dataset = dataset.rename_column("input","context")
renamed_dataset

出力結果

DatasetDict({
    train: Dataset({
        features: ['output', 'context', 'index', 'category', 'instruction'],
        num_rows: 15015
    })
})



データ変換する:to_pandas()、to_json()

pandasのデータフレームへ変換:to_pandas()

import pandas as pd

df = dataset.to_pandas()
df.head()

出力結果

jsonデータへの変換:to_json()

import json

dataset.to_json("/content/dolly.json", orient="records", force_ascii=False)

orient="records" (デフォルトは"records")。 データを行ごとに分ける形式であり、ほとんどのアプリケーションで読み込みが簡単になる。force_ascii=False (デフォルトはTrue)。 日本語などの非 ASCII 文字を扱う場合は、Falseを推奨。



データセットをローカルに保存:save_to_disk()

引数に保存したいパスを指定します。

dataset.save_to_disk("path/to/directory")



ローカルに保存したデータセットを読み込む:load_from_disk()

引数にローカル保存先を指定します。

from datasets import load_from_disk
dataset = load_from_disk("path/to/directory")



カラムに関数を適用:map()

特徴量の生成

例: テキストの文字数を新しい列として追加

def add_length_feature(example):
    example["text_length"] = len(example["text"])
    return example

dataset = dataset.map(add_length_feature)
dataset

複数のカラムを統合

例: first_name と last_name を結合して full_name を作成

def combine_columns(example):
    example["full_name"] = f"{example['first_name']} {example['last_name']}"
    return example

dataset = dataset.map(combine_columns)
dataset



条件に合う行を抽出:filter()

dataset = dataset.filter(lambda x: x["category"] == "closed_qa")
dataset



datasetをtrainとtestに分割:train_test_split()

sizeを調整することでランダムにサンプリングできる。

dataset = dataset.train_test_split(train_size=0.2)["train"]
dataset



(さいご)複数のdatasetを統合する:concatenate_datasets()


2つのdatasetをロードする

dataset1 = load_dataset("llm-jp/oasst1-21k-en",split="train")
dataset2 = load_dataset("llm-jp/oasst1-21k-ja",split="train")
dataset1


出力結果〜dataset1とdataset2は同じカラムです。

Dataset({
    features: ['conversations'],
    num_rows: 21164
})


dataset1とdataset2を統合

同じカラムだと簡単に統合できます。

from datasets import concatenate_datasets

dataset3 = concatenate_datasets([dataset1, dataset2])
dataset3

出力結果

Dataset({
    features: ['conversations'],
    num_rows: 42328
})


別のdataset4をロードする。これをdataset3と統合します。

dataset4 = load_dataset("databricks/databricks-dolly-15k",split="train")
dataset4


出力結果〜dataset3とは異なるカラムです。

Dataset({
    features: ['instruction', 'context', 'response', 'category'],
    num_rows: 15011
})


dataset3とdataset4を統合する

ポイントはカラムを統一することです。map()でカラムをあわせます。

# 必要なカラムを統一
dataset3 = dataset3.map(lambda x: {
    'instruction': None,
    'context': None,
    'response': None,
    'category': None,
    'conversations': x['conversations']
    })

dataset4 = dataset4.map(lambda x: {
    'instruction': x['instruction'],
    'context': x['context'],
    'response': x['response'],
    'category': x['category'],
    'conversations': None  
    })


# 2つのデータセットを結合
combined_dataset = concatenate_datasets([dataset3, dataset4])
combined_dataset

出力結果

Dataset({
    features: ['conversations', 'instruction', 'context', 'response', 'category'],
    num_rows: 57339
})

いいなと思ったら応援しよう!

Non
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!