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

y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

『言語処理 100 本ノック』に PHP で挑む (第五章の準備)

『言語処理 100 本ノック』に PHP で挑戦しています。今回から第五章に入ります。
www.cl.ecei.tohoku.ac.jp

準備

夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.

CaboCha は日本語係り受け解析器です。第五章では、前章と同様に『我輩は猫である』の文章を題材として、CaboCha による係り受け解析について学びます。今回の記事では第五章の準備として、CaboCha をインストールして neko.txt を処理させるところまで進めていきます。
CaoboCha: Yet Another Japanese Dependency Structure Analyzer

CaboCha は CRF++ というプログラムに依存しているので、まず CRF++ をインストールします。下記のウェブページからソースコードをダウンロードします。
CRF++: Yet Another CRF toolkit

私の環境では、次のようにビルドしてインストールできました。

$ tar xf CRF++-0.58.tar.gz
$ cd CRF++-0.58
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

上記の手順の最後にある ldconfig コマンドは、CaboCha のビルド時に CRF++ の共有ライブラリを認識させるために必要でした。CRF++ の共有ライブラリは /usr/local/lib 以下にインストールされるので、/etc/ld.so.conf にエントリがなければ作っておく必要があるかもしれません。現在の私の環境では以下のようになっていました*1

$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
$ cat /etc/ld.so.conf.d/local.conf
/usr/local/lib
/usr/local/lib64

CaboCha をインストールします。./configure のオプションに --with-charset=utf8 を加えて文字コードを指定します。こちらもインストール後に ldconfig を実行しておきます*2

$ tar xf cabocha-0.69.tar.bz2
$ cd cabocha-0.69
$ ./configure --with-charset=utf8
$ make
$ sudo make install
$ sudo ldconfig

CaboCha の動作を簡単に確認してみます。以下のようにして入力文を与えると、入力文を文節に区切ったうえで文節間の係り受けの関係を出力してくれます*3

$ echo '吾輩はここで始めて人間というものを見た。' | cabocha
    吾輩は---------D
      ここで-D     |
        始めて-D   |
      人間という-D |
            ものを-D
              見た。
EOS

実行例を見ると、係り受けの関係は文頭から文末に向かう木構造になっているようです。CaboCha のウェブページで示されている「チャンキングの段階適用による日本語係り受け解析*4によると、日本語の係り受け解析では、次の制約を入れたモデルがよく用いられるようです。この制約があるため、係り受けの関係は必ず、文末を根とする (葉から根に向かう) 木として表現できます。

(1) 文末を除き,各文節はその文節の後方側に必ず 1 つの係り先を持つ.
(2) 係り受け関係は交差しない.

cabocha の実行時にオプションを指定することで、より詳細な情報を含む出力が得られます。アスタリスクで始まる行が文節の情報を表します。たとえば、出力の先頭行は、0 番目の文節「我輩は」から 5 番目の文節「見た。」に係り受けの関係があることを表します。最後の文節の係り先 -1 は、この文節が係り先を持たないことを表します。先頭がアスタリスク以外の行は、その文節に含まれる形態素の列で、MeCab の解析結果が出力されます。

$ echo '吾輩はここで始めて人間というものを見た。' | cabocha -f1
* 0 5D 0/1 -1.514009
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 2D 0/1 1.311423
ここ    名詞,代名詞,一般,*,*,*,ここ,ココ,ココ
で      助詞,格助詞,一般,*,*,*,で,デ,デ
* 2 3D 0/1 0.123057
始め    動詞,自立,*,*,一段,連用形,始める,ハジメ,ハジメ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
* 3 4D 0/1 1.440044
人間    名詞,一般,*,*,*,*,人間,ニンゲン,ニンゲン
という  助詞,格助詞,連語,*,*,*,という,トイウ,トユウ
* 4 5D 0/1 -1.514009
もの    名詞,非自立,一般,*,*,*,もの,モノ,モノ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
* 5 -1D 0/1 0.000000
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

第五章で利用するデータ (neko.txt) を CaboCha で解析します。以下のように -f1 オプションを指定して cabocha を実行します。

$ cabocha -f1 neko.txt >neko.txt.cabocha

出力結果は以下のとおりです。

$ head -n 20 neko.txt.cabocha
* 0 -1D 0/0 0.000000
一      名詞,数,*,*,*,*,一,イチ,イチ
EOS
EOS
* 0 2D 0/0 -0.764522
       記号,空白,*,*,*,*, , , 
* 1 2D 0/1 -0.764522
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
* 2 -1D 0/2 0.000000
猫      名詞,一般,*,*,*,*,猫,ネコ,ネコ
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。      記号,句点,*,*,*,*,。,。,。
EOS
* 0 2D 0/1 -1.911675
名前    名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
* 1 2D 0/0 -1.911675
まだ    副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ

*1:記憶が曖昧ですが local.conf は私が自分で作成したファイルだったかもしれません。

*2:実行しないと、cabocha の実行時にライブラリを見つけられずエラーになりました。

*3:この実行例は正しく解析できているのでしょうか。「ここで見た」「始めて見た」となるのが正しいのではないかという気がします。

*4:工藤 拓, 松本 裕治. チャンキングの段階適用による日本語係り受け解析. 情報処理学会論文誌, Vol. 43, No. 6, pp. 1834-1842. 2002.