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