【機械学習】ナイーブベイズ分類アルゴリズムを利用した迷惑メールフィルタ実装例
ナイーブベイズ分類器とは?
ベイズの定理を利用した分類手法です。 ベイズの定理について知りたい方は下記の参照下さい。
ナイーブベイズ分類は文章をカテゴリ分けする際に、テキスト中の単語の出現率を調べます。 その際、その文章をどのカテゴリに分類するのが相応しいか調べるのです。
判定の際に \( 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) \) は
となります。
ナイーブベイズ分類を利用して迷惑メールフィルタを作ってみる
ナイーブベイズ分類アルゴリズムを内包したライブラリ「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 )
簡単なテストですが、ちゃんと分類されてますね!
ソースはここにおいておきます。