Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

プログラムからMeCabを使う

お久しぶりです、自然言語処理をやってるうっちーです。 この記事では、前回コンソールから使用したMeCabを、プログラムから使用する方法を紹介します。この記事を通して、MeCabを利用してこんなことが出来るよっていうのを知ってもらえればなと思います。 MeCabってなにって人は下の前回の記事を見てみてください。 なお、筆者の環境はUbuntuなのでコマンドなどは適宜読み替えてください。

blog.aqutras.com

プログラムからMeCabを使う準備

プログラムからMeCabを使うための準備を行います。 プログラミング言語は、自然言語処理で広く使われており、ライブラリも豊富なPythonを利用します。 Pythonが入っていない人はインストールしておいてください。 筆者はPython2を使用しています。掲載されているコードはPython3では動作しませんので気をつけてください。

PythonからMeCabを使うためには、python-mecabをインストールする必要があるので、以下のコマンドでインストールしてください。

$ sudo apt-get install python-mecab

MeCabをPythonから使うための準備はこれで終わりです。

実際に使用してみる

mecab.pyというファイルを作成して、以下の内容を記述して実行します。
pythonは、python ファイル名で実行することができます。

プログラム

# -*- coding: utf-8 -*-

import sys
import MeCab
m = MeCab.Tagger("-Ochasen")
print m.parse("Aqutrasのブログを書いている。")

実行結果

$ python mecab.py

Aqutras Aqutras Aqutras 名詞-固有名詞-組織
の      ノ      の      助詞-連体化
ブログ  ブログ  ブログ  名詞-一般
を      ヲ      を      助詞-格助詞-一般
書い    カイ    書く    動詞-自立       五段・カ行イ音便        連用タ接続
て      テ      て      助詞-接続助詞
いる    イル    いる    動詞-非自立     一段    基本形
。      。      。      記号-句点
EOS

プログラムからMeCabを使用することが出来ましたね!!

拡張辞書を使用

次は、前回紹介した、neologdという拡張辞書をプログラムから使用してみます。使い方としては、Taggerに-dオプションを付けて辞書ファイルの場所を指定してやるだけです。

プログラム

# -*- coding: utf-8 -*-

import sys
import MeCab
m = MeCab.Tagger("-Ochasen -d /usr/lib/mecab/dic/mecab-ipadic-neologd")
print m.parse("映画の僕だけがいない街は、藤原竜也が主演である。")

ipadic(既存の辞書)を使用した場合

映画    エイガ  映画    名詞-一般
の      ノ      の      助詞-連体化
僕      ボク    僕      名詞-代名詞-一般
だけ    ダケ    だけ    助詞-副助詞
が      ガ      が      助詞-格助詞-一般
い      イ      いる    動詞-自立       一段    未然形
ない    ナイ    ない    助動詞  特殊・ナイ      基本形
街      マチ    街      名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
藤原    フジワラ        藤原    名詞-固有名詞-人名-姓
竜也    タツヤ  竜也    名詞-固有名詞-人名-名
が      ガ      が      助詞-格助詞-一般
主演    シュエン        主演    名詞-サ変接続
で      デ      だ      助動詞  特殊・ダ        連用形
ある    アル    ある    助動詞  五段・ラ行アル  基本形
。      。      。      記号-句点
EOS

neologdを使用した場合

映画    エイガ  映画    名詞-一般
の      ノ      の      助詞-連体化
僕だけがいない街        ボクダケガイナイマチ    僕だけがいない街        名詞-固有名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
藤原竜也        フジワラタツヤ  藤原竜也        名詞-固有名詞-人名-一般
が      ガ      が      助詞-格助詞-一般
主演    シュエン        主演    名詞-サ変接続
で      デ      だ      助動詞  特殊・ダ        連用形
ある    アル    ある    助動詞  五段・ラ行アル  基本形
。      。      。      記号-句点
EOS

neologdを辞書として使うことができました。解析結果を見ると、neologdが新語や人名にもきっちり対応していることがわかりますね。

MeCabの詳細な解析結果の表示

前回の記事を読んだ人は、コンソールでやったときと解析結果が違うことに気付いたかもしれません。 以下のような、詳細な解析結果が欲しい場合は、parseの代わりにparseToNodeを使えばOKです。

ただ、parseToNodeはparseに比べると動作が重いようなので、使うときは気をつけてください。parseToNodeとparseの処理時間を比較した記事を参考に載せておきます。

PythonでのMeCabを速くするtips - Qiita

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

詳細な解析結果を表示するプログラム
parseToNodeで解析を行うと、surfaceに表層系(文中で現れた語)、featureに解析結果が入ります。featureは,で句切られているのでsplitメソッドなどを利用して分割して情報を抽出します。

プログラム

# -*- coding: utf-8 -*-

import sys
import MeCab
m = MeCab.Tagger("-Ochasen")
node = m.parseToNode("Aqutrasのブログを書いている。")
while node:
    print node.surface, "\t", node.feature
    node = node.next

実行結果

        BOS/EOS,*,*,*,*,*,*,*,*
Aqutras         名詞,固有名詞,組織,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
ブログ  名詞,一般,*,*,*,*,*
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
書い    動詞,自立,*,*,五段・カ行イ音便,連用タ接続,書く,カイ,カイ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル
。      記号,句点,*,*,*,*,。,。,。
        BOS/EOS,*,*,*,*,*,*,*,*

出現する単語のカウント

それでは、前回の記事の最後に書いていたすもももももももものうちに桃が何個含まれているのかというのをやってみます。 以下のコードは、featureから語の基本形をキーとした辞書オブジェクトを作成し、キーに対応した値を+1していき、出現頻度のカウントを行っています。

プログラム

# -*- coding: utf-8 -*-

import sys
import MeCab
m = MeCab.Tagger("-Ochasen")
node = m.parseToNode("すもももももももものうち")
dic = {}
while node:
    feature = node.feature.split(",")
    if not feature[6] == "*":
        if not dic.has_key(feature[6]):
            dic[feature[6]] = 1
        else:
            dic[feature[6]] += 1
    node = node.next

print "文字\t出現回数"
for key, value in dic.iteritems():
    print key, "\t", value

実行結果

文字    出現回数
も      2
もも    2
の      1
すもも  1
うち    1

ということで、すもももももももものうち(李も桃も桃のうち)に含まれるは2個でした。

おまけ 自然言語処理におけるプログラミング言語の選択

今回は、私の使ったことのあるPythonというプログラミング言語を使用しました。 しかし、自然言語処理は大規模なデータに対して解析や統計処理を行う場合が多く、プログラミング言語の選択がとても大きな意味を持ちます。 そのため、作るものに合わせて、使うプログラミング言語やライブラリを決める必要があります。

良い資料があったので参考に

言語処理するのに Python でいいの? #PyDataTokyo

この資料になかったものだと、perlやRubyなどのプログラミング言語も自然言語処理で使われることがあります。Rubyは、日本語のドキュメントが豊富で、文字列処理周りも強いので自然言語処理の初心者におすすめです。

最後に

文字の出現頻度のカウントは、重要語の抽出や共起頻度の算出、単語ベクトルの作成などの発展的な内容において、基礎技術として扱われる非常に大事な技術なので、是非覚えておきましょう。