MeCabをpythonで利用していて辞書指定で引っかかったことがあったので備忘録として残しておく。
1つの処理の間でユーザ辞書を切り替える必要があったことが背景になっている。
mecabの公式ページは以下。
https://taku910.github.io/mecab/
大体のことはここに書いてあるが、懇切丁寧に書いてあるわけではないので別途調べる必要がある。
mecabはWindowsを前提に作られているわけではなく、調べて出てくるドキュメントもWindows向けのものが少なかった印象。
結論
パスは¥
や\
で区切らずにせずに/
で区切れ
辞書へのパス指定時にスペースを入れるな
※追記※
mecab-python3の場合はスペースがあってもクォーテーションで囲えば正常に動作します。
pip install mecab-python3
@palm23さん教えていただきありがとうございました。
解説
ここではpythonコードから辞書指定をするときについて解説する。
ちなみにコマンドラインから実行する場合はスペースがあっても問題ない。
ただ、スペースで区切りとみなされるためパス全体を""
で覆うこと
# システム辞書指定
mecab -d "C:\Program Files (x86)\MeCab\dic\ipadic"
# ユーザ辞書指定
mecab -u "C:\Program Files (x86)\MeCab\dic\ipadic\user.dic"
※ユーザ辞書は自分が作成して置いたパスを指定する(作成方法は別途調べてください。)
pythonコードから辞書指定
辞書指定するときにはTagger作成時に引数に渡す必要がある
import MeCab
tagger = MeCab.Tagger("-d [システム辞書へのパス]")
tagger = MeCab.Tagger("-u [ユーザ辞書へのパス]")
Windowsの場合、多分C:\Program Files (x86)\MeCab\dic\ipadic
に辞書があるはず。(x86じゃない方の可能性も)
それを上記の[辞書へのパス]に書くのだが2つ注意点がある。
- パスは
/
で区切らなくてはならない - スペースを入れてはならない
どちらもMeCabの仕様ではなくpythonの仕様によるもの。
パスは/
で区切らなくてはならない
文字列のダブルクォーテーション""
の中で¥
や\
を使うとエスケープ文字とみなされてしまう。
import MeCab
tagger = MeCab.Tagger("-d C:\Program Files (x86)\MeCab\dic\ipadic")
tagger = MeCab.Tagger("-u C:\Program Files (x86)\MeCab\dic\ipadic\user.dic")
ではなく
tagger = MeCab.Tagger("-d C:/Program Files (x86)/MeCab/dic/ipadic")
tagger = MeCab.Tagger("-u C:/Program Files (x86)/MeCab/dic/ipadic/user.dic")
※ユーザ辞書は自分が作成して置いたパスを指定する(作成方法は別途調べてください。)
これはVSCodeなどのエディタを使っていればエラーとして表示してくれるためすぐに気付ける。
※追記※
他の解決策として
r"-d C:\Program Files (x86)\MeCab\dic\ipadic"
のように文字列の前にrをつけることで¥
や\
のままでも問題なく動作します。
@palm23さん教えていただきありがとうございました。
スペースを入れてはならない
デフォルトだとC:\Program Files (x86)\MeCab\dic\ipadic
に辞書があると思うが、Program Files (x86)
にスペースが入っているとエラーになる。
辞書指定したいのならば、パスにスペースを含まない別の場所に辞書をコピーし、その辞書を指定する必要がある。
例えばC直下にmecabというフォルダを作成して辞書を配置し、以下のように指定する。
import MeCab
tagger = MeCab.Tagger("-d C:/mecab/ipadic")
tagger = MeCab.Tagger("-u C:/mecab/ipadic/user.dic")
※スペースがあるのがだめならクォーテーションで囲んでやればいいのでは?
tagger = MeCab.Tagger("-d 'C:/Program Files (x86)/MeCab/dic/ipadic'")
残念ながらこれでもエラーになる。
まとめ
mecabに限らず、pythonでパスを指定するときは、
- パスは
¥
や\
で区切らずにせずに/
で区切れ(もしくはr""
) - 辞書へのパス指定時にスペースを入れるな(もしくはmecab-python3を使う)