transformersのBertJapaneseTokenizerでMeCabオプション


transformersのBertJapaneseTokenizerでMeCabのオプションを指定する
NEologdを使いたいときとか

やり方

BertJapaneseTokenizerはmecab_kwargsでオプション指定できるが、実際に使っている例があまりなくてわかりづらいので紹介

from transformers import BertJapaneseTokenizer

# 通常のpretrainedモデル呼び出し
tokenizer = BertJapaneseTokenizer.from_pretrained(
    "cl-tohoku/bert-base-japanese-whole-word-masking",
    do_subword_tokenize=False)

# MeCabオプションを指定したいとき
tokenizer2 = BertJapaneseTokenizer.from_pretrained(
    "cl-tohoku/bert-base-japanese-whole-word-masking",
    do_subword_tokenize=False,
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d /path/to/dic"})
# ※辞書を差し替えたいときは必ず"mecab_dic": Noneを指定する(デフォルトではipadicが読み込まれる)

# 自分で用意したボキャブラリーを使いたいとき
tokenizer3 = BertJapaneseTokenizer(
    "/path/to/vocab.txt",
    do_subword_tokenize=False,
    word_tokenizer_type="mecab",
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d /path/to/dic"})

上記の方法でNEologdを指定してみる

>>> tokenizer.tokenize('ガッキー逃げ恥婚')
['ガッキー', '逃げ', '恥', '婚']
>>>
>>>
>>> tokenizer2.tokenize('ガッキー逃げ恥婚')
['ガッキー', '逃げ恥', '婚']

NEologdを使った方は逃げ恥が一単語として認識されていることがわかります

注意点

NEologdを使いたいときなど、dicを指定するときは"mecab_dic": Noneを指定する必要があります
これはソースでいうとこの辺が理由で、MecabTokenizerクラスはmecab_dic引数にデフォルトでipadicが入っていて、明示的にNoneを指定しないと自動的に-dオプションが指定されてしまうからです

その他

MeCabのオプションはもちろん-dだけでなく-uとか他のオプションも使えるので、いろいろよしなに指定したらいいと思います
内部的にはここで指定したオプションを受け取っているのはMeCabラッパのfugashiのGenericTaggerなので、fugashiのGenericTaggerで受け取れるものなら使えるのではないかと
(試してないけど、wrapperオプションとかもいけるのかもね?)