クラスタリングツールbayonを便利に使うText::Bayonを書きましたよ

JPerl Advent Calender 2009 のhacker trackに「Perlではじめるテキストマイニング」というタイトルで記事を書きました。テキストマイニング系のモジュールを色々紹介しているので、興味ある人はぜひご覧ください。

さてさて、記事の最後の方で軽くふれましたが、つい先日 Text::Bayon というモジュールをリリースしました。

Text::Bayon - Handling module for the clustering tool 'bayon'
CPAN : http://search.cpan.org/~miki/Text-Bayon/
Github : http://github.com/miki/Text-Bayon

それの具体的な使い方を紹介します。

何をするものか?

Text::Bayonはクラスタリングツールbayonをperlスクリプトからスマートに利用することを目的としたモジュールです。

「bayonってなに?」という方はこちらを先に読んでください

bayonとはmixiのfujisawaさんが開発&公開されてい軽量クラスタリングツールです。
bayonの特徴としては、「速い、インタフェースが優しい、ライセンス的にも優しい、日本語ドキュメントがちゃんとある」といったところがあげられるかと思います。

わたしも仕事でずいぶん使わせてもらってますが、精度もけっこういいと思います。はい。

で、ちょこちょこ使っていて思ったんですが、

分析用データをperlなどで作る
   ↓
ファイル出力
   ↓
bayonコマンドでクラスタリング
   ↓
ファイル出力
   ↓
結果データを加工するためのスクリプトで処理

みたいな感じで、ほとんどの場合bayonへのやり取りの前後になにがしかのデータ加工処理が必要となるんですが、毎回毎回タスクが分断されて、ちょいとかったるいな、と。
そこでbayonへのやりとりも含めてperlスクリプトに突っ込めると、とてもスマートになるなぁと思い、そこらへんを実装してしまったのがText::Bayonです。

入出力のカタチ

まずは基本的な使い方。「データ to データ」な場合です。

use strict;
use Text::Bayon;

my $bayon = Text::Bayon->new;

# 架空のデータ生成関数
# { ドキュメントID => { 単語 => スコア, ... }, ... } なデータ構造を生成
my $input = _gene_data(); 

# Bayonに渡す任意のオプション
my %options = (
    number => 10,
    point  => 1,
    idf    => 1,
);

# クラスタリング!
my $output = $bayon->clustering($input_data, \%options);

print Dumper $output;
# 結果データはこんな構造
# { クラスタ => [ ドキュメントID, ドキュメントID, ... ], ... }

すっきり書けますね。
「ファイルに出力して、bayonコマンドに投げて、結果ファイルをまたロードして...」みたいな面倒いことをする必要はありません。
裏でText::Bayonがそのまんまの処理を請け負います。

ちなみに「ファイル to ファイル」な処理も1本のスクリプト内で完結できたりもします。

my %option = (
	l => 2.0
);

my %output = (
	output => 'bayon_out.tsv'
);

# 入出力をファイルに指定して実行
# bayon_out.tsvに結果が出力される
$bayon->clustering( 'bayon_in.tsv', \%options, \%output);

まぁこの場合はスクリプトなんかにしないで「 bayon -l 2.0 bayon_in.tsv > bayon_out.tsv 」ってコマンドたたいた方が早いか。

でも「ファイル to データ」とか「データ to ファイル」みたいな変則的なケースにも対応できるので、その場合には役に立ちます。

# --------------------
# ファイル to データ
# --------------------

my $output = clustering('bayon_in.tsv');

# --------------------
# データ to ファイル
# --------------------

my $input = _gene_data(); 

my %output = (
	output => 'bayon_out.tsv'
);

# 入力はデータ、出力はファイルに指定
$bayon->clustering( $input , undef, \%output);

ソフトクラスタリングにも対応

bayonにはclassifyというオプションがあって、ソフトクラスタリング相当の処理もできるようになっています。

なのでこれもclassify()というメソッドでカバーしています。

# clvectorを有効にしてクラスタリング 
my %option = (
	clvector => 1, # optionでclvectorを有効にする
);
my %output = (
	output   => 'bayon_out.tsv',
	clvector => 'centroid.tsv'    # clvectorの出力ファイル名を指定
);
$bayon->clustering( $input, \%option, \%output );


# 取得したcentroid.tsvと、もとの$inputを使ってclassify

my $classify_result = $bayon->classify($input, { clvector => 'centroid.tsv'} );

ちょっとclvectorの周辺が回りくどくてイケテナイんですが、まぁ一応こんな感じで1本のスクリプトにおさめることができます。

さらに詳しく

さらに詳しくはbayonのマニュアルを読んでください。オプションの指定とか色々あるので。

マニュアルサイト > http://code.google.com/p/bayon/wiki/Tutorial_ja

その上でText::BayonのPODをみれば、何となくわかってもらえるかな、と思います。

なんか最後の方、だいぶ投げやり気味になってしまいましたが、Light-weightなマイニング屋さんにはおすすめです!