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

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

やってみる

Vagrantで環境構築をつくる

$ 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から呼び出し

さて、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

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

配列で受け取る

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

$ 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

TIPS

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

現在のアクセス:85


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-22 (日) 23:39:48 (86d)