[前回] 自然言語処理モデルBERTの検証(1)-予測のお試し
はじめに
前回は、名人から提供されたDockerイメージを実行し、BERTによる予測をさくっと検証しました。
今回は、開発環境を用意し、BERTの実装と予測検証を行ってみます。
開発環境と言っても、Google様から提供されるJupyter notebookクラウド実行環境、
Google Colaboratoryを使用します。
Googleアカウントを持っていれば、無料プランでもPythonによる機械学習を実装できます。
Colabノートブックに、コードを記述し、インタラクティブに実行できます。
検証シナリオ
「一番幸せを感じるのはどんな時か」を予測してみましょう。
東北大学 乾・鈴木研究室から公開された学習済みモデルを使用します。
https://github.com/cl-tohoku/bert-japanese
トークナイザーは、日本語形態素解析器MecabとWordPieceが使用されています。
検証開始
Colabノートブックに、下記コマンドを入力し、実行します。
MeCabのPythonラッパーをインストール
! pip install mecab-python3
transformersライブラリをインストール
! pip install transformers
MeCabを容易に利用するためMecabのPythonラッパーfugashiをインストール
! pip install fugashi
IPA辞書をインストール
! pip install ipadic
学習済みモデルをインポート
import torch
from transformers import BertJapaneseTokenizer
from transformers import BertForMaskedLM
tokenizerのインスタンスを作成
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
modelのインスタンスを作成
model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
トークナイザーで、入力文をtoken idの配列に変換
肝は、mask_token
でマスキングされている予測対象のトークンです。
in_ids = tokenizer.encode(f'''一番幸せを感じるのは{tokenizer.mask_token}をする時だ。''', return_tensors='pt')
print(in_ids)
すると、token idの配列が表示される
tensor([[ 2, 4749, 13215, 11, 11486, 5, 9, 4, 11, 34,
72, 75, 8, 3]])
token idの配列を対応する語彙に変換
print(tokenizer.convert_ids_to_tokens(in_ids[0].tolist()))
出力結果
['[CLS]', '一番', '幸せ', 'を', '感じる', 'の', 'は', '[MASK]', 'を', 'する', '時', 'だ', '。', '[SEP]']
マスキングされたトークンのインデックスを取得
mask_idx = torch.where(in_ids == tokenizer.mask_token_id)[1].tolist()[0]
print(mask_idx)
結果は、
7
モデルを実行し、結果を出力
result = model(in_ids)
predicts = result[0][:, mask_idx].topk(5).indices.tolist()[0]
for predict in predicts:
out_ids = in_ids.tolist()[0]
out_ids[mask_idx] = predict
print(tokenizer.decode(out_ids))
気になっていた予測結果が出ました
[CLS] 一番 幸せ を 感じる の は 仕事 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は キス を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は 恋 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は 食事 を する 時 だ 。 [SEP]
[CLS] 一番 幸せ を 感じる の は ゲーム を する 時 だ 。 [SEP]
「仕事」が、幸せの上位になっています。
楽しく、楽して仕事できたらいいですね。
おわりに
Google Colaboratory環境で、トークナイザーとしてMeCab+WordPieceを用いた、
BERTによる予測を行った結果、幸せの答え(?)を得られたようです。
引き続き、機能・性能両面で検証を進めてまいります。
お楽しみに。