BertJapaneseTokenizerで辞書を指定・変更する

BertJapaneseTokenizerで辞書を指定・変更する データ分析

「BertJapaneseTokenizerで辞書を変更したい」
「Transformersによる感情分析でIPAdic以外の辞書を使いたい」

このような場合には、この記事が参考になります。

本記事の内容

  • BertJapaneseTokenizerで辞書を指定する方法
  • mecab_dicの設定
  • mecab_optionの設定
  • BertJapaneseTokenizerにおける辞書指定の動作確認

それでは、上記に沿って解説していきます。

BertJapaneseTokenizerで辞書を指定する方法

BertJapaneseTokenizerで辞書を指定する方法は、以下。

  • mecab_dicの設定
  • mecab_optionの設定

これらの値は、次のようにして設定します。

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": "ipadic", "mecab_option": None})

引数mecab_kwargsは、任意です。
設定しなくても、上記の関数は機能します。

そのため、次のようにサンプルコードではコーディングされています。

tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

指定しているのは、学習済みモデルのみです。
学習済みモデルは、必須の引数となります。

なお、mecab_dicよりもmecab_optionの方が優先されます。
つまり、両方とも設定した場合はmecab_optionの設定が勝つということです。

辞書を指定するには、mecab_dicかmecab_optionを利用することがわかりました。
それでは、下記で実際にどのような値を設定するのかを確認しましょう。

mecab_dicの設定

mecab_dicに設定できる値は、以下の3つです。

  • ipadic
  • unidic_lite
  • unidic

そして、デフォルトではipadicが設定されています。
つまり、辞書指定しない場合はipadicを辞書として利用することになります。

mecab_dicに設定した値が有効になるには、各ライブラリをインストールしておく必要があります。
各値について、説明していきます。

ipadic

ipadicは、IPAdic(IPA辞書)を指定することになります。
ipadicについては、次の記事で解説しています。

ipadicを設定して、ipadicが未インストールの場合は次のエラーが出ます。

"The ipadic dictionary is not installed. " 
"See https://github.com/polm/ipadic-py for installation."

unidic_lite

unidic_liteは、UniDicの軽量版を指定することになります。

BertJapaneseTokenizerは、fugashiの利用が前提です。
fugashiをインストールしていないと、次のエラーが表示されます。

"You need to install fugashi to use MecabTokenizer. " 
"See https://pypi.org/project/fugashi/ for installation."

fugashiについては、次の記事で説明しています。
同時に、unidic-liteのインストールについても説明しています。

unidic_liteを設定して、unidic-liteが未インストールの場合は次のエラーが出ます。

"The unidic_lite dictionary is not installed. " 
"See https://github.com/polm/unidic-lite for installation."

unidic

unidicは、UniDicを指定することになります。
そして、UniDicはfugashiで推奨されている辞書です。

unidic-liteと同じように、unidicも次の記事で説明しています。

unidicを設定して、unidicが未インストール(辞書も別途ダウンロードが必要)の場合は次のエラーが出ます。

"The unidic dictionary is not installed. " 
"See https://github.com/polm/unidic-py for installation."

まとめ

上記3つの辞書を利用する場合は、mecab_dicの設定だけでOKです。
もちろん、該当するライブラリのインストールは必要となります。

なお、上記の3つ以外の値を設定した場合は、次のエラーが出ます。

Invalid mecab_dic is specified.

以上、mecab_dicの設定について説明しました。
次は、mecab_optionの設定について確認しましょう。

mecab_optionの設定

