プログラマでありたい

おっさんになっても、プログラマでありつづけたい

ベイジアンフィルター Perlで作りたい人に教えてあげたいちょっとしたこと

 昨日のはてなのホットエントリーに『入門ベイズ統計』の読みどころという記事が載っていました。ベイズ理論の人気は根強いですね。
 ベースとしての数式は割とシンプルなので、自分で実装してもそれ程手間は掛からないかもしれません。しかし、CPANのモジュールとして提供されているので、そちらを使用するのも良いかと思います。私が知っている所では、Algorithm::NaiveBayesが簡単で使いやすかったです。


 昔書いたコードですが、下のサンプルでは簡単なスパムフィルターを作っています。spam.txtとham.txtは、それぞれのコーパスを形態素解析して作った単語のみのリストです。test.txtは、判定したい文章から抽出した単語のリストです。スパムとハムの量を増やせば、これだけでも割と使い物になります。
 応用例としては、スパムとハムの2種類のカテゴリだけではなく、複数種類のカテゴリを作ればブログの自動分類等も出来るでしょう。コーパスとしては、はてなのタグやYahoo!ブログの各カテゴリから自動収集する仕組みを作れば面白いのでは?ブログ等の文章の自動カテゴライズ等が出来ると思います。

#!/usr/bin/perl

use strict;
use warnings
use Algorithm::NaiveBayes;
use Data::Dumper;

my $bayes = Algorithm::NaiveBayes->new;
my %list;

%list = &getHash("spam.txt");
$bayes->add_instance(
    attributes => {%list},
    label => 'spam',
);

%list = &getHash("ham.txt");
$bayes->add_instance(
    attributes => {%list},
    label => 'ham',
);

$bayes->train;

%list = &getHash("test.txt");
my $result = $bayes->predict(
    attributes => {%list}
);

print Dumper($result);

sub getHash {
  my $file = $_[0];
  my %hash;
  open INFILE, "< $file" or die "Cannot open file: $file";
  while (<INFILE>) {
    chomp();
    if (!$hash{$_}) {$hash{$_} = 0};
    $hash{$_} = $hash{$_}+1;
  }
  return %hash;
}


この例ですと、都度判定用のデータベースを作っているので効率が悪いです。実際に使うときは、Algorithm::NaiveBayes::Model::Frequencyで永続化するといったことが必要です。(その前にべた書きなので、OOで作りなおした方がよいでしょうが)


入門ベイズ統計―意思決定の理論と発展