読者です 読者をやめる 読者になる 読者になる

MeCabとMeCabPythonバインディング

MeCabをインストールする機会があったので。

インストール

環境
  • Fedora12
  • Python2.6.2
事前にインストール

gcc++が必要だと怒られたので下記をインストール。

yum install gcc-c++
MeCabのインストール
wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz/download
tar zxf mecab-0.98.tar.gz
cd mecab-0.98
./configure --with-charset=utf8 --enable-utf8-only
make
make install
辞書データのインストール

mecabの公式でipaの辞書データを推奨って書いてあったので。

wget http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz/download
tar zxf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8 --enable-utf8-only
make
make install
試しに実行
$ mecab
これはテストです。
これ	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
テスト	名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。
EOS

おー。パチパチパチ。

Pythonバインディングのインストール
wget http://sourceforge.net/projects/mecab/files/mecab-python/0.98/mecab-python-0.98.tar.gz/download
tar zxf mecab-python-0.98.tar.gz
cd mecab-python-0.98
python setup.py install

Pythonインタプリタで実行

import MeCab

下記エラー発生...。詰んだ?

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MeCab.py", line 25, in <module>
    _MeCab = swig_import_helper()
  File "MeCab.py", line 17, in swig_import_helper
    import _MeCab
ImportError: libmecab.so.1: cannot open shared object file: No such file or directory

自分の環境だと、/usr/local/libにlibmecab.soがあることを確認した。/etc/ld.so.confに下記パスを追加する。

/usr/local/lib

/usr/local/libの反映を有効にするため、.confの再読み込み。

$ sudo ldconfig

再度Pythonインタプリタでimportとテスト実行してみる。

import MeCab
print m.parse(u"これはテストです".encode("utf-8"))
これ	名詞,代名詞,一般,*,*,*,これ,コレ,コレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
テスト	名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS

うまくいった!パチパチ...。さて何に活用するか...。

追記

結果データが複数行になってるからStringのsplitlinesメソッド使って配列にすると使いやすそう。

タブ削除して配列にすると扱いやすいかな?「EOS」どうしようか...。

import MeCab
mecabstring = m.parse(u"これはテストです".encode("utf-8"))
result = map(lambda x: x.replace("\t", ",").split(","), mecabstring.splitlines())

必ず最終行に「EOS」が入るみたいだからpopしちゃえ。

import MeCab
mecabstring = m.parse(u"これはテストです".encode("utf-8"))
mecablist = mecabstring.splitlines()
mecablist.pop()
result = map(lambda x: x.replace("\t", ",").split(","), mecablist)
追々記

「EOS」でpopしちゃだめだ!!これ区切り文字だw

参考