y_uti のブログ

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

PHP から CaboCha を使う

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: 見た。

*1:$tree は CaboCha の cabocha_sparse_totree 関数から得られる cabocha_tree_t 構造体を PHP の配列に詰め替えたものです。データ構造の詳細は CaboCha のソースコードを参照してください。

*2:cabocha_chunk_t 構造体に対応します。

*3:cabocha_token_t 構造体に対応します。

*4:固有表現解析の結果は IOB2 形式で格納されます。CaboCha のウェブサイトに説明がありますので、そちらを参照してください。