OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

Python3でMeCab on Windows

pythonで形態素解析エンジン「MeCab」を使うのをWindows上でやろうとすると、いろいろ罠が多くてかつては大変だったようだが、今では先人たちの功績によって、たやすく構築できるようになっている。

・・はずなんだけど、Python不慣れなのもあって、いざやってみたら細々としたところで無駄にはまってしまったので、整理しておく。

前提環境

  • Windows 10 (64bit)
  • Python 3.6.5
  • pipenv
    • pipさえ使えれば良いが、以下の例ではpipenvを使う
    • pip install pipenv でインストール可能

MeCabのインストール

まずは、WindowsマシンへのMeCabのインストール。

公式ページからWindows用のインストールバイナリ(mecab-0.996.exe)をダウンロードできるんだけど、ここで注意。

Pythonが64bit版でインストールされている場合、MeCabも64bitコンパイルのものを使用する必要がある。

インストールされているPythonが64bitかどうかを調べるには、sys.maxsizeの値を見ればいいようだ。

import sys  
is64Bit = sys.maxsize == 2 ** 63 - 1  

64bitのMeCabは以下のページにあったものを利用させていただく。
https://github.com/ikegami-yukino/mecab/releases

※公式ページの32bit MeCabを入れる際は、辞書の文字コードを聞かれるはず。
 pythonから使うために、UTF-8を選択する。
 64bitのほうでは文字コードを聞かれなかったが、インストール後に mecab -D コマンドで辞書情報を確認したところ、UTF-8になっていた。

インストールできたら、 C:\Program Files\MeCab\bin にPATHを通しておく。
手順は割愛。

コマンドプロンプト/PowerShell から MeCabが利用できることを確認。

>mecab  
すもももももももものうち #入力文字列  

すもも  スモモ  すもも  名詞-一般  
も      モ      も      助詞-係助詞  
もも    モモ    もも    名詞-一般  
も      モ      も      助詞-係助詞  
もも    モモ    もも    名詞-一般  
の      ノ      の      助詞-連体化  
うち    ウチ    うち    名詞-非自立-副詞可能  
EOS  

↑のようになってほしいところだが、残念ながら文字化けすると思います。

UTF-8にしたのでね。
chcp 65001 とかやってサクッとUTF-8でコマンドを打てるかと思ったら、そう簡単ではないらしい。
うまくやる方法はありそうだけど、とりあえず諦める。
まずはmecabコマンドが動いていることを確認できればよい。

PythonのMeCabラッパを使用

pipに mecab-python-windows というパッケージがあって、これが一番簡単そうだった。

適当なプロジェクトを作り、pipenvでインストール。

#プロジェクト初期化  
>pipenv --three  

#インストール  
pipenv install mecab-python-windows  

対話シェルで、動くことを確認する。

#仮想環境に入る  
>pipenv shell  

#対話シェルを起動  
>python  

#使ってみる  
>import MeCab  
>m = MeCab.Tagger("-Ochasen")  
>print(m.parse("すもももももももものうち"))  
すもも  スモモ  すもも  名詞-一般  
も      モ      も      助詞-係助詞  
もも    モモ    もも    名詞-一般  
も      モ      も      助詞-係助詞  
もも    モモ    もも    名詞-一般  
の      ノ      の      助詞-連体化  
うち    ウチ    うち    名詞-非自立-副詞可能  
EOS  

#対話シェル終了  
>exit()  

#仮想環境を抜ける  
>exit  

import MeCab でエラーになる場合、以下あたりが原因かも(全部やった)

  • ModuleNotFoundError: No module named 'MeCab' →pipenvの仮想環境に入らずに実行していないか

  • ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。 →64bit Pythonに対して 32bitのMeCabがインストールされていないか

  • ImportError: DLL load failed: 指定されたモジュールが見つかりません →MeCabのbin\ に環境変数PATHが通っているか

その他、Qiitaページ のコメントにも失敗ケースが書いてあったので、そちらもご参考に。