Railsで簡単にベイジアンフィルタを使えるacts_as_classified

インターンの増田です。

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

で分類と保存を一度に行います。

Bookmark and Share