MecabをインストールしてPythonから使ってみた

概要

日本語の形態要素解析に使うMeCabのインストール方法、及びPythonから呼び出して使う方法をまとめました。Ubuntuでも大変でしたが、Windowsは半日近くかかりもっと大変でした(覚悟したほうがいいレベル)。

Ubuntu16.04の場合

Ubuntuを使う場合。

MeCabのインストール

以下のコマンドでmecabがインストールできます。

sudo apt install mecab

とりあえず使って見ると、文字化けしてしまうことが分かります。

hoge@PC:~$ mecab
私は猿です
��	��,����̾��,*,*,��,����,��ɽɽ��:��
�は��	�ü�,����,*,*,*,*,*
��	��,��̾,*,*,*,*,*
��す	�ü�,����,*,*,*,*,*
EOS

文字化けしないようにutf8表示に対応した辞書を追加します。

sudo apt install mecab-ipadic-utf8

今度はできました。これでMeCabのインストールは完了です。

hoge@PC:~$ mecab
私は猿より賢い
私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
猿	名詞,一般,*,*,*,*,猿,サル,サル
より	助詞,格助詞,一般,*,*,*,より,ヨリ,ヨリ
賢い	形容詞,自立,*,*,形容詞・アウオ段,基本形,賢い,カシコイ,カシコイ
EOS

PythonからMeCabを呼び出す

python3を使っている場合、mecab-python3をインストールしましょう。

pip install mecab-python3

が、エラーが出てしまいます。

Collecting mecab-python3
  Using cached mecab-python3-0.7.tar.gz
    Complete output from command python setup.py egg_info:
    /bin/sh: 1: mecab-config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 41, in <module>
        include_dirs=cmd2("mecab-config --inc-dir"),
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 21, in cmd2
        return cmd1(strings).split()
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 18, in cmd1
        return os.popen(strings).readlines()[0][:-1]
    IndexError: list index out of range

「list index out of range」が目を引きますが、本当の問題は「mecab-config: not found」です。以下のコマンドでmecab-configを入手しましょう。

sudo apt install libmecab-dev

再度トライ。

pip install mecab-python3

成功しました。

Successfully installed mecab-python3-0.7

引き続きPythonでMeCabを呼び出してみましょう。

Import MeCab

が、エラー発生。

