#author("2018-07-19T06:28:34+00:00","default:masatomix","masatomix")
[[自然言語処理/形態素解析エンジンMecab]]
#author("2018-07-22T14:39:48+00:00","default:masatomix","masatomix")
#topicpath
----


#contents

[[自然言語処理/形態素解析エンジンMecab]] にて、形態素解析エンジンであるMecabのセットアップを行いましたが、そのエンジンをこんどはPythonから呼び出してみます。

一式をGithubにアップしました。Vagrantを使って一通りの環境を構築できるようにしてあります。自分でLinuxを用意した場合は適宜、Python環境をセットアップするまでやってください。。

** やってみる [#g5213bfa]

*** Vagrantで環境構築をつくる [#q8967f42]
 $ git clone https://github.com/masatomix/mecab-python-samples.git
 $ cd mecab-python-samples
 $ vagrant up

ちなみにVagrantのprovision機能で、初回 up 時にpython3/pip3/mecabなどを自動的にセットアップするようにしてあるので、それなりに時間がかかります。provision機能でやっているセットアップは、具体的には以下の通りです。

 $ cat ./script/provision.sh
 #!/bin/bash
 
 sudo apt-get update
 sudo apt install -y build-essential
 
 # https://pip.pypa.io/en/latest/installing/
 curl https://bootstrap.pypa.io/get-pip.py -O
 sudo python get-pip.py
 sudo apt install -y python-pip
 sudo apt install -y python3-pip
 
 # install mecab
 sudo apt install -y mecab libmecab-dev mecab-ipadic-utf8
 
 # install mecab-ipadic-neologd  -n(更新する) -y(聞かない)
 git clone https://github.com/neologd/mecab-ipadic-neologd.git
 cd mecab-ipadic-neologd/
 sudo ./bin/install-mecab-ipadic-neologd -n -y

以上が自動的に実行されます。

 $ vagrant ssh
 Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-130-generic x86_64)
 
 Last login: Thu Jul 19 06:42:09 2018 from 10.0.2.2
 vagrant@ubuntu-xenial:~$

となればOK。

[[自然言語処理/形態素解析エンジンMecab]] でやったコマンドは一通り動くと思います。

*** Pythonから呼び出し [#w8da0d55]
さて、Pythonから呼び出しをおこないますが、そのまえにpip3を使って、MecabのPythonライブラリをセットアップします。

 vagrant@ubuntu-xenial:~$ cd /vagrant/samples/
 vagrant@ubuntu-xenial:/vagrant/samples$ sudo pip3 install -r requirement.txt -t ./

ここもそれなりに時間がかかりますので、気長に待ちましょう。

ようやくPythonからの呼び出しです。ソースはこんな感じ。
 vagrant@ubuntu-xenial:/vagrant/samples$ cat mecab_sample.py
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 import MeCab
 import sys
 
 
 # Mecabを用いて、形態素解析した結果を出力する
 def main(args):
     m = MeCab.Tagger("-Ochasen -d /usr/lib/mecab/dic/mecab-ipadic-neologd")
     # m = MeCab.Tagger('-Ochasen')
 
     text = "Pythonから形態素解析エンジンMecabを呼び出してみました。"
 
     print(m.parse(text))
 
 
 if __name__ == "__main__":
     main(sys.argv)

実行します
 vagrant@ubuntu-xenial:/vagrant/samples$ sudo python3 mecab_sample.py
 Python	パイソン	Python	名詞-固有名詞-一般
 から	カラ	から	助詞-格助詞-一般
 形態素解析	ケイタイソカイセキ	形態素解析	名詞-固有名詞-一般
 エンジン	エンジン	エンジン	名詞-一般
 Mecab	Mecab	Mecab	名詞-一般
 を	ヲ	を	助詞-格助詞-一般
 呼び出し	ヨビダシ	呼び出す	動詞-自立	五段・サ行	連用形
 て	テ	て	助詞-接続助詞
 み	ミ	みる	動詞-非自立	一段	連用形
 まし	マシ	ます	助動詞	特殊・マス	連用形
 た	タ	た	助動詞	特殊・タ	基本形
 。	。	。	記号-句点
 EOS

呼び出すことができました。。


*** 配列で受け取る [#off57d96]

形態素ごとに配列でデータを受け取ることも出来ます。データとして処理するならこっちの方がイイかも?

 $ cat mecab_sample2.py
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 import MeCab
 import sys
 
 
 # Mecabを用いて、形態素解析した結果を、二次元配列にして出力する
 def main(args):
     m = MeCab.Tagger("-Ochasen -d /usr/lib/mecab/dic/mecab-ipadic-neologd")
     # m = MeCab.Tagger('-Ochasen')
 
     text = "Pythonから形態素解析エンジンMecabを呼び出してみました。"
 
     m.parse('')  # なんだかおまじないらしい。
     node = m.parseToNode(text)
     node = node.next # 最初はいらないので、除去
 
     results = []
     while node:
         word = []
         word.append(node.surface)  # 表層を追記
         word.extend(node.feature.split(","))  # 素性もカンマでsplitして、追記
         results.append(word)
         node = node.next
 
     results.pop() # 最後はいらないので、除去
 
     print(results)
 
 
 # tab 区切りで出力する
 def print (results):
     for line in results:
         for word in line:
             sys.stdout.write(word + "\t")
         sys.stdout.write('\n')
 
 
 if __name__ == "__main__":
     main(sys.argv)

実行します。
 vagrant@ubuntu-xenial:/vagrant/samples$ sudo python3 mecab_sample2.py
 Python	名詞	固有名詞	一般	*	*	*	Python	パイソン	パイソン
 から	助詞	格助詞	一般	*	*	*	から	カラ	カラ
 形態素解析	名詞	固有名詞	一般	*	*	*	形態素解析	ケイタイソカイセキ	ケイタイソカイセキ
 エンジン	名詞	一般	*	*	*	*	エンジン	エンジン	エンジン
 Mecab	名詞	一般	*	*	*	*	*
 を	助詞	格助詞	一般	*	*	*	を	ヲ	ヲ
 呼び出し	動詞	自立	*	*	五段・サ行	連用形	呼び出す	ヨビダシ	ヨビダシ
 て	助詞	接続助詞	*	*	*	*	て	テ	テ
 み	動詞	非自立	*	*	一段	連用形	みる	ミ	ミ
 まし	助動詞	*	*	*	特殊・マス	連用形	ます	マシ	マシ
 た	助動詞	*	*	*	特殊・タ	基本形	た	タ	タ
 。	記号	句点	*	*	*	*	。	。	。
 vagrant@ubuntu-xenial:/vagrant/samples$

配列データとして処理することが出来ましたね。

[[Python: MeCabによる形態素をリスト化するモジュール - Fuwafuwa's memorandum>http://hibari1121.blog.fc2.com/blog-entry-58.html]]

**TIPS [#y3dfe8ab]


**関連リンク [#uf508edd]


----
この記事は
#vote(おもしろかった,そうでもない)

#comment

#topicpath

SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS