Python
mecab

Ubuntu 14.04 に Mecab と mecab-python3 をインストール

More than 1 year has passed since last update.


概要

Mecabはオープンソースの形態素解析エンジンです。機械学習のための前準備として、日本語の文章を分かち書きにするため利用することができます。Mecab をインストールして Python から利用できるようにするのがこの記事の目標です。


環境


  • Ubuntu 14.04 64bit

  • gcc 4.8.4

  • Python 3.5.2 :: Anaconda custom (64-bit)


インストール手順


1. Mecab

この記事を参考にしました。

$ sudo apt-get install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8

(mecab-ipadic と mecab-ipadic-utf8 の両方が必要なのかよくわかりませんが、とりあえず動いているようです)

mecabコマンドを実行して、日本語の文章を入力すると形態素解析の結果を見ることができます。たとえば「安倍晋三首相」と入力した結果は以下のとおりです。

$ mecab

安倍晋三首相
安倍 名詞,固有名詞,人名,姓,*,*,安倍,アベ,アベ
晋 名詞,固有名詞,人名,名,*,*,晋,ススム,ススム
三 名詞,数,*,*,*,*,三,サン,サン
首相 名詞,一般,*,*,*,*,首相,シュショウ,シュショー
EOS

「晋三」が正しく解析できていませんね。


2. mecab-ipadic-NEologd

デフォルトの IPA 辞書は、固有名詞の解析に弱いようなので、固有名詞やその他の新語を大幅に強化した mecab-ipadic-NEologdという辞書を入れます。

$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a

これをデフォルトの辞書に指定するため、/etc/mecabrc を編集して、



dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd



とします。

詳しいことは、公式ドキュメントを参照してください。

同じく「安倍晋三首相」を解析してみます。

$ mecab -d                              

安倍晋三首相
安倍晋三首相 名詞,固有名詞,一般,*,*,*,安倍晋三,アベシンゾウシュショウ,アベシンゾウシュショー
EOS

今度は正しく固有名詞として認識されています。


mecab-python3

Python 3 向けの Mecab バインディングを入れます。

$ pip install mecab-python3

これでOKです。


mecab-test3

import sys

import MeCab
m = MeCab.Tagger("-Ochasen")
print(m.parse("安倍晋三首相は、国会で施政方針演説を行った。"))

実行すると、

$ python mecab-test.py 

安倍晋三首相 アベシンゾウシュショウ 安倍晋三 名詞-固有名詞-一般
は ハ は 助詞-係助詞
、 、 、 記号-読点
国会 コッカイ 国会 名詞-一般
で デ で 助詞-格助詞-一般
施政方針演説 シセイホウシンエンゼツ 施政方針演説 名詞-固有名詞-一般
を ヲ を 助詞-格助詞-一般
行っ オコナッ 行う 動詞-自立 五段・ワ行促音便 連用タ接続
た タ た 助動詞 特殊・タ 基本形
。 。 。 記号-句点
EOS

となります。

分かち書きにする場合には、

m = MeCab.Tagger("-Owakati")

とすればよいです。


mecab-wakati-test.py

import sys

import MeCab
m = MeCab.Tagger("-Owakati")
items = m.parse("安倍晋三首相は、国会で施政方針演説を行った。")
print(items)
print(type(items))

実行すると、

$ python mecab-wakati-test.py          

安倍晋三首相 は 、 国会 で 施政方針演説 を 行っ た 。

<class 'str'>

結果は、文字列として返ってくるので、list にしたい場合は、split() すればよいようです。