version `GLIBCXX_3.4.20' not found

この方のサイト(二日坊主な私)を見て、condaからlibgccを入れます。

conda install libgcc

これでImportできるようになりました。最後に動作チェック。

import MeCab
mecab = MeCab.Tagger("-Ochasen")
print(macab.parse("私はとても変態です"))
私	ワタシ	私	名詞-代名詞-一般		
は	ハ	は	助詞-係助詞		
とても	トテモ	とても	副詞-助詞類接続		
変態	ヘンタイ	変態	名詞-サ変接続		
です	デス	です	助動詞	特殊・デス	基本形
EOS

動きましたね。(私は変態ではありませんが!)

Windows10の場合

Windowsを使う場合。

MeCabのインストール

以下のサイトからMeCabのexeファイルをダウンロードしてインストールしましょう。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer

インストールする際に文字コードを聞かれますが、Pythonで動かすことを考えている場合、utf8にしておく必要があります。

PythonからMeCabを呼び出す

python3を使っている場合、mecab-python3をインストールしましょう。

pip install mecab-python3

が、エラーが出てしまいます。どうやらWindowsでは、自分でビルドするしかないとのこと。ひとまず下記サイトから元ファイルを入手しましょう。
https://pypi.python.org/pypi/mecab-python3/0.7

setup.pyが置いてある場所でコマンドプロンプトを開き、実行。

python setup.py install

さあ、悪夢の始まりです。

Collecting mecab-python3
  Using cached mecab-python3-0.7.tar.gz
    Complete output from command python setup.py egg_info:
    /bin/sh: 1: mecab-config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 41, in <module>
        include_dirs=cmd2("mecab-config --inc-dir"),
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 21, in cmd2
        return cmd1(strings).split()
      File "/tmp/pip-build-40aowpcr/mecab-python3/setup.py", line 18, in cmd1
        return os.popen(strings).readlines()[0][:-1]
    IndexError: list index out of range

このエラーはUbuntuと同じですね。「mecab-config: not found」が原因です。ただ、setup.pyの中身を変えて対策するようです。
40行目付近にある、mecab-configの部分を、

    ext_modules = [
        Extension("_MeCab",
        ["MeCab_wrap.cxx",],
        include_dirs=cmd2("mecab-config --inc-dir"),
        library_dirs=cmd2("mecab-config --libs-only-L"),
        libraries=cmd2("mecab-config --libs-only-l"))
    ],

以下のようにsdkフォルダを探すように変更します。

    ext_modules = [
        Extension("_MeCab",
        ["MeCab_wrap.cxx",],
        include_dirs=[r'C:\Program Files (x86)\MeCab\sdk'],
        library_dirs=[r'C:\Program Files (x86)\MeCab\sdk'],
        libraries=['libmecab'])
    ],

さて、「python setup.py install」を実行しましょう。次のエラーはこちら。

error: Unable to find vcvarsall.bat

コンパイラーがないというエラーです。Windowsのサイトに取りに行きましょう。GBオーダのインストールなので、結構時間がかかりました。
http://landinghub.visualstudio.com/visual-cpp-build-tools

再度トライ。

<中略>
C:\Program Files (x86)\MeCab\sdk\mecab.h(204): note: see declaration of 'MeCab'
MeCab_wrap.cxx(4760): error C2059: syntax error: 'const'
MeCab_wrap.cxx(4778): error C2039: 'Lattice': is not a member of 'MeCab'
C:\Program Files (x86)\MeCab\sdk\mecab.h(204): note: see declaration of 'MeCab'
MeCab_wrap.cxx(4778): error C2065: 'arg1': undeclared identifier
MeCab_wrap.cxx(4778): error C2059: syntax error: ')'
MeCab_wrap.cxx(4792): error C2065: 'arg1': undeclared identifier
MeCab_wrap.cxx(4792): fatal error C1003: error count exceeds 100; stopping compilation
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2

Latticeというのがキーワードのようです。どういうものか良く分からないのですが、以下の方のサイトを参考に修正しました。
http://y-mattu.hatenablog.com/entry/2016/01/06/030929

mecab.hの775行目あたり1行追加すればいいようです。

/**
 * Lattice class
 */
class MECAB_DLL_CLASS_EXTERN Lattice {
public:

  virtual void set_result(const char *str)        = 0; //この1行を追加

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

再びトライ。

<中略>
build\lib.win-amd64-3.6\_MeCab.cp36-win_amd64.pyd : fatal error LNK1120: 11 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\link.exe' failed with exit status 1120

これもなんだか良く分からないのですが(笑)、32bit環境でコンパイルされたライブラリじゃだめだ、ということのようです。
以下の方のサイトを参考に
きまぐれ猫のゆりかご

64bit環境でコンパイルされたMecabとそのライブラリを取得します。
takayanの雑記帳

取得したら、setup.pyと同じファイルに「libmecab.lib」を置いて実行しましょう。

行け!

python setup.py install

行きました~。

Generating code
Finished generating code

が、まだ終わりません。今度は、手に入れたMeCabをインポートするとエラー。

>>> import MeCab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\ProgramData\Anaconda3\Lib\site-packages\MeCab.py", line 26, in <module>
    _MeCab = swig_import_helper()
  File "C:\ProgramData\Anaconda3\Lib\site-packages\MeCab.py", line 22, in swig_import_helper
    _mod = imp.load_module('_MeCab', fp, pathname, description)
  File "C:\ProgramData\Anaconda3\lib\imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "C:\ProgramData\Anaconda3\lib\imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。

デフォルトだと、32bitのDLLを読みに行ってしまうようです。そこで、先ほど手に入れた64bitの「libmecab.dll」をscite-packegeフォルダに置きましょう。

今度こそ!

import MeCab
mecab = MeCab.Tagger ("-Ochasen")
print(mecab.parse("もっと熱くなれよ"))

もっと熱くなれよ!

もっと     モット     もっと     副詞-一般           
熱く      アツク     熱い      形容詞-自立  形容詞・アウオ段        連用テ接続
なれ      ナレ      なる      動詞-自立   五段・ラ行   命令e
よ       ヨ       よ       助詞-終助詞          
EOS

動きましたね。(本当に疲れました!)

結論

MeCabはWindows環境で使うものではない、と強く思いました笑


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA