Mecabでの no such file or directory と format error の解決

# はじめに

Python3環境で Mecab を導入しようとしたところ、以下のようなエラーが発生した。重要なエラー内容は 最後に書かれている ERROR DETAILS の続きにある。

```
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/MeCab/__init__.py", line 133, 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 "/workspaces/OpenCV/mecab.py", line 5, in <module>
    tagger = MeCab.Tagger()
  File "/usr/local/lib/python3.10/dist-packages/MeCab/__init__.py", line 135, 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: 
[ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------
```

このエラーを解決したところ、さらに以下のようなエラーが発生した。

```
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/MeCab/__init__.py", line 133, 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 "/workspaces/OpenCV/mecab.py", line 5, in <module>
    tagger = MeCab.Tagger()
  File "/usr/local/lib/python3.10/dist-packages/MeCab/__init__.py", line 135, 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: 
[pos != std::string::npos] format error: 
----------------------------------------------------------
```

本記事は、これら2つのエラーを解消した方法を記したものである。

# 環境
OS: Windows 10
Ubuntu: 22.04
Python: 3.7.10
MeCab: 0.996

Docker で Ubuntu 環境を構築し、実行している。
なお、Mecab のインストールにあたって、64bit 版の 非公式 Mecab インストーラーを使用しており、`pip install mecab-python3`コマンドより、Python3 環境で動作する Mecab を利用している。
非公式インストーラーについては、以下のリンクを参照。
- [MeCab 0.996 64bit version (GitHub リンク)](https://github.com/ikegami-yukino/mecab/releases)
- [Windows用の64-bit版MeCabを簡単にインストールする (インストーラー作成者 @yukinoi(Yukino Ikegami) 氏本人執筆の Qiita 記事)](https://qiita.com/yukinoi/items/5dfc674c040f6d81a8a1)

# 原因
パスが通っていないことと、MeCab の動作に必要な辞書をインストールできていなかったことであった。


# 解決法 (It works for me)

## no such file or directory について

```
------------------- ERROR DETAILS ------------------------
arguments: 
[ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------
```

このエラーの解決法は、パスを通すことであった。
私は Docker 環境で実行していたため、ビルドと同時にパスを通すことができるよう、`ENV MECABBC <MeCabフォルダのパス>/etc/mecabrc` という記述を追加した。
環境変数 MECABBC は固定で、その環境変数が示すパスを変えている。Docker 環境下ではなく、ターミナルからパスを通すには、`export MECABBC=<MeCabフォルダのパス>/etc/mecabrc` というコマンドを実行すると環境変数を上書きし、パスを通すことができる。
また、私の場合は user/local/etc/mecabrc というパスが表示されていたが、他サイトを見たところ、当然ながら個人の環境によって変化するため、エラー内容のパスはこの限りではない。

## format error について

```
------------------- ERROR DETAILS ------------------------
arguments: 
[pos != std::string::npos] format error: 
----------------------------------------------------------
```

このエラーの解決法は、MeCab の辞書として unidic-lite をインストールすることである。
Dockerfile に `RUN pip install unidic-lite` の記述を追加し、unidic-lite をインストールすることで解決した。
別記事に、「mecab-python3 には対応する辞書が既にインストールされている」という記述があったが、私の場合はうまく動作しなかった。考えうる原因としては、インストールされているが上の問題のようにパスが通っていないか、本当にインストールされていないか。
今回は、辞書を別にインストールすることでエラーが解消し、かつその辞書で結果が満足のいくものであったため、これをもって解決とした。

# おわりに
no such file or directory については、調査したところ、大半がパスが通っていないことが原因であった。エラー内容も難しいものではないため、おそらく時間がかかることはあるが解決に至ることが多いだろう。
format error についても同様だが、no such file or directory のエラーの辞書版が出ることもあるようなので、その際は辞書の環境変数を更新するとよいだろう。私が確認した限りでは、unidic-lite では動作したが、unidic では no such file or directory のエラーが発生していた。特に辞書や出力結果にこだわりがなければ、unidic-lite での実行をおすすめする。
また、MeCab/dic 下に ipadic というフォルダがあったため、「mecab-python3 には対応する辞書が既にインストールされている」という記述が正しいことも考えられる。その場合は、IPA辞書にパスを通すことで解決することも予想される。
さらに、インストーラーを実行する際に、文字コードを設定できる。私は UTF-8 でインストールを行った。この設定を変更してインストールすると、可能性は低いが問題が解消するかもしれない。
どちらも実際に私が確認したわけではないため、詳細は各自で調査・検証をしてほしい。

# IPA辞書に対する個人的見解
上で「IPA辞書にパスを通すことで解決することも予想される」と書いたが、IPA辞書の内容を考慮するとおすすめしない。IPA辞書の更新が2007年を最後に更新が止まっているため、「令和」のような、最終更新以降に誕生した単語を正確に分類できない可能性があることと、文字コードが EUC-JP であるため、必要に応じて変換しなければならないことが理由である。
あくまで個人的な見解であるため、IPA辞書がいい、unidic-lite は嫌だという方は、自身の用途にあった辞書を選択してほしい。

# 参考文献
- [mecab-python で no such file or directory: c:\mecab\mecabrc](https://qiita.com/cress_cc/items/6b1db5865741b1c9fe6a)
- [https://github.com/SamuraiT/mecab-python3/issues/55](https://github.com/SamuraiT/mecab-python3/issues/55)
- [【超簡単】WindowsのPythonとMeCabで形態素解析しようぜ！](https://resanaplaza.com/2022/05/07/%E3%80%90%E8%B6%85%E7%B0%A1%E5%8D%98%E3%80%91windows%E3%81%AEpython%E3%81%A8mecab%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%81%97%E3%82%88%E3%81%86%E3%81%9C%EF%BC%81/#toc4)
- [MeCabのラッパーであるmecab-python3のインストール](https://self-development.info/mecab%E3%81%AE%E3%83%A9%E3%83%83%E3%83%91%E3%83%BC%E3%81%A7%E3%81%82%E3%82%8Bmecab-python3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
- [2022年最新版 Python + mecab の周辺事情](https://techtekt.persol-career.co.jp/entry/tech/220614_01)
- [【発見】exportコマンドの使い方｜実例付きで徹底解説](https://itc.tokyo/linux/export-command/)
- [Mecab辞書、ipadicとneologdについてのメモ](https://eieito.hatenablog.com/entry/2020/03/04/093000)