見出し画像

Huggingface Transformers 入門 (9) - 日本語のマスクトークンの予測

「Huggingface Transformers」による日本語のマスクトークンの予測方法をまとめました。

前回

1. Huggingface Transformers

「Huggingface Transformers」は「自然言語理解」と「自然言語生成」の最先端の汎用アーキテクチャ(BERT、GPT-2など)と何千もの事前学習済みモデルを提供するライブラリです。

今回は以下の事前学習済みモデルを使います。

このモデルの特徴は、次のとおりです。

・日本語版Wikipediaで学習。
・オリジナルのBERTと同じ構成で、インスタンスあたりのトークン数は512、バッチあたりのインスタンス数は256、学習ステップ数は1M。
・4種類の異なるトークン化アルゴリズムを用いてモデルを学習。

提供されているモデルは、次のとおりです。

・BERT-base_mecab-ipadic-bpe-32k.tar.xz (2.1GB)
 MeCabでトークン化後、WordPieceでサブワードで分割。
・BERT-base_mecab-ipadic-bpe-32k_whole-word-mask.tar.xz (2.1GB)
 MeCabでトークン化後、WordPieceでサブワードで分割。Whole Word Maskingを有効化。
・BERT-base_mecab-ipadic-char-4k.tar.xz (1.6GB)
 MeCabでトークン化後、文字で分割。
・BERT-base_mecab-ipadic-char-4k_whole-word-mask.tar.xz (1.6GB)
 MeCabでトークン化後、文字で分割。Whole Word Maskingを有効化。

「Whole Word Masking」は、事前学習時に単語単位でマスクするかどうかを決めて、マスクする単語に対応するサブワードを全てマスクする方式で、通常版より精度が高くなります。

2. インストール

「Huggingface Transformers」のインストール方法は、次のとおりです。

# Huggingface Transformersのインストール
!pip install transformers['ja']

3. マスクトークンの予測

マスクトークンを予測するコードは、次のとおりです。

import torch
from transformers import AutoTokenizer, AutoModelForMaskedLM

# トークナイザーとモデルの準備
tokenizer = AutoTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
model = AutoModelForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

# 入力テキストのエンコード
input_ids = tokenizer.encode(f'吾輩は{tokenizer.mask_token}である。名前はまだ無い。', return_tensors='pt')
print('input_ids:', tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))

# マスクインデックスの取得
masked_index = torch.where(input_ids == tokenizer.mask_token_id)[1].tolist()[0]
print('masked_index:', masked_index)

# マスクトークンの予測
result = model(input_ids)
pred_ids = result[0][:, masked_index].topk(5).indices.tolist()[0]
for pred_id in pred_ids:
    output_ids = input_ids.tolist()[0]
    output_ids[masked_index] = pred_id
    print(tokenizer.decode(output_ids))
input_ids: ['[CLS]', '吾', '##輩', 'は', '[MASK]', 'で', 'ある', '。', '名前', 'は', 'まだ', '無い', '。', '[SEP]']
masked_index: 4
[CLS] 吾輩 は 猫 で ある 。 名前 は まだ 無い 。 [SEP]
[CLS] 吾輩 は 犬 で ある 。 名前 は まだ 無い 。 [SEP]
[CLS] 吾輩 は 人間 で ある 。 名前 は まだ 無い 。 [SEP]
[CLS] 吾輩 は 狼 で ある 。 名前 は まだ 無い 。 [SEP]
[CLS] 吾輩 は 私 で ある 。 名前 は まだ 無い 。 [SEP]

次回



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