インターンの増田です。
ActiveRecordのデータを使ってベイジアンフィルタを使う必要があったので、この部分をプラグイン"Acts as classified":http://labs.airs.co.jp/projects/acts-as-classified として抜き出してみました。
インストール
依存しているライブラリをインストールします。
gem install classifier stemmer
プラグインをインストールします。
./script/plugin install svn://rubyforge.org/var/svn/actasclassified/trunk/acts_as_classified
また、日本語のデータを学習に用いる場合は"MeCab":http://mecab.sourceforge.net/ とそのRubyバインディングをインストールします。
日本語は(DB, MeCabともに)UTF-8を対象にしています。
使い方
分類したいモデルでacts_as_classifiedとします。
class Article < ActiveRecord::Base
acts_as_classified
end
Article#contentの内容を使ってArticle#categoryを自動判別したい場合、以下のようにします。
class Article < ActiveRecord::Base
acts_as_classified
add_classifier :category, :select => 'content'
end
第2引数はArticle.findで使うオプションと同じです。この例では、articlesテーブルからcontentカラムのデータを集めてcategory判別のための学習に使います。
add_classifierは複数設定できます。
ちなみに、学習するためにはすでにcategoryが設定してあるデータがDBに入っている必要があります。
categoryが「プログラミング」、「読書」、「仕事」、「買い物」、NULL、だとすると、
「プログラミング」、「読書」、「仕事」、「買い物」のどれに判別するかが学習されます。
NULLも判別先に含めたい場合は、
add_classifier :category, { :select => 'content' }, :allow_nil => true
とします。
ベイジアンフィルタを学習させるには以下のようにします。データベースに存在するデータからベイジアンフィルタが学習されます。
Article.train_classifiers
これで学習が済んだので、新しいArticleのインスタンスを分類することができます。分類対象のインスタンスはDBに保存されている必要があります。
article = Article.create(:content => '...省略...')
article.classify :category #=> "プログラミング"
また、
article.classify_and_update :category
で分類と保存を一度に行います。