Born Too Late

Yuya's old tech blog.

PHP で N-gram を生成する

2010-10-22 02:04:15

PHP 用の N-gram 生成ライブラリ、 php5-Text_Ngram を Github に公開しました。
個人的な PHP 5.3 の練習ということで作ったので、 namespace 等を使っています。 5.3 未満では動きません。

yuya-takeyama's php5-Text_Ngram at master - GitHub

プロダクションとしての利用は想定していませんので、利用者ご自身の責任においてご利用ください。

Text_Ngram

文字列を N-gram 形式に分割するためのライブラリです。

N-gram オブジェクトを生成し、配列のように扱うことができます。

動作環境

PHP5 (>= PHP 5.3)

インストール

Openpear 経由でインストールできます。

sudo pear channel-discover openpear.org
sudo pear install openpear/Text_Ngram-beta

N-gram とは

例えば全文検索システムを構築する場合、前処理としてインデックスの作成が必要となります。
しかし、欧米の言語と違って、日本語はスペース等の一定のデリミタで区切ることはできません。
そこで、文章的な意味に関わらず、 n 文字ごとの分割した形式を使い、これを N-gram といいます。

分かち書きの方法としては、形態素解析も挙げられますが、 N-gram では辞書のメンテナンスが不要、という利点があります。
また、 n 文字ごとに分割する、という単純なルールなため、言語にかかわらず適用することができます。

使い方

N-gram オブジェクトの生成

require_once '/path/to/Text/Ngram.php';
use Text\Ngram;
$ngram = new Ngram('こんにちは世界!', 2, 'UTF-8');

配列への変換

$ngramArray = $ngram->toArray();

N-gram オブジェクトを配列の要に扱う

echo $ngram[0];     // => こん
echo $ngram[1];     // => んに
echo count($ngram); // => 7

イテレーション

foreach ($ngram as $key => $value) {
    echo "{$key} : {$value}" . PHP_EOL;
}

まとめ

初めにも書きましたが、あくまでも利用者ご自身の責任においてご利用ください。

Pure PHP なので、速くないと思います。
機能も最小限ですが、小規模なサービスでは問題なく使えるとおもいます。

テストはしている & 書いていますが、バグ等見つけたら、フィードバックいただけるとありがたいです。