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)