GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Windows環境のPython3でMeCabを使ってみよう

さて、本日はPython3にMeCabを入れてみようと思います。MeCabについては以下のエントリーで紹介しているのですが、Python2系だったのと、あまり詳しくは紹介できませんでした。なので、今回はMeCabをメインにエントリーを書いてみました。

www.gis-py.com

MeCab とは

オープンソースの形態素解析エンジンです。開発者の方が和布蕪(めかぶ)が好物なのでこの名前になったみたいです。公式サイトもありますので、興味のある方はこちらも参考にしてみてください。MeCab: Yet Another Part-of-Speech and Morphological Analyzer

形態素解析 とは

検索エンジンなどにも使用されている自然言語処理の手法の一つで、ある文章・フレーズを「意味を持つ最小限の単位(=単語)」に分解し、それらの品詞等を判別する作業のことです。例えば、「私は横浜に住んでいます。」という文章を形態素解析した結果が以下です。

f:id:sanvarie:20190706135256p:plain

この技術を利用すれば様々なデータを分析することができます。例えば、Twitter などでしょうか。

  1. 特定のハッシュタグを含むツイートを抽出
  2. 「1」のツイートを形態素解析して、その中から地域名を含むツイートを抽出
  3. そこからジオコーディングでツイートされた地域を可視化

こんな感じで使えばトレンド分析みたいなことができるのではないでしょうか?それ以外にも色々な分野で使えるかと思います。

実行環境

Windows10(64bit)
Python3.6.5

手順

色々やることはあるのですが、大きく分けて二つです。

  1. Windows 環境で MeCab のインストール
  2. MeCabをPython上で使えるようにする

※MeCab をインストールしただけではPython上からは実行できませんので、ご注意ください。

Windows 環境で MeCab のインストール

選択肢は以下の二つです。

  1. 公式サイトからMeCabの実行プログラム本体をダウンロード(32bit版)http://taku910.github.io/mecab/#download
  2. 有志がビルドした64bit版をダウンロードhttps://github.com/ikegami-yukino/mecab/releases/tag/v0.996

私の環境のPythonが64bitのため、今回は64bit版を使用します。mecab-0.996-64.exeをダウンロードして、MeCabをインストールします。

環境変数の設定

Pathに「(MeCabのインストール先)/bin(例えば、C:\Program Files\MeCab\bin)」を追加します。

MeCab を使ってみる

コマンドプロンプトでmecabと入力すればMeCab が起動します(環境変数を設定していない方は「(MeCabのインストール先)/bin」のディレクトリに移動してmecabを入力してください)。そして、「私は東京に住んでいます。」という文章を入力してみました。しかし、このように文字化けしてしまいました。
f:id:sanvarie:20190706101145p:plain

ただ、これはコマンドプロンプトがutf-8に対応していないからで特に問題はありません(MeCab 自体は問題なく動いています)。もしコマンドプロンプトをutf-8対応したいという方はコマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 - Qiitaのようなサイトを参考にしてみてください。

MeCabをPython上で使えるようにする

MeCabのインストールができたら、それをPython上で動かせるようにする必要があります。以下二つの手順が必要です。

  1. Python上のMeCabバインディングの導入
  2. libmecab.dll をコピペ

まずは、Python上のMeCabバインディングの導入ですね。今回はWindows用のmecab-python-windowsというバインディングを導入します。以下二つのモジュールをpip でインストールします。

pip install ipykernel
pip install mecab-python-windows

インストール完了後、にもう一つ作業(libmecab.dll をコピペ)が必要です。

(MeCabのインストール先)/bin

にある"libmecab.dll"というファイルを

(Pyhthonのインストール先)/Lib/site-packages

にコピペしてください。これでPython上でMecab が使えます。

import MeCab

もしインポートできないという場合は以下を確認してください。

  • ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。→64bit Pythonに対して 32bitのMeCabがインストールされていないか
  • ImportError: DLL load failed: 指定されたモジュールが見つかりません。 →MeCabのbin\ に環境変数PATHが通っているか

Pythonで形態素解析をしてみる

ようやく環境が整いました。それでは形態素解析をしてみましょう。

import MeCab

tagger = MeCab.Tagger("-Ochasen")
result = tagger.parse("私は東京に住んでいます。")
print(result)

素晴らしい。きちんと文章が品詞ごとに分別されていますね。
f:id:sanvarie:20190706124711p:plain

出力フォーマットの変更

上記のコードで-Ochasenを使用していますが、これは出力フォーマットのオプションの一つです。公式サイトによるとオプションは以下の三つのようです。

  1. -Oyomi (ヨミ付与)
  2. -Ochasen (ChaSen互換)
  3. -Odump (全情報を出力)
  • Oyomiを使用するとこのような結果になります。

f:id:sanvarie:20190706125109p:plain

  • Odumpを使用するとこのような結果になります。

f:id:sanvarie:20190706125159p:plain

未知語推定

MeCab は, 辞書に単語が未登録の場合でも適当にその品詞を推定してくれるみたいです。試しに「ひょっこりはん」で形態素解析してみようと思います。果たしてどのような結果になるのでしょうか。

import MeCab

tagger = MeCab.Tagger("-Ochasen")
result = tagger.parse("ひょっこりはん")
print(result)

このような結果になりました。たしかにこれを人名と分類するのは難しいですが、何かしらの結果は返してくれるみたいですね。
f:id:sanvarie:20190706125641p:plain

Pythonでもっと形態素解析をしてみる

これだけではつまらないので、もう少し突っ込んだところまでやってみようと思います。

今回使用する文章

今度の打ち合わせは永田町にある先方のオフィスでで行うことになりました。


なぜ永田町なのかは秘密です。文章に地名が含まれている場合、その地名を抽出するプログラムを書いてみます。ちなみに単純に形態素解析の結果を出力するとこのようになります。

f:id:sanvarie:20190706141128p:plain

以下が作成したプログラムです。少しだけ複雑になりましたが、ポイントさえつかめばすぐに使いこなすことができるかと思います。

import MeCab

tagger = MeCab.Tagger("-Ochasen")
node = tagger.parseToNode("今度の打ち合わせは永田町にある先方のオフィスで行うことになりました。")

while node:
    if node.surface != "":  # ヘッダとフッタを除外
        if (node.feature.split(",")[1] == "固有名詞") and (node.feature.split(",")[2] == "地域"):
            print(node.feature.split(",")[6])
    node = node.next

少しだけポイントを解説します。

parseToNode メソッド

このメソッドを使用することにより、「文頭」という特別な形態素が MeCab::Node クラスのインスタンスとして 取得できます。要するにこのメソッドを使えば形態素解析の結果で色々できるということですね。

その他のポイント

  1. parseToNode メ ソッドで取得した node をwhile でループ。node.next で次の行に行きます。
  2. node.surface は形態素解析の結果のヘッダとフッタが取得できます。上記画像の一番上と下の「BOS BOS/EOS」の行ですね。
  3. node.feature で品詞の取得ができます。

結果

「永田町」のみを抽出することができました。
f:id:sanvarie:20190706141316p:plain

本当に素晴らしい技術ですね。おそらくAI分野でこういった技術が数多く使われているんじゃないかと思います。自分ももう少しこういったことを勉強して GISとAI を使って何か面白いことをしてみたいですね。

本エントリーの後に以下を書いてみました。Mecab の具体的な使用例になるのではないかと思います。興味のある方はぜひ読んでみてください。
www.gis-py.com

本日は以上です。