見出し画像

HuggingFace Datasets の使い方

「HuggingFace Datasets」の主な使い方をまとめました。

1. HuggingFace Datasets

「HuggingFace Datasets」は、自然言語処理などのデータセットに簡単アクセスおよび共有するためのライブラリです

2. インストール

「Google Colab」での「HuggingFace Datasets」のインストール手順は、次のとおりです。「HuggingFace Transformers」もトークン化で使うため、インストールしています。

# パッケージのインストール
!pip install datasets transformers

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

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

データセットの読み込み手順は、次のとおりです。

(1) データセットの読み込み。
今回は、データセット「kunishou/databricks-dolly-15k-ja」を読み込んでいます。

from datasets import load_dataset

# データセットの読み込み
dataset = load_dataset("kunishou/databricks-dolly-15k-ja")

# データセットの確認
dataset
DatasetDict({
    train: Dataset({
        features: ['output', 'category', 'index', 'input', 'instruction'],
        num_rows: 15015
    })
})

戻り値は、「DatasetDict」です。

3-2. データセットのサブセットの読み込み

データセットは、「train」「validation」「test」などのサブセットを持ちます。データセットのサブセットの読み込み手順は、次のとおりです。

(1) データセットのサブセットの確認。

from datasets import get_dataset_split_names

# サブセット一覧の取得
get_dataset_split_names("kunishou/databricks-dolly-15k-ja")
['train']

(2) データセットのサブセットの読み込み。

from datasets import load_dataset

# データセットのサブセットの読み込み
dataset = load_dataset("kunishou/databricks-dolly-15k-ja", split="train")

# データセットの確認
dataset
Dataset({
    features: ['output', 'category', 'index', 'input', 'instruction'],
    num_rows: 15015
})

戻り値は「Dataset」です。

4. データセットの操作

4-1. ソート

データセットの行をソートするには、sort()を使います。
ソートの手順は、次のとおりです。

(1) データセットのinstruction列の確認。
先頭10行のみ確認してます。

# データセットの確認
dataset["instruction"][:10]
['ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
 '魚の種類はどっち?イコクエイラクブカとロープ',
 'ラクダはなぜ水なしで長く生きられるのか?',
 'アリスの両親には3人の娘がいる:エイミー、ジェシー、そして三女の名前は?',
 '小森田友明はいつ生まれたの?',
 'ステイルメイトの時に、私の方が多くの駒を持っていたら、私の勝ちですか?',
 'ロラパルーザについての参考文章が与えられ、どこで行われ、誰が始めたのか、何なのか?',
 '国連に本部を建てるためにニューヨークの土地を寄付したのは誰?',
 'スマホが人間に悪い理由',
 'ジョン・モーゼス・ブローニングとは何者ですか?']

(2) データセットのinstruction列をソートして確認。

# データセットのソート
sorted_dataset = dataset.sort("instruction")

# データセットの確認
sorted_dataset["instruction"][:10]
['"Scandoval "とは?',
 '"The Day the Music Died "とは、どのアーティストの悲劇的な死を指すのか?',
 '"We can do it "のスローガン/キャッチフレーズ - 誰が作ったのか?',
 '"William Bowery "は誰のペンネームなのか?',
 '"X-ファイル "に登場する女性キャラクターをいくつか挙げてください。',
 '"woke "とは何か、なぜこれほどまでに議論を呼んでいるのか?',
 '"woman "という単語について、パラグラフを書く。',
 '"スカリー効果 "とは何ですか?',
 '"ソーシャル・ディスタンシング "とは、安全な距離を保ちながら',
 '"トーマス・E・リックス "の「第一原理」についてはどのようにお考えでしょうか?']

ソートされてることがわかります。

4-2. シャッフル

データセットの行をシャッフルするには、shuffle()を使います。
シャッフルの手順は、次のとおりです。

(1) データセットのinstruction列の確認。

# データセットの確認
dataset["instruction"][:10]
['ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
 '魚の種類はどっち?イコクエイラクブカとロープ',
 'ラクダはなぜ水なしで長く生きられるのか?',
 'アリスの両親には3人の娘がいる:エイミー、ジェシー、そして三女の名前は?',
 '小森田友明はいつ生まれたの?',
 'ステイルメイトの時に、私の方が多くの駒を持っていたら、私の勝ちですか?',
 'ロラパルーザについての参考文章が与えられ、どこで行われ、誰が始めたのか、何なのか?',
 '国連に本部を建てるためにニューヨークの土地を寄付したのは誰?',
 'スマホが人間に悪い理由',
 'ジョン・モーゼス・ブローニングとは何者ですか?']

(2) データセットのinstruction列をシャッフルして確認。

# データセットのシャッフル
shuffled_dataset = dataset.shuffle(seed=42)

# データセットの確認
shuffled_dataset["instruction"][:10]
['RELXはどのような株価指数に属しているのですか?',
 'サンフランシスコの自由な午後は何をすればいいのでしょうか?',
 '愛犬と一緒にアメリカからカナダへ旅行することはできますか?',
 'バーターとは?',
 'ハンロンのカミソリに関する参考テキストが与えられたとき、その格言がよく知られるようになったのはいつ頃か。',
 'ミトコンドリアマトリックスとは?',
 'IBJJFに関する参考文献がある場合、IBJJが主催する2つの大会と、これらの大会で使用されているルールセットを提示する。',
 '子供たちにプラクティス・ベースド・ラーニングを浸透させるためには、どのような方法があるのでしょうか。',
 'コンバーチブルを買うべきか?',
 'DCとMarvelのどちらのユニバースに属するキャラクターですか?アトム、ハンク・ピム']

