HuggingFace Tokenizers 0.10 : メモリから訓練 (python)

HuggingFace Tokenizers 0.10 : メモリから訓練 (python) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/01/2021 (Python v0.10.2)

* 本ページは、HuggingFace Tokenizers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料 Web セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。
スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
クラスキャットは人工知能・テレワークに関する各種サービスを提供しております :

人工知能研究開発支援 人工知能研修サービス テレワーク & オンライン授業を支援
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。)

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com  ;  WebSite: https://www.classcat.com/  ;  Facebook

 

HuggingFace Tokenizers : メモリから訓練 (python)

クイックツアー では、テキストファイルを使用してトークナイザーをどのように構築して訓練するかを見ましたが、実際には任意の Python Iterator を利用できます。このセクションではトークナイザーを訓練する幾つかの異なる方法を見ます。

下でリストされる総てのサンプルについて、次のように構築される、同じ TokenizerTrainer を使用します :

from tokenizers import Tokenizer, models, normalizers, pre_tokenizers, decoders, trainers

tokenizer = Tokenizer(models.Unigram())
tokenizer.normalizer = normalizers.NFKC()
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel()
tokenizer.decoders = decoders.ByteLevel()

trainer = trainers.UnigramTrainer(
    vocab_size=20000,
    initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),
    special_tokens=["<PAD>", "<BOS>", "<EOS>"],
)

このトークナイザーは Unigram モデルに基づきます。それは NFKC Unicode 正規化メソッドを使用して入力を正規化する処理を行ない、そして対応するデコーダとともに ByteLevel 事前トークナイザーを使用します。

ここで使用されるコンポーネントのより多くの情報については、ここ を確認できます。

 

最も基本的な方法

既に多分推測したように、トークナイザーを訓練する最も簡単な方法はリストを使用することによります :

# First few lines of the "Zen of Python" https://www.python.org/dev/peps/pep-0020/
data = [
    "Beautiful is better than ugly."
    "Explicit is better than implicit."
    "Simple is better than complex."
    "Complex is better than complicated."
    "Flat is better than nested."
    "Sparse is better than dense."
    "Readability counts."
]
tokenizer.train_from_iterator(data, trainer=trainer)

Easy, right? ここで iterator として動作する任意のものを利用できます、それはリスト、タプル、あるいは np.Array です。それが文字列を提供する限りどんなものでも動作します。

 

データセット・ライブラリを使用する

世の中に存在する多くのデータセットの一つにアクセスする素晴らしい方法は データセット・ライブラリを利用することです。その詳細については、こちらの公式ドキュメント を確認するべきです。

データセットをロードすることから始めましょう :

import datasets

dataset = datasets.load_dataset(
    "wikitext", "wikitext-103-raw-v1", split="train+test+validation"
)

次のステップはこのデータセットに渡り iterator を構築することです。これを行なう最も簡単な方法は多分 generator を使用することです :

def batch_iterator(batch_size=1000):
    for i in range(0, len(dataset), batch_size):
        yield dataset[i : i + batch_size]["text"]

ここで分かるように、より改良された効率性のためにそれらに渡り一つ一つ iterate する代わりに、訓練するために使用されるサンプルのバッチを実際には提供できます。それにより、ファイルから直接訓練する間に得られたものと非常に類似したパフォーマンスを期待できます。

iterator の準備ができれば、訓練を始める必要があるだけです。進捗バーの外観を改良するため、データセットの全長を指定できます :

tokenizer.train_from_iterator(batch_iterator(), trainer=trainer, length=len(dataset))

And that’s it!

 

gzip ファイルを使用する

Python 内の gzip ファイルは iterator として使用できますので、そのようなファイル上で訓練することは非常に簡単です。

import gzip

with gzip.open("data/my-file.0.gz", "rt") as f:
    tokenizer.train_from_iterator(f, trainer=trainer)

今は複数の gzip ファイルから訓練することを望んだ場合、それはそれほど難しくはありません :

files = ["data/my-file.0.gz", "data/my-file.1.gz", "data/my-file.2.gz"]

def gzip_iterator():
    for path in files:
        with gzip.open(path, "rt") as f:
            for line in f:
                yield line

tokenizer.train_from_iterator(gzip_iterator(), trainer=trainer)

And voilà!

 

以上