「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以外は「コロナ」を評価できなかった可能性があります。
もちろん、「ネガティブ」にです。
「鬼滅の刃」も評価は、難しいでしょうね。
以上、辞書変更毎の動作確認を説明しました。