PHP から CaboCha を利用できるように、拡張モジュールを作成しています。
github.com
一般的な PHP 拡張モジュールと同様に、次の手順でインストールできます。ただし、現時点では PHP 7 専用です。
$ git clone https://github.com/y-uti/php-cabocha.git
$ cd php-cabocha
$ phpize
$ ./configure
$ make
$ sudo make install
以下のようにして入力文を解析できます。
<?php $cabocha = cabocha_new(); $tree = cabocha_parse($cabocha, '吾輩はここで始めて人間というものを見た。');
cabocha_parse 関数を実行して得られる $tree は以下のキーを持つ配列です*1。主要な情報は $tree['chunk'] と $tree['token'] に格納されます。
キー | 値の型 | 値の意味 |
---|---|---|
sentence | string | 入力文 |
chunk | array | 文節 |
token | array | 形態素 |
charset | int | バイナリ辞書の文字コード |
posset | int | 形態素解析器の品詞体系 |
output_layer | int | 出力のレイヤ |
$tree['chunk'] の各要素には、文節の情報が格納されます*2。以下のような情報が含まれます。
<?php $chunk0 = $tree['chunk'][0]; // 先頭の文節を取得 echo $chunk0['token_pos']; // この文節に属する形態素の開始位置 (0) echo $chunk0['token_size']; // この文節に属する形態素の要素数 (2) echo $chunk0['link']; // この文節の係り先の文節番号 (5)
一方、$tree['token'] の各要素には、形態素の情報が格納されます*3。以下のような情報が含まれます*4。
<?php $token0 = $tree['token'][0]; // 先頭の形態素を取得 echo $token0['surface']; // 表層形 ("吾輩") echo $token0['feature']; // 素性 ("名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ") echo $token0['ne']; // 固有表現解析の結果 ("O")
たとえば次のようなコードで、文節間の係り受けの関係を取り出せます。
<?php function surface($tree, $chunk) { $tokens = array_slice($tree['token'], $chunk['token_pos'], $chunk['token_size']); return implode('', array_map(function ($t) { return $t['surface']; }, $tokens)); } foreach ($tree['chunk'] as $i => $chunk) { $src = surface($tree, $chunk); $link = $chunk['link']; if ($link !== -1) { $dst = surface($tree, $tree['chunk'][$link]); echo "$i: $src -> $dst ($link)\n"; } else { echo "$i: $src\n"; } }
実行結果は以下のとおりです。
0: 吾輩は -> 見た。 (5) 1: ここで -> 始めて (2) 2: 始めて -> 人間という (3) 3: 人間という -> ものを (4) 4: ものを -> 見た。 (5) 5: 見た。