クラスタリングツール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 Engineer's Blog)
- クラスタリングツールbayonがとてつもなく素晴らしいです! (たつをのChangeLog)
- クラスタリングツール「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なマイニング屋さんにはおすすめです!