nikkie-ftnextの日記

イベントレポートや読書メモを発信

mecab-python3でMeCab.Tagger()初期化時の「[ifs] no such file or directory: /usr/local/etc/mecabrc」に対して、/dev/nullをmecabrcとして指定する

Today(※最近) I learnedシリーズ。
mecab-python3のドキュメントに書いてあります。
https://github.com/SamuraiT/mecab-python3/blob/v1.0.9/README.md#specifying-a-mecabrc

You can specify an empty mecabrc like this:

tagger = MeCab.Tagger('-r/dev/null -d/home/hoge/mydic')

目次

MeCab.Tagger()初期化でRuntimeError

mecabはHomebrewでインストールしたようでした1

% mecab --version
mecab of 0.996

% echo 天気の子 | mecab
天気  名詞,一般,*,*,*,*,天気,テンキ,テンキ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
子 名詞,一般,*,*,*,*,子,コ,コ
EOS
% echo 天気の子 | mecab -d $(mecab-config --dicdir)/mecab-ipadic-neologd
天気の子    名詞,固有名詞,一般,*,*,*,天気の子,テンキノコ,テンキノコ
EOS

Pythonの対話モードにて

>>> import MeCab
>>> tagger = MeCab.Tagger()
Traceback (most recent call last):
  File "/.../.venv/lib/python3.11/site-packages/MeCab/__init__.py", line 137, in __init__
    super(Tagger, self).__init__(args)
RuntimeError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../.venv/lib/python3.11/site-packages/MeCab/__init__.py", line 139, in __init__
    raise RuntimeError(error_info(rawargs)) from ee
RuntimeError:
----------------------------------------------------------

Failed initializing MeCab. Please see the README for possible solutions:

    https://github.com/SamuraiT/mecab-python3#common-issues

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:

    https://github.com/SamuraiT/mecab-python3/issues

issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments:
default dictionary path: None
[ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------

「ERROR DETAILS」にある/usr/local/etc/mecabrcは、マシンにありません。

% ls /usr/local/etc/mecabrc
ls: /usr/local/etc/mecabrc: No such file or directory

mecabrcを指定する。/dev/nullも指定できる!

エラーメッセージにありますが、READMEにこのエラーへの対応は書かれています。
Specifying a mecabrc

(意訳)「error message: [ifs] no such file or directory: /usr/local/etc/mecabrc」を見た場合、mecabrcファイルを指定する必要があります

  • 空の/usr/local/etc/mecabrcを置く(例:touch /usr/local/etc/mecabrc
  • mecabrcの場所を-rで指定する

mecab --helpより

-r, --rcfile=FILE use FILE as resource file

3つ目の対処法として、-r/dev/nullとして空のmecabrcを指定できます。

>>> tagger = MeCab.Tagger('-r/dev/null -d/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd')

-r/dev/nullだけだと「[ifs] no such file or directory: ./dicrc」というエラーに変わりました。
そこでneologd辞書も指定しています。

>>> tagger = MeCab.Tagger('-r/dev/null -d/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd -Owakati')
>>> tagger.parse("天気の子が大好きです").split()
['天気の子', 'が', '大好き', 'です']

追加でpip install unidic-liteでも解決する

READMEなどを読んでいくとpip install unidic-liteでもいけそうに思われました2
Installing a Dictionary

>>> import MeCab
>>> tagger = MeCab.Tagger()

>>> tagger = MeCab.Tagger("-Owakati")
>>> tagger.parse("天気の子が大好きです").split()
['天気', 'の', '子', 'が', '大好き', 'です']

mecabrcを指定した扱いになるってことなんですかね?

終わりに

mecab-python3でMeCab.Tagger()で遭遇した「[ifs] no such file or directory: /usr/local/etc/mecabrc」への対応でした

  • touch /usr/local/etc/mecabrc
  • neologd辞書の環境で、MeCab.Tagger("-r/dev/null -d/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd")と指定
  • 追加でpip install unidic-liteでも解決した

MeCabのラッパーとしてはmecab-python3よりfugashiがオススメされていたり、neologd辞書は更新が止まっていたり3と、この記事の内容はロストテクノロジー感がありますが、学びのアウトプットでした。


  1. ブログを遡ったところ ref: イベントレポート | #pyhack にて旦那と彼氏の間に何があるのかをword2vecに聞いてみました - nikkie-ftnextの日記
  2. neologd辞書はおすすめせずにpip install unidic-liteを案内 https://github.com/SamuraiT/mecab-python3/issues/51#issuecomment-658299727
  3. 更新ストップを取り上げている記事4
  4. neologd辞書の更新が止まったことで、MeCabに代えてSudachiPyがオススメされることの方が多いかもしれません。こちらは辞書もメンテされている認識です