LoginSignup
12
10

More than 3 years have passed since last update.

日本語版BERTをインストールして動かしてみる

Posted at

今日は以前、自分が入っていた自然言語処理案件で利用していたBERTを使ってみます。必要なライブラリなどのインストールから、日本語版事前学習済みモデルを読み込んでMasked Language Modelを試しに使ってみようかと思います。

必要なライブラリのインストール

transformers

今回はHuggingFaceが作ったPyTorch版BERTを使っていきます(個人的にGoogleがGitHubで公開しているTensorflow版のものよりPyTorchのが使い慣れているためです)。

$ pip install transformers

PyTorch(CPU用)

上記で述べた通り、今回はPyTorch版を使うので、PyTorchそのものがインストールされている必要があります。PyTorchをインストールする際はこちらのサイトを参考にインストールしてください。方法は簡単で自分の使いたい環境を選択していくと、インストールコマンドを表示してくれます。

スクリーンショット-2020-11-25-12.53.01.png

表示されている通りにコマンドを実行します。なお、今回は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のファインチューニングしたり、使い方の説明とかできればいいかなと思っています。

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10