Google Colaboratoryにおいて、BertJapaneseTokenizerでmecab ipadic-NEologdを使う


目的

BertJapaneseTokenizerではmecabが使われており、デフォルトでipadic辞書が指定されています。

本稿はより新語や固有表現に強いNEologdを辞書に指定する方法です。
なお、Google Colaboratoryで実行すること前提としています。

まぁぶっちゃけ備忘録です。

インストール

bertとMeCabのインストールを行います。

bertのインストール

!pip install transformers
!pip install fugashi ipadic

fugashiとipadicはBertJapaneseTokenizerで使用します。

投稿時のversionはそれぞれ
transformers == 4.10.2
fugashi == 1.1.1
ipadic == 1.0.0

MeCabのインストール

MeCabをインストール

!apt install aptitude swig
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3

mecab-ipadic-neologdをダウンロード

!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a

colabではパスが違うとエラーが出てしまうのでパスを指定

!ln -s /etc/mecabrc /usr/local/etc/mecabrc

投稿時のversionは
mecab-python3 == 1.0.3

NEologdへパスを通す

import subprocess

cmd='echo `mecab-config --dicdir`"/mecab-ipadic-neologd"'
path_neologd = (subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True).communicate()[0]).decode('utf-8')

実行

以上でbertとmecabのインストールは完了しているので実際に機能しているか実行してみようと思います。

import torch
from torch.utils.data import DataLoader
from transformers import BertJapaneseTokenizer, BertForSequenceClassification
import MeCab

デフォルトのBertJapaneseTokenizer

text = "機械学習"
tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
encoded_input = tokenizer(text)
encoded_input['input_ids']
print(tokenizer.decode(encoded_input["input_ids"][1]))
print(tokenizer.decode(encoded_input["input_ids"][2]))
[2, 2943, 4293, 3]
機 械
学 習

デフォルトのipadicでは機械学習という単語は登録されておらず、「機械」「学習」と分割されます。

辞書にNEologdを追加したBertJapaneseTokenizer

text = "機械学習"
tokenizer = BertJapaneseTokenizer.from_pretrained( 
    'cl-tohoku/bert-base-japanese-whole-word-masking', 
    mecab_kwargs={"mecab_dic": None, "mecab_option": "-d {0}".format(path_neologd)})
encoded_input['input_ids']
print(tokenizer.decode(encoded_input["input_ids"][1]))
print(tokenizer.decode(encoded_input["input_ids"][2]))
print(tokenizer.decode(encoded_input["input_ids"][3]))
[2, 2943, 28519, 29320, 3]
機 械
# # 学
# # 習

機械学習として単語が取り出せました。

指定されている変数の詳細は引用をみてください。

引用

Google Colaboratory で、NEologd 辞書 で、MeCab を 使う(Python)
mecab-python3やtransformersのBertJapaneseTokenizerで辞書を指定する
BertJapaneseTokenizerで辞書を指定・変更する