$yuzu->log();

技術ネタなど。

【機械学習】ナイーブベイズ分類アルゴリズムを利用した迷惑メールフィルタ実装例

ナイーブベイズ分類器とは?

ベイズの定理を利用した分類手法です。 ベイズの定理について知りたい方は下記の参照下さい。

yuzurus.hatenablog.jp

 \displaystyle

ナイーブベイズ分類は文章をカテゴリ分けする際に、テキスト中の単語の出現率を調べます。 その際、その文章をどのカテゴリに分類するのが相応しいか調べるのです。

判定の際に \( P(B|A) \) は1つの確率ではなく、複数のカテゴリ中で、どのカテゴリになる確率が一番高いかを表す情報になります。 この時 \( P(A) \) は入力テキストが与えられる確率となります。

しかし、どのカテゴリを判定するにしても同じ入力になるため、同じ値と考えて良いこととします。するとナイーブベイズ分類は次のように表せます。

\( P(B|A) = P(B)P(A|B) \)

この時の \( P(B) \) は事前確率で、各カテゴリに分類される確率を表しています。

これは単なるベイズ分類器です。ナイーブベイズ分類器は確率分布 \(P(A|B) \) をシンプルな分布に限定します。

入力テキストAに関して、単語の集合と考えて、多次元変数と考えると

\( A={a1,a2,a3,…,aN} \)

と表せます。すると \(P(A|B) \) は

{ \displaystyle
P(A|B) = \prod_{i=1}^{N} P(a_i|B)
}

となります。

ナイーブベイズ分類を利用して迷惑メールフィルタを作ってみる

ナイーブベイズ分類アルゴリズムを内包したライブラリ「fieg/bayes」を利用して迷惑メールフィルタを作ってみましょう!
単語分類のためにMecabのインストールとphp-mecabのインストールが必要になります。

composerを利用してfieg/bayesというライブラリをインストールします

composer require fieg/bayes

単語分類器 MecabTokenizer.php

<?php
require_once 'vendor/autoload.php';
require_once 'mecab.inc.php';

use Fieg\Bayes\TokenizerInterface;

class MecabTokenizer implements TokenizerInterface {
  public function tokenize($str) {
    return mecab_parse_simple($str);
  }
}

単語分類器を利用したプログラムbayes-filter.php

<?php
require_once 'vendor/autoload.php';
require_once 'MecabTokenizer.php';

use Fieg\Bayes\Classifier;

// 単語分類器と分類器の生成
$tokenizer = new MecabTokenizer();
$classifier = new Classifier($tokenizer);

// 学習
$classifier->train('迷惑メール', '年収1000万を確実に稼ぐ方法');
$classifier->train('迷惑メール', '【FX】1年で資産120倍!このスゴイ講義が無料。ちょっと信じられません・・・');
$classifier->train('迷惑メール', '月利40%のモニター募集');
$classifier->train('迷惑メール', '【年利174%】99.9%の確率で含み損が利益になるプロ技');
$classifier->train('迷惑メール', '【2日で1億1800万円】英国EU離脱騒動で稼いだオトコの正体');
$classifier->train('迷惑メールでない', '暮らしを便利にするマストアイテムを65%OFF');
$classifier->train('迷惑メールでない', 'アンケートにご回答いただくと30ポイントプレゼント【楽天】(2016/09/17)');
$classifier->train('迷惑メールでない', '【お急ぎください!】9月連休出発高速バス予約ラストチャンス!');
$classifier->train('迷惑メールでない', 'Amazon.co.jpからポイント付与についてお知らせ');
$classifier->train('迷惑メールでない', '【住信SBIネット銀行】定額自動振込サービス振込受付のお知らせ  ');

$s = '【衝撃映像】『日給1100万円確定』の瞬間を捉えた!';
$r1 = $classifier->classify($s);
echo "--- $s\n";
print_r($r1);

$s = '【早割】特大和洋中おせち♪国産南高梅の木箱ギフトなど【楽天】(2016/09/18)';
$r2 = $classifier->classify($s);
echo "--- $s\n";
print_r($r2);

これを実行してみると

php bayes-filter.php
--- 【衝撃映像】『日給1100万円確定』の瞬間を捉えた!
Array
(
    [迷惑メール] => 0.9
    [迷惑メールでない] => 0.1
)
--- 【早割】特大和洋中おせち♪国産南高梅の木箱ギフトなど【楽天】(2016/09/18)
Array
(
    [迷惑メールでない] => 0.99980407523511
    [迷惑メール] => 0.00019592476489028
)

簡単なテストですが、ちゃんと分類されてますね!

ソースはここにおいておきます。

github.com