pythonでMeCabを使おうとしてハマった点と解決方法のまとめ

カテゴリ: MeCab, python

pythonでMeCabを使おうとしたところ、いろいとエラーがでてハマったので、発生したエラーと対処した方法を書いておきます。

作ったプログラム

今回動作させようとしたプログラムは下記で、与えられた文章の形態素解析を行うものです。

import sys
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse ("すもももももももものうち"))

このプログラムを実行するにあたり、下記のエラーに遭遇しました。

  • エラー SyntaxError: Non-ASCII character
  • エラー No module named 'MeCab'
  • エラー ImportError: libmecab.so.2: cannot open shared object file

以下に、エラーの詳細と対処した方法を記載します。

エラー SyntaxError: Non-ASCII character の対処

以下のようにSyntaxError: Non-ASCII characterエラーが出る場合、文字コードの認識エラーが発生しています。

$ python test01.py
SyntaxError: Non-ASCII character '\xe4' in file test01.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

この問題は、以下のようにファイルの先頭に# coding: utf-8をつけるとよいです。

# coding: utf-8
import sys
import MeCab

m = MeCab.Tagger ("-Ochasen")
print(m.parse ("すもももももももものうち"))

作ったプログラムがutf-8になっているかも、念のために確認しておきます。

$ file test01.py
test01.py: UTF-8 Unicode text

エラー No module named 'MeCab' の対処

エラー No module named 'MeCab'が出る場合、pythonのMeCabモジュールが入っていないためです。

$ python test01.py

Traceback (most recent call last):
  File "test01.py", line 3, in <module>
    import MeCab
ModuleNotFoundError: No module named 'MeCab'

対処法は、pipコマンドでmecabのモジュールをインストールする(下記はpython3の場合)とよいです。

$ pip install mecab-python3

Running setup.py install for mecab-python3 ... done
Successfully installed mecab-python3-0.7

pythonモジュールとは別にMeCab本体もインストールが必要です。

MeCab本体のAmaozon Linux(CentOS6ベース)へのインストールは、別記事に書きました。
- VagrantでAmazonLinuxにMeCabをインストールする

エラー ImportError: libmecab.so.2: cannot open shared object file の対処

エラーImportError: libmecab.so.2: cannot open shared object fileが出る場合、libmecabライブラリがインストールされていない/インストールしたけど認識されていないのが原因です。

$ python test01.py

Traceback (most recent call last):
  File "test01.py", line 3, in <module>
    import MeCab
  File "/home/vagrant/.pyenv/versions/3.6.5/lib/python3.6/site-packages/MeCab.py", line 26, in <module>
    _MeCab = swig_import_helper()
  File "/home/vagrant/.pyenv/versions/3.6.5/lib/python3.6/site-packages/MeCab.py", line 22, in swig_import_helper
    _mod = imp.load_module('_MeCab', fp, pathname, description)
  File "/home/vagrant/.pyenv/versions/3.6.5/lib/python3.6/imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "/home/vagrant/.pyenv/versions/3.6.5/lib/python3.6/imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory

findすると、libmecab.so.2自体は存在してしていました。
(自分でMeCab本体はインストールしていたので当然です...)

$ sudo find / | grep libmecab
/usr/local/lib/libmecab.so.2
/usr/local/lib/libmecab.la
/usr/local/lib/libmecab.so.2.0.0
/usr/local/lib/libmecab.a
/usr/local/lib/libmecab.so

libmecab.so.2は、libmecab.so.2.0.0が実態でスタティックリンクされている状態でした。

$ ls -l /usr/local/lib/libmecab.so.2
lrwxrwxrwx 1 root root 17  5月  3 08:57 /usr/local/lib/libmecab.so.2 -> libmecab.so.2.0.0

共有ライブラリはlib64に置いておけば自動で見つけてくれるので、先ほどのファイルを以下のように/lib64へリンクしたら動作しました。

sudo ln -s /usr/local/lib/libmecab.so.2.0.0 /lib64/libmecab.so.2

上記のエラーたちを解消した後にPythonからMeCabを実行した結果です。

$ python test01.py
すもも スモモ すもも 名詞-一般
も   モ   も   助詞-係助詞
もも  モモ  もも  名詞-一般
も   モ   も   助詞-係助詞
もも  モモ  もも  名詞-一般
の   ノ   の   助詞-連体化
うち  ウチ  うち  名詞-非自立-副詞可能
EOS
こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。