この記事では、RoBERTaの日本語モデルを利用する方法を解説しています。
本記事の内容
- RoBERTa日本語モデルの利用に必要なモノ
- RoBERTa日本語モデル
- Transformers
- SentencePiece
- RoBERTa日本語モデルの動作確認
それでは、上記に沿って解説していきます。
RoBERTa日本語モデルの利用に必要なモノ
BERTは、自然言語処理における革命児と言われることがあります。
そして、そのBETRを改良したモノがRoBERTaになります。
専門的なことは、他の記事などで調べてください。
この記事では、RoBERTaを日本語で利用することがゴールと言えます。
利用するためには、様々な方法が存在します。
おそらく、その中でもかなり簡単な方法になるでしょう。
そのために必要となるのは、以下。
- RoBERTa日本語モデル
- Transformers
- SentencePiece
もちろん、大前提としてPythonを動かす環境は必要となります。
個人的には、PyCharmが現状では最高なIDEだと評価しています。
上記で挙げた必要なモノを下記で説明していきます。
RoBERTa日本語モデル
RoBERTaの日本語モデルは、複数存在しています。
ここでは、rinna社が開発したRoBERTaの日本語モデルを取り上げます。
japanese-roberta-base
https://huggingface.co/rinna/japanese-roberta-base
rinna社のサイトでは、次のように記載されています。
2021年になって、rinna社はGPT-2用の日本語モデルも公開しています。
日本語の自然言語処理では、 rinna社はその存在感を増しています。
その意味では、RoBERTa日本語モデルは安心して使い続けることができそうです。
そして、簡単に利用できます。
そのためには、Transformersが必要となります。
Transformers
Transformersについては、次の記事で説明しています。
上記を参考にして、Transformersのインストールを行います。
また、機械学習のフレームワークにはPyTorchをおススメします。
そのことも、上記記事内で説明しています。
あと、RoBERTa日本語モデルはSentencePieceをトークナイザーとして利用しています。
そのため、RoBERTa日本語モデルの利用の際にもSentencePieceが必要となります。
SentencePiece
SentencePieceについては、次の記事で解説しています。
上記を参考にして、SentencePieceのインストールを行います。
これで、TransformersとSentencePieceをインストールした状態のはずです。
この時点で、インストール済みのパッケージを確認しておきます。
>pip list Package Version ------------------ ------------ certifi 2021.5.30 charset-normalizer 2.0.4 click 8.0.1 colorama 0.4.4 filelock 3.0.12 huggingface-hub 0.0.12 idna 3.2 joblib 1.0.1 numpy 1.21.2 packaging 21.0 Pillow 8.3.1 pip 21.2.4 pyparsing 2.4.7 PyYAML 5.4.1 regex 2021.8.21 requests 2.26.0 sacremoses 0.0.45 sentencepiece 0.1.96 setuptools 57.4.0 six 1.16.0 tokenizers 0.10.3 torch 1.9.0+cu111 torchaudio 0.9.0 torchvision 0.10.0+cu111 tqdm 4.62.2 transformers 4.9.2 typing-extensions 3.10.0.0 urllib3 1.26.6
Transformersで必要となる機械学習フレームワークは、PyTorchをインストール済みです。
正確に言うと、GPU版のPyTorchになります。
PyTorchのインストールは、次の記事で解説しています。
以上、これでRoBERTa日本語モデルを動かす準備が整いました。
次は、RoBERTa日本語モデルの動作確認を行います。
RoBERTa日本語モデルの動作確認
モデルの利用に関して、注意書きがあります。
動作確認は、以下のコードで行います。
上記の注意書きに関する部分に、【注1】【注2】(コメント)を記載。
import torch from transformers import T5Tokenizer, RobertaForMaskedLM tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base") tokenizer.do_lower_case = True # due to some bug of tokenizer config loading model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base") # original text text = "子供にとって、ゲームは害になるのか?" # prepend [CLS] 【注1】 text = "[CLS]" + text # tokenize tokens = tokenizer.tokenize(text) print(tokens) # mask a token 【注2】 masked_idx = 5 tokens[masked_idx] = tokenizer.mask_token print(tokens) # convert to ids token_ids = tokenizer.convert_tokens_to_ids(tokens) print(token_ids) #exit() # convert to tensor token_tensor = torch.tensor([token_ids]) # get the top 10 predictions of the masked token model = model.eval() with torch.no_grad(): outputs = model(token_tensor) predictions = outputs[0][0, masked_idx].topk(10) for i, index_t in enumerate(predictions.indices): index = index_t.item() token = tokenizer.convert_ids_to_tokens([index])[0] print(i, token)
上記を実行した結果は、以下。
['[CLS]', '▁', '子供', 'にとって', '、', 'ゲーム', 'は', '害', 'になる', 'のか', '?'] ['[CLS]', '▁', '子供', 'にとって', '、', '[MASK]', 'は', '害', 'になる', 'のか', '?'] [4, 9, 2038, 1522, 7, 6, 11, 5596, 367, 1974, 3017] 0 アルコール 1 チョコレート 2 インターネット 3 ゲーム 4 ストレス 5 タバコ 6 ギャンブル 7 おもちゃ 8 スポーツ 9 いじめ
結果を見ればわかりますが、「ゲーム」をマスクしています。
「ゲーム」部分に10個のワードが、候補として挙げられています。
これって、日本語の意味を解釈していないとできません。
ここでは、子供にとって「害」になりえるモノだと判定されるワードになりますね。
なお、マスクする位置は以下で指定しています。
# mask a token 【注2】 masked_idx = 5
「ゲーム」のindex(0スタート)が、5という意味になります。
文章を変更したい場合は、以下を変更します。
# original text text = "子供にとって、ゲームは害になるのか?"
同時に、「masked_idx」も変更する必要があります。
以上、RoBERTa日本語モデルの動作確認について説明しました。