kuro_reraのブログ

新米エンジニアのブログ。いろいろと模索中。

MeCabをインストールしPythonから呼び出す

Google HomeAmazon Echoなど、AIアシスタントが流行している。
これらは人間の声に対応し処理を行うものであるが、その処理は、
「声を受け取る→文にする→文の内容を解釈する→それに対応した出力をする」
、といったプロセスをとると考えられる。

さて、ここにおける「文の内容を解釈する」はどのようなことを指すだろうか。
おそらくではあるが、AIアシスタントにおける処理パターンは有限で、入力に近いパターンを判断しているのだろう。
こうした「判断」ひいては「解釈」にあたっては、大雑把に言えば単語それぞれにベクトルを与えるのが主流である。

しかし、日本語の処理においてこれらの手法にはやや壁がある。それは、文から単語を取り出すことにある。
というのも、日本語では欧米言語と異なり、単語と単語が空白で区切られていない。
つまり、日本語の処理においてはまず単語と単語を区切ることから始まるのである。

それらは、「形態素解析」によって実現することができる。
代表的なツールとしてMeCabJanomeがあるが、ここではMeCabを使う。
MeCabは高速かつ的確で人気である(と思う。)が、使用するまでにやや難があるため記事としたい。 なお、このページなどを参考にしている。

まずはMeCabをインストールする。
環境は以下の通りである。

いろいろと設定するのが面倒なので、MeCabのインストールはapt-getで行う。
apt-getはパッケージ管理システムであり、apt-getでインストールすると環境設定が楽にできる。

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

これで、MeCabのインストール自体は完了である。
実際にターミナル上で動かしてみる。

$ mecab
青木宣親選手が日本球界に復帰することになった
青木    名詞,固有名詞,人名,姓,*,*,青木,アオキ,アオキ
宣      名詞,サ変接続,*,*,*,*,宣,セン,セン
親      名詞,一般,*,*,*,*,親,オヤ,オヤ
選手    名詞,一般,*,*,*,*,選手,センシュ,センシュ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
日本    名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
球界    名詞,一般,*,*,*,*,球界,キュウカイ,キューカイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
復帰    名詞,サ変接続,*,*,*,*,復帰,フッキ,フッキ
する    動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ    動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS

このように単語ごとに分割してくれるが、デフォルトの辞書では固有名詞の扱いに弱い。
(ちなみに青木宣親選手は筆者の一番好きな野球選手である。)
そこで、固有名詞にも対応した辞書を追加でインストールする。

使うのはmecab-ipadic-NEologdという辞書である。
好意で定期的に更新されている辞書である。頭が下がる。
gitを経由してインストールするのが一番筋が良い。

$ sudo apt-get git
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a

辞書のデータは結構膨大で、2~3分はかかると思っていい。
完了したら、階層を移動しインストールファイルを実行する。
なお、デフォルトでは辞書のインストール先は/usr/lib/mecab/dic/mecab-ipadic-neologdとなっている。
変更したい場合は/usr/mecab/mecab-config--dicdirを編集すればよい。

新しくインストールした辞書は、-dオプションで指定すると利用できる。

$ mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd/
青木宣親選手が日本球界に復帰することになった
青木宣親        名詞,固有名詞,一般,*,*,*,青木宣親,アオキノリチカ,アオキノリチカ
選手    名詞,一般,*,*,*,*,選手,センシュ,センシュ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
日本球界        名詞,固有名詞,一般,*,*,*,日本球界,ニッポンキュウカイ,ニッポンキ ューカイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
復帰    名詞,サ変接続,*,*,*,*,復帰,フッキ,フッキ
する    動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ    動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

このように、「青木宣親」が一つの固有名詞と判断されている。
しかしながら、いちいち辞書を指定するのも面倒なので、これをデフォルトの辞書に設定してしまおう。
mecabrcファイルを編集するが、通常は編集できないのでパーミッションを変更しよう。

$ sudo chmod 777 /etc/mecabrc
$ vi /etc/mecabrc
dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd
$ sudo chmod 644 /etc/mecabrc


これでデフォルトでインストールした辞書を使用できる。

$ mecab
青木宣親選手が日本球界に復帰
青木宣親        名詞,固有名詞,一般,*,*,*,青木宣親,アオキノリチカ,アオキノリチカ
選手    名詞,一般,*,*,*,*,選手,センシュ,センシュ
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
日本球界        名詞,固有名詞,一般,*,*,*,日本球界,ニッポンキュウカイ,ニッポンキ ューカイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
復帰    名詞,サ変接続,*,*,*,*,復帰,フッキ,フッキ
する    動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ    動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS


さて、MeCabコマンドライン上で利用できるようになったが、実際に利用するのはプログラム上であるのがほとんどであろう。
ここでは、PythonからMeCabを呼び出せるよう設定する。
といっても、mecab-python3パッケージをインストールするだけでよい。

$ pip install mecab-python3


これで、次のようにPythonからMeCabを利用できる。

import MeCab

mecab = MeCab.Tagger("-O wakati")
print(mecab.parse("青木宣親選手が日本球界に復帰することになった。"))

なお、MeCab.Taggerの引数はオプションである。
-Oは出力の形式を変更するオプションで、wakatiは分かち書き(単語と単語の間に空白を入れる)をする形式である。

$ python mecab_test.py
青木宣親 選手 が 日本球界 に 復帰 する こと に なっ た 。

このように、PythonからMeCabを呼び出すことができた。