人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

PythonでMeCabを使って形態素解析する

こんにちは、Grahamianです。
すっごい今更なんですけど Python を使ったときの分かち書きの仕方を書いておこうと思います。日本語の記事もたくさんあるので困ることは無いと思うんですが備忘録ということで。

前準備

Python 自体は3系推奨です。私は3.6を使っています。
PythonMeCab を使うには MeCab 本体のインストールと Python のライブラリのインストールが必要です。
MeCabのインストールはbrewを使うのが一番早いです。いちいちサイトから DL して make install する必要はありません。 brew install mecab

Pythonのライブラリは pip で簡単に入ります。 pip install mecab-python3

これだけで使えるようになっているはずなので確認してみましょう。コンソールから python を起動して import mecab できたら成功です。 気になる人は Neologd(ねおろぐでぃーって読むらしいです) の追加もしてみましょう。 qiita.com

Python分かち書きしてみよう

インストールしたらあとは簡単です。MeCabを初期化してあげて分かち書きしたい文字列を入れてやるだけです。このときPythonライブラリのバグで初期化時に一回空打ちしてやる必要があります。

def init_mecab(dic_path=''):
    arg = ''
    if dic_path:
        arg = '-d ' + dic_path
    m = MeCab.Tagger(arg)
    m.parseToNode('')  # バグ対策で空打ちする
    return m


def tokenize_mecab(text, m):
    mecab_nodes = m.parseToNode(text)
    surfaces = []
    while mecab_nodes:
        surfaces.append(mecab_nodes.surface)  # surfaceで表層形、featureで形態素情報
        mecab_nodes = mecab_nodes.next  # nextを忘れない
    return surfaces

text = 'これはテストです'
m = init_mecab(dic_path)
token = tokenized_mecab(text, m)

処理の流れとしてはこんな感じ

  • 引数を与えてMeCabを初期化する
  • Neologdなど辞書がある場合は dic_path に指定する(無しだと標準を使う)
  • 分かち書きしたい文字列を引数にしてparseToNode()に入れて mecab_nodes を得る
  • nodes を回してmecab_nodes.surfaceで表層形を得る

このときmecab_nodes.nextを忘れると無限ループします(やらかした)
ちなみに単純に分かち書きするだけなら MeCab を初期化するときに-Owakatiにしてm.parseとすると分かち書きが得られます。
形態素特徴量はカンマ "," で分解してやればいろんな情報を得られます。順番は固定なので、例えば名詞だけ使いたいならばカンマでリストに分解して品詞が入っている要素を見てif文で分ければOKです。

MeCab便利なのでみんなも使おう。