Python+Windows10でMeCabをインストール (2022/4/13)

　形態素解析器として日本語を扱う上で有名なMeCabですが、Windows環境でPythonから使えるようにするのは結構大変でした。Web上に色々な情報が散乱していますが、なかなか上手く行かなかったため、備忘録として残しておきます。
（本記事は2022/4/13時点での最新版である`mecab-python3 1.0.5`に合わせたものとなっています。バージョンが異なる場合、他の方法が必要となる可能性がありますが、予めご了承ください）

　基本的には [MecabをインストールしてPythonから使ってみた](https://own-search-and-study.xyz/2017/06/28/mecab%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97python%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81/#Windows10) の記事を参考に進めます。

# 1. MeCab本体のインストール
　まず、[公式ページ](http://taku910.github.io/mecab/#download) からMeCab本体を入手し、インストールしてください。Windowsの場合は自己解凍型のインストーラーがあるため、それを使えばインストールは簡単です。
　注意点として、Pythonから利用するためには、インストーラーから聞かれる文字コードをUTF-8にしておく必要があるようです。

　その後、`(MeCabインストール先)\bin`ディレクトリを環境変数PATHに設定してください。
　ここでコマンドラインから`mecab`コマンドを叩いて実行できれば成功です。（失敗している場合は、「コマンドが存在しない」的なエラーになります）
　実行すると入力待ち状態になるため、見かけ上は何も表示されません。また、文字コードの問題で、日本語文を入力しても実行結果の出力が文字化けしますが、どちらも問題ありません。
（コマンドから使いたい場合は、`mecab <in.txt >out.txt`など、ファイルを介して入出力すれば正常に使えるはずです）

# 2. mecab-python3のインストール
　普通に`pip install mecab-python3`をするとエラーが発生しました。Windowsの場合は自分でビルドが必要とのことです。
## 2.1. mecab-python3ソースコードの入手と書き換え
　まず、[PyPIのページ](https://pypi.org/project/mecab-python3/#files) からソースコードを入手しましょう。
　ダウンロードしたファイルを適当な場所で展開すると、直下にsetup.pyが見つかります。こちらを開いてください。
　こちらのファイルの177行目に定義されている変数`WIN_MECAB_DIR`に、MeCabのインストール先を指定します。この時、インストールしたフォルダ内`sdk`ディレクトリを指定してください。
（このファイルは参考サイトと異なっています。ご注意ください）

```setup.py
// 175行目から引用
# Windows requires special prep
if os.name == 'nt':
    WIN_MECAB_DIR = r'(MeCabインストール先)\MeCab\sdk' // ここを変更

    include_dirs = [WIN_MECAB_DIR]
    library_dirs = [WIN_MECAB_DIR]
    libraries = ['libmecab']
    data_files = [("lib\\site-packages\\MeCab\\",
                  ["{}\\libmecab.dll".format(WIN_MECAB_DIR)])]
    MECAB_EXTENSION = Extension("MeCab._MeCab",
                                ["src/MeCab/MeCab_wrap.cpp"],
                                libraries=libraries,
                                include_dirs=include_dirs,
                                library_dirs=library_dirs)
    # We use a prebuilt MeCab so this is taken care of
    cmdclass = {}
else:
    // ...
```

## 2.2. MeCab本体側スクリプトの書き換え
　最初にインストールしたMeCabのスクリプトも一部書き換えが必要です。`(MeCabインストール先)\sdk`フォルダにある`mecab.h`をテキストエディタで開いてください。C++のコードですが、内容は理解できなくても大丈夫なのでご安心ください。
　ここで、779行目の後に`virtual void set_result(const char *str) = 0;`という行を追加します。

```C++:mecab.h
// 775行目から
/**
 * Lattice class
 */
class MECAB_DLL_CLASS_EXTERN Lattice {
public:

  virtual void set_result(const char *str)        = 0; //追加

  /**
   * Clear all internal lattice data.
   */
  virtual void clear()              = 0;
// ...
```

## 2.3. dllファイルのコピー
　`(MeCabインストール先)\bin`フォルダには`libmecab.dll`ファイルが存在していますが、インストール段階でうまく参照されません。このファイルを`(MeCabインストール先)\sdk`フォルダにコピーしてください。
　ファイルを移動すると、インストールできても実行の際に失敗してしまうため、`bin`ディレクトリと`sdk`ディレクトリの両方に`libmecab.dll`ファイルがある状態にしてください。

## 2.4. インストール
　以上で準備は完了です。最後に、コマンドラインからインストールを行います。
　まず、コマンドラインで`setup.py`があるディレクトリに移動します。そこで
```
python setup.py install
```

を実行します。上手く行けばインストールが成功するはずです。
　赤文字で何かエラーが出た方はインストールに失敗しています。MeCabのインストールとパス設定などを見直してみてください。

## 2.5. 動作確認
　Pythonを起動して、以下のスクリプトを実行してみてください。（[MecabをインストールしてPythonで使う【Windows】](https://self-development.info/mecab%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E3%81%A7%E4%BD%BF%E3%81%86%E3%80%90windows%E3%80%91/)より拝借しました）

```python
import MeCab
 
mecab = MeCab.Tagger()
target_str = "DOS窓では、基本的には日本語がアウトです"
print(mecab.parse(target_str))
```

　ImportError等のエラーなく、形態素に分解された情報が出力されればインストール完了です。

## 2.6. 後始末
　追加した諸々のファイルのうち、不要なものを削除します。（削除しなくても使用上は問題ありません）
　まず、2.1.でダウンロードした、mecab-python3のソースは、全く必要ありません。フォルダごと削除しましょう。
　また、2.3.でコピーした`sdk\libmecab.dll`についても削除して構いません。通常使用時は`bin`ディレクトリのものが使用されます。（間違えて.libファイルまで削除しないよう気を付けてください）