シャッフルされてることがわかります。

4-3. フィルタリング

データセットの行をフィルタリングするには、select()またはfilter()を使います。
フィルタリングの手順は、次のとおりです。

(1) インデックスのリストをもとにフィルタリング。
select()はインデックスのリストをもとに、データベースの行をフィルタリングします。

# インデックスのリストをもとにフィルタリング
small_dataset = dataset.select([0, 2, 4, 6, 8])

# データセットの確認
small_dataset["instruction"]
['ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
 'ラクダはなぜ水なしで長く生きられるのか?',
 '小森田友明はいつ生まれたの?',
 'ロラパルーザについての参考文章が与えられ、どこで行われ、誰が始めたのか、何なのか?',
 'スマホが人間に悪い理由']

指定したインデックス (0,2,4,6,8) でフィルタリングされてることがわかります。

(2) 条件をもとにフィルタリング。
filter() は、条件をもとに、データベースの行をフィルタリングします。

# 条件をもとにフィルタリング
short_dataset = dataset.filter(lambda example: len(example["instruction"])<10)

# データセットの確認
short_dataset["instruction"][:10]
['分散プリズムとは?',
 '動詞とは何ですか?',
 'リュミエールとは?',
 'LAPRとは?',
 'スミスって誰?',
 'HiFIとは?',
 '凧って何?',
 '投資銀行とは?',
 '橋本章司とは?',
 'SVMとは?']

指定した条件 (instruction列が10文字未満) でフィルタリングされてることがわかります。

4-4. 分割

データセットの行を分割するには、train_test_split()を使います

(1) データセットの確認。

# データの確認
dataset
Dataset({
    features: ['index', 'input', 'output', 'instruction', 'category'],
    num_rows: 15015
})

(2) データセットの分割。

# データセットの分割
dataset.train_test_split(test_size=0.1, shuffle=True, seed=42)
DatasetDict({
    train: Dataset({
        features: ['index', 'input', 'output', 'instruction', 'category'],
        num_rows: 13513
    })
    test: Dataset({
        features: ['index', 'input', 'output', 'instruction', 'category'],
        num_rows: 1502
    })
})

trainとtestで分割されていることがわかります。
戻り値は、「DatasetDict」です。

4-5. 更新

データセットの要素を更新するには、map()を使います。
更新の手順は、次のとおりです。

(1) データセットの要素の更新。
今回は、instruction列にプレフィックス「質問:」を付加します。

# プレフィックスの追加
def add_prefix(example):
    example["instruction"] = "質問:" + example["instruction"]
    return example

# データセットの要素の更新
updated_dataset = dataset.map(add_prefix)

# データセットの確認
updated_dataset["instruction"][:10]
['質問:ヴァージン・オーストラリア航空はいつから運航を開始したのですか?',
 '質問:魚の種類はどっち?イコクエイラクブカとロープ',
 '質問:ラクダはなぜ水なしで長く生きられるのか?',
 '質問:アリスの両親には3人の娘がいる:エイミー、ジェシー、そして三女の名前は?',
 '質問:小森田友明はいつ生まれたの?',
 '質問:ステイルメイトの時に、私の方が多くの駒を持っていたら、私の勝ちですか?',
 '質問:ロラパルーザについての参考文章が与えられ、どこで行われ、誰が始めたのか、何なのか?',
 '質問:国連に本部を建てるためにニューヨークの土地を寄付したのは誰?',
 '質問:スマホが人間に悪い理由',
 '質問:ジョン・モーゼス・ブローニングとは何者ですか?']

データセットの要素が更新されてることがわかります。

4-6. トークン化

トークン化の手順は、次のとおりです。

(1) データセットとトークナイザーの読み込み。
今回は、トークナイザー「cyberagent/open-calm-large」を読み込んでいます。

from transformers import AutoTokenizer
from datasets import load_dataset

# データセットとトークナイザーの読み込み
dataset = load_dataset("kunishou/databricks-dolly-15k-ja", split="train")
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-large")

(2) テキストのトークン化。
instruction列の0行目のテキストをトークン化しています。

# テキストのトークン化
print("text:", dataset[0]["instruction"])
print("tokens:", tokenizer(dataset[0]["instruction"]))
text: ヴァージン・オーストラリア航空はいつから運航を開始したのですか?
tokens: {
    'input_ids': [31105, 260, 286, 5409, 3023, 50768, 332, 13616, 7287, 19910, 32], 
    'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}

トークナイザーは、次の項目を含む辞書を返します。これらがモデルの入力値になります。

・input_ids : テキスト内のトークンを表す数値
・attention_mask : トークンをマスクする必要がないかどうか (0 or 1)

(3) データセットのトークン化。
データセット全体をトークン化する最も速い方法は、map()を使用することです。batched=Trueでバッチにトークナイザーを適用することで、トークン化を高速化できます。

# テキストのトークン化
def tokenization(example):
    return tokenizer(example["instruction"])

# データセットのトークン化
tokenized_dataset = dataset.map(tokenization, batched=True)

# データセットの確認
tokenized_dataset
Dataset({
    features: ['index', 'input', 'output', 'instruction', 'category', 'input_ids', 'attention_mask'],
    num_rows: 15015
})

データセットにinput_ids列とattention_mask列が追加されます。



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