mecab_optionには、mecabコマンド設定するオプションを設定することができます。
「mecab -h」で確認できる以下のオプションです。

 -r, --rcfile=FILE              use FILE as resource file 
 -d, --dicdir=DIR               set DIR  as a system dicdir 
 -u, --userdic=FILE             use FILE as a user dictionary 
 -l, --lattice-level=INT        lattice information level (DEPRECATED) 
 -D, --dictionary-info          show dictionary information and exit 
 -O, --output-format-type=TYPE  set output format type (wakati,none,...) 
 -a, --all-morphs               output all morphs(default false) 
 -N, --nbest=INT                output N best results (default 1) 
 -p, --partial                  partial parsing mode (default false) 
 -m, --marginal                 output marginal probability (default false) 
 -M, --max-grouping-size=INT    maximum grouping size for unknown words (default 24) 
 -F, --node-format=STR          use STR as the user-defined node format 
 -U, --unk-format=STR           use STR as the user-defined unknown node format 
 -B, --bos-format=STR           use STR as the user-defined beginning-of-sentence format 
 -E, --eos-format=STR           use STR as the user-defined end-of-sentence format 
 -S, --eon-format=STR           use STR as the user-defined end-of-NBest format 
 -x, --unk-feature=STR          use STR as the feature for unknown word 
 -b, --input-buffer-size=INT    set input buffer size (default 8192) 
 -P, --dump-config              dump MeCab parameters 
 -C, --allocate-sentence        allocate new memory for input sentence 
 -t, --theta=FLOAT              set temparature parameter theta (default 0.75) 
 -c, --cost-factor=INT          set cost factor (default 700) 
 -o, --output=FILE              set the output file name 
 -v, --version                  show the version and exit. 
 -h, --help                     show this help and exit.

ただし、すべてが利用可能かどうかはわかりません。
そして、この中にある「-d」で辞書の場所を指定できます。

具体的には、mecab_optionには次のように設定します。

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": None, "mecab_option": '-d "D:/my_data/mecab/mecab-ipadic-neologd"'})

mecab_optionで辞書指定する場合は、基本的にはmecab_dicはNoneを設定しておきましょう。
両方指定した場合は、mecab_optionでの設定が優先されます。
でも、それは可読性も悪いので、基本的には止めておきます。

なお、上記の例では辞書にmecab-ipadic-NEologdを指定しています。
mecab-ipadic-NEologdに関しては、次の記事でまとめています。

Windowsの場合

Linux・macOSの場合

以上、mecab_optionの設定を説明しました。
最後に、それぞれの辞書を指定した動作を確認します。

BertJapaneseTokenizerにおける辞書指定の動作確認

動作確認を行うために、BertJapaneseTokenizerを利用して感情分析を行います。
辞書により、その結果が実際にどうなるのかを見た方がわかりやすいでしょう。
感情分析については、次の記事を参考にしてください。

利用するコードは、以下。

from transformers import pipeline 
from transformers import AutoModelForSequenceClassification 
from transformers import BertJapaneseTokenizer 
TARGET_TEXT = "コロナの真っ只中で、鬼滅の刃の映画が流行りました。"
model = AutoModelForSequenceClassification.from_pretrained('daigo/bert-base-japanese-sentiment') 
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking') 
nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) 
print(nlp(TARGET_TEXT))

上記を各辞書毎に動作させていきます。

IPAdic(IPA辞書)

上記のコードそのままでよいですが、mecab_kwargsを設定した場合は以下となります。

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": 'ipadic', "mecab_option": None})

実行結果は、以下。

[{'label': 'ネガティブ', 'score': 0.6667430996894836}]

UniDicの軽量版辞書

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": 'unidic_lite', "mecab_option": None})

実行結果は、以下。

[{'label': 'ポジティブ', 'score': 0.8980786800384521}]

UniDic辞書

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": 'unidic', "mecab_option": None})

実行結果は、以下。

[{'label': 'ポジティブ', 'score': 0.8980786800384521}]

mecab-ipadic-NEologd辞書

tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": None, "mecab_option": '-d "D:/my_data/mecab/mecab-ipadic-neologd"'})

実行結果は、以下。

[{'label': 'ネガティブ', 'score': 0.8059654831886292}]

まとめ

UniDicは、軽量版でも通常版でも同じですね。
もっと長い文章だと、異なる結果となるのかもしれません。

辞書によって、ポジティブとネガティブも変わるようです。
これは、ちょっと驚きました。

せいぜいscoreが変わるぐらいだろうと思っていましたので。
この結果より、辞書の重要度を改めて認識できました。

おそらく、mecab-ipadic-NEologd以外は「コロナ」を評価できなかった可能性があります。
もちろん、「ネガティブ」にです。
「鬼滅の刃」も評価は、難しいでしょうね。

以上、辞書変更毎の動作確認を説明しました。

タイトルとURLをコピーしました