読者です 読者をやめる 読者になる 読者になる

Aqutras Members' Blog

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

プログラムからCaboChaを使う

入梅の報に気を曇らせる今日この頃、雨風にさらされながら帰宅することに辟易とする毎日です。 皆様、気温の変化や雨に体調を崩されないよう、どうかご自愛ください。

こんにちは、自然言語処理の難解さに日々苦悩するうっちーです。 本日は、MeCabの時と同様に、CaboChaをプログラムから使用する方法を紹介させていただくといった次第です。CaboChaについては以下の前回の記事をご覧ください。 また、今まではCUIでずっとやってきたので、今回は解析結果を視覚的に分かりやすい有向グラフにするということをやってみようと思います。

blog.aqutras.com

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

それでは、プログラムからCaboChaを使うための準備を行います。 言語は、今回もPython2を使用しています。掲載されているコードはPython3では動作しませんので気をつけてください。

準備と言ってもやることは簡単で、CaboChaに付属しているPythonのsetup.pyを実行するだけです。

$ sudo python setup.py install

実際に使用してみる

cabocha.pyというファイルを作成し、以下の内容を記述して実行します。

コード

#!/usr/bin/python
# -*- coding: utf-8 -*-

import CaboCha

parser = CaboCha.Parser()

sentence = "隣の客はよく柿食う客だ"

print parser.parseToString(sentence)

tree =  parser.parse(sentence)

# 出力形式を選択
print tree.toString(CaboCha.FORMAT_TREE)
print tree.toString(CaboCha.FORMAT_LATTICE)

実行結果

$ python cabocha.py
隣の-D
  客は-------D
    よく---D |
        柿-D |
        食う-D
          客だ
EOS

隣の-D
  客は-------D
    よく---D |
        柿-D |
        食う-D
          客だ
EOS

* 0 1D 0/1 2.206035
隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
* 1 5D 0/1 -0.593304
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
* 2 4D 0/0 0.538813
よく    副詞,一般,*,*,*,*,よく,ヨク,ヨク
* 3 4D 0/0 1.985106
柿      名詞,一般,*,*,*,*,柿,カキ,カキ
* 4 5D 0/0 -0.593304
食う    動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
* 5 -1D 0/1 0.000000
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS

これでプログラムからCaboChaが実行できたことを確認できたと思います。

応用編:有向グラフの作成

それでは、CaboChaを利用して、修飾関係を有向グラフとして出力してみましょう。

環境構築

まず、環境構築です。 今回は、グラフの出力は、pydotというツールでDOT言語に変換した後、Graphvizでグラフを描画している。 そのため、pydotとGraphvizをインストールする。 これらのインストールは詰まりやすいので、このコマンドでうまくいかない時は、エラー内容などから解決策を探してみてください。

$ sudo pip install pydot
$ sudo apt-get install graphviz libgraphviz-dev pkg-config
$ sudo pip install pygraphviz

グラフの要素を日本語にするので、日本語フォントをインストールして、ubuntuで使われるフォントが入っている /usr/local/share/fonts に移動させます。

$wget http://beu.sakura.ne.jp/fontz/ARIALUNI.TTF
$sudo mv ARIALUNI.TTF /usr/local/share/fonts

以上で、グラフを出力するための準備が整いました。

プログラムの実行

それでは、実際にグラフを描画してみましょう。

コード

% cat cabocha_graph.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import CaboCha
import pydot

parser = CaboCha.Parser()

sentence = "隣の客はよく柿食う客だ"

tree =  parser.parse(sentence)
cabocha_data = tree.toString(CaboCha.FORMAT_LATTICE)
modify = [] # 1節文の文字列と修飾先の数字を格納
modify_num = -1
section = ""
for line in cabocha_data.splitlines():
    if line == "EOS":
        modify.append([section ,modify_num])
    elif str(line[0]) == "*":
        if section != "":
            modify.append([section ,modify_num])
            section = ""
        modify_num = int(line.split(" ")[2].replace('D', ''))
    else:
        section = section + line.split("\t")[0]

edges = []
for line in modify:
    if line[1] == -1: break
    print line[0], modify[line[1]][0]
    edges.append([line[0], modify[line[1]][0]])

n = pydot.Node('node')
n.fontname = "arialuni.ttf"
n.fontsize = 9
n.fontcolor = "blue"

g = pydot.graph_from_edges(edges, directed=True)
g.add_node(n)
g.write_png('modify-relation.png', prog='dot')

実行結果

$ python cabocha_graph.py
隣の 客は
客は 客だ
よく 食う
柿 食う
食う 客だ

実行時に、1節分の語と修飾先を出力しています。 プログラム実行後に、modify-relation.pngができていれば成功です。

作成された画像

f:id:ucchi_in:20160614043154p:plain

情報を視覚化することで、修飾関係がより分かりやすくなりましたね。 これを、膨大なデータでやるだけで、修飾関係マップのようなものを作ることが可能できます。

※グラフの描画は、NLP100本ノック 44として出題されている問題で、参考にさせていただきました。

最後に

CaboChaをプログラムから使うという題材に加えて、解析結果をグラフとして表示するという応用をやってみました。 解析結果を使ってこんなこともできるんだと感じてもらうことができたなら、望外の喜びです。

そろそろ、説明するのが難しい分野に入ってくるのですが、皆様と同様に、自身も日々精進していく所存です。 それでは、本日はこれにて締めさせていただきます。