『言語処理 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 まだ 副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