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]
}
トークナイザーは、次の項目を含む辞書を返します。これらがモデルの入力値になります。
(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列が追加されます。