2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自然言語処理モデルBERTの検証(2)-MeCab+WordPiece

Last updated at Posted at 2022-03-28
[前回] 自然言語処理モデルBERTの検証(1)-予測のお試し

はじめに

前回は、名人から提供されたDockerイメージを実行し、BERTによる予測をさくっと検証しました。
今回は、開発環境を用意し、BERTの実装と予測検証を行ってみます。

開発環境と言っても、Google様から提供されるJupyter notebookクラウド実行環境、
Google Colaboratoryを使用します。
Googleアカウントを持っていれば、無料プランでもPythonによる機械学習を実装できます。

Colabノートブックに、コードを記述し、インタラクティブに実行できます。
image.png

検証シナリオ

「一番幸せを感じるのはどんな時か」を予測してみましょう。

東北大学 乾・鈴木研究室から公開された学習済みモデルを使用します。
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による予測を行った結果、幸せの答え(?)を得られたようです。
引き続き、機能・性能両面で検証を進めてまいります。
お楽しみに。

[次回] 自然言語処理モデルBERTの検証(3)-GLUEベンチマーク
2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?