utamaro’s blog

誰かの役に立つ情報を発信するブログ

mecabを使って解析する方法

mecabのインストール方法等はいろいろなサイトに書かれているので、pythonのプログラミング部分を紹介します。

意外と実装について書かれてる記事が少なくてびっくりしました。なので、help()を使って使い方を試しました。

以下の環境で作業しています。

mac osX
brewでmecabとmecab-ipadicをインストール
mecab-python3
mecab-ipadic-neologd

mecabインスタンスにはparseToNode(self, *args)parseToString(self, *args)があります。

このうち、parseToString(self, *args)は文字列にパースされるので少し使いづらいです。

なので、parseToNode(self, *args)を使用します。

mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
novel_data = novel_list.get(0)
node = mecab.parseToNode('Google Analytics(グーグルアナリティクス)は、Googleが無料で提供するWebページのアクセス解析サービス。')
while node:
    surface = node.surface
    feature = node.feature
    print(surface, feature)
    node = node.next

このようなデータを取得できます。

 BOS/EOS,*,*,*,*,*,*,*,*
Google Analytics 名詞,固有名詞,一般,*,*,*,Google Analytics,グーグルアナリティクス,グーグルアナリティクス
( 記号,括弧開,*,*,*,*,(,(,(
グーグルアナリティクス 名詞,固有名詞,一般,*,*,*,Google Analytics,グーグルアナリティクス,グーグルアナリティクス
) 記号,括弧閉,*,*,*,*,),),)
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 記号,読点,*,*,*,*,、,、,、
Google 名詞,固有名詞,一般,*,*,*,Google,グーグル,グーグル
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
無料 名詞,一般,*,*,*,*,無料,ムリョウ,ムリョー
で 助詞,格助詞,一般,*,*,*,で,デ,デ
提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー
する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
Webページ 名詞,固有名詞,一般,*,*,*,Webページ,ウェブページ,ウェブページ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
アクセス解析 名詞,固有名詞,一般,*,*,*,アクセス解析,アクセスカイセキ,アクセスカイセキ
サービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
。 記号,句点,*,*,*,*,。,。,。
 BOS/EOS,*,*,*,*,*,*,*,*

surfaceは単語を取得でき、featureではその解析結果が取得できます。

結果を見るとわかるかと思いますが、BOS/EOS,*,*,*,*,*,*,*,*というのが出てきています。

これを除きつつ、データを使いやすいように取得します。

def main():
    mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
    node = mecab.parseToNode('Google Analytics(グーグルアナリティクス)は、Googleが無料で提供するWebページのアクセス解析サービス。')

    node_list = []
    while node:
        surface = node.surface
        feature = node.feature
        c = feature.split(',')[0]
        if not c == 'BOS/EOS':
            node_list.append({
                'surface': surface,
                'feature': feature,
            })
        node = node.next
    for n in node_list:
        print(n)

if __name__ == '__main__':
    main()

実行結果がこちらです。

{'surface': '', 'feature': '名詞,固有名詞,一般,*,*,*,Google Analytics,グーグルアナリティクス,グーグルアナリティクス'}
{'surface': '\t', 'feature': '記号,括弧開,*,*,*,*,(,(,('}
{'surface': 'グーグルアナリティクス', 'feature': '名詞,固有名詞,一般,*,*,*,Google Analytics,グーグルアナリティクス,グーグルアナリティクス'}
{'surface': ')', 'feature': '記号,括弧閉,*,*,*,*,),),)'}
{'surface': 'は', 'feature': '助詞,係助詞,*,*,*,*,は,ハ,ワ'}
{'surface': '、', 'feature': '記号,読点,*,*,*,*,、,、,、'}
{'surface': 'Google', 'feature': '名詞,固有名詞,一般,*,*,*,Google,グーグル,グーグル'}
{'surface': 'が', 'feature': '助詞,格助詞,一般,*,*,*,が,ガ,ガ'}
{'surface': '無料', 'feature': '名詞,一般,*,*,*,*,無料,ムリョウ,ムリョー'}
{'surface': 'で', 'feature': '助詞,格助詞,一般,*,*,*,で,デ,デ'}
{'surface': '提供', 'feature': '名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー'}
{'surface': 'する', 'feature': '動詞,自立,*,*,サ変・スル,基本形,する,スル,スル'}
{'surface': 'Webページ', 'feature': '名詞,固有名詞,一般,*,*,*,Webページ,ウェブページ,ウェブページ'}
{'surface': 'の', 'feature': '助詞,連体化,*,*,*,*,の,ノ,ノ'}
{'surface': 'アクセス解析', 'feature': '名詞,固有名詞,一般,*,*,*,アクセス解析,アクセスカイセキ,アクセスカイセキ'}
{'surface': 'サービス', 'feature': '名詞,サ変接続,*,*,*,*,サービス,サービス,サービス'}
{'surface': '。', 'feature': '記号,句点,*,*,*,*,。,。,。'}

いい感じです。

使うときはforでループして、dictからデータを取得すると良いでしょう。

もしくはこのようにデータを追加して、tupleで使用してもよいと思います。

node_list.append(
    (surface, feature,)
)

使用するときはこんな感じです。

for s, f in node_list:
    print(s, f)