今日は以前、自分が入っていた自然言語処理案件で利用していたBERTを使ってみます。必要なライブラリなどのインストールから、日本語版事前学習済みモデルを読み込んでMasked Language Modelを試しに使ってみようかと思います。
必要なライブラリのインストール
transformers
今回はHuggingFaceが作ったPyTorch版BERTを使っていきます(個人的にGoogleがGitHubで公開しているTensorflow版のものよりPyTorchのが使い慣れているためです)。
$ pip install transformers
PyTorch(CPU用)
上記で述べた通り、今回はPyTorch版を使うので、PyTorchそのものがインストールされている必要があります。PyTorchをインストールする際はこちらのサイトを参考にインストールしてください。方法は簡単で自分の使いたい環境を選択していくと、インストールコマンドを表示してくれます。
表示されている通りにコマンドを実行します。なお、今回はGPUを使わずにCPU用のPyTorchをインストールしています(CUDA=None)。GPU用のものをmacOSで利用する場合、少々複雑な作業が必要になりますが今回は割愛させてください(おそらく大半の方のmacOSにはCUDAはないはず…)。
pip install torch torchvision torchaudio
その他
日本語版BERTの形態素解析に使うライブラリなどをインストールしておきます。
pip install fugashi ipadic
日本語版事前学習済みモデルのダウンロード
こちらのGitHubで公開されているのでダウンロードし、任意のディレクトリに置いて、ファイルを展開します。今回はBERT-base_mecab-ipadic-bpe-32k.tar.xzをダウンロードしました。
形態素解析
まずBertJapaneseTokenizerを使ってみます。pathにダウンロードしてきた日本語版事前学習済みモデルのフォルダを指定することで利用できるはずです。形態素解析後にtokenがidに変換されるところまでを確認します。今回、tokenizeやspecial tokenの説明は極力省かせて頂きます(結構長くなってしまうので)。また別記事にて、それらについては解説しようと思います。
from transformers import BertJapaneseTokenizer
path = './BERT-base_mecab-ipadic-bpe-32k'
tokenizer = BertJapaneseTokenizer.from_pretrained(path, word_tokenizer_type='mecab')
tokenizer.encode(text='東京五輪で野球を観戦する。', add_special_tokens=False)
# [391, 8111, 12, 1201, 11, 14847, 34, 8]
Masked Language Model
日本語版事前学習済みモデルを読み込んで、Masked Language Modelを試してみます。まず入力値とモデルを用意します。[MASK]の部分を今回は予測させます。
import torch
from transformers import BertForMaskedLM
path = './BERT-base_mecab-ipadic-bpe-32k' # 先ほどと同じ
model = BertForMaskedLM.from_pretrained(path)
input_ids = tokenizer.encode(text='東京五輪で[MASK]を観戦する。', add_special_tokens=False)
input_ids_tensor = torch.tensor([input_ids])
モデルに入力値を入れて、予測結果上位5件を出力させてみます。
with torch.no_grad():
outs = model(input_ids_tensor)
predictions = outs[0][0, 3].topk(5) # 3はMASKトークンの位置(id=4)
for i, v in enumerate(predictions.indices, 1):
index = v.item()
token = tokenizer.convert_ids_to_tokens([index])[0]
print(i, token)
# 1 野球
# 2 サッカー
# 3 バスケットボール
# 4 スポーツ
# 5 ラグビー
今回は日本語版BERTの導入して動かしてみました。次は日本語版BERTのファインチューニングしたり、使い方の説明とかできればいいかなと思っています。