ベイジアンフィルタとは、迷惑メールなどを判定する際に利用されることが多いフィルタです。対象となるデータを解析・学習し、データを分類することができます。
学習量が増えるとフィルタの分類精度が上がる特徴をもっており、未知のデータで分類が期待した結果にならない場合は、そのデータを機械学習させることで精度が上昇していきます。また、キーワードではなく文章を機械に学習させるため、学習が容易で、キーワードを指定したフィルタが難しい場合にも適しています。
想定される利用例
テンプレートタグとして機能を実装するためメールに限らず利用可能ですが、よくある利用例はお問い合わせメールのスパム判定があります。
また、文章をカテゴリ分けして学習させることで、カテゴリを判別することもできます。たとえば、サッカーについて書いてある・野球について書いてあるなどです。サッカーについて書かれていればAさんを担当にし、野球について書かれていればBさんを担当にするなども可能です。
内容が〇〇なら□□する。この〇〇は学習させる内容、□□はアイデア次第です。
実装の流れ
PowerCMS Xプラグインとして、以下の流れで実装します。
- 学習データを保存するモデルの作成
- データを解析して学習する機能の実装
- データを分類する機能(テンプレートタグ)の実装
学習データを保存するモデルの作成
以下の4モデルを作成します。
モデル名 | 日本語ラベル | 概要 |
---|---|---|
bayes_term_block | ベイズ文章 | 学習させるデータ(文章)を保存 |
bayes_term | ベイズ単語 | データを解析した単語を保存 |
bayes_category | ベイズカテゴリ | フィルタが分類するカテゴリを保存 |
bayes_term_category | ベイズ単語カテゴリ | カテゴリ別で単語の登場回数を保存 |
具体的なカラムはここでは割愛しますが、開発時はPowerCMS Xの管理画面からモデルを作成すると良いでしょう。今回はプラグインとして実装しますので、開発が完了したら上記4モデルを管理画面からjsonファイルでエクスポートします。
エクスポートしたファイルは、プラグインディレクトリ直下にmodelsディレクトリを作成して追加します。プラグインの有効化後にダッシュボードにアクセスして、スキーマアップグレードの通知があればCMSに認識されていますので、スキーマアップグレードすることでプラグインから利用するモデルを作成できます。
データを解析して学習する機能の実装
学習はキーワードではなく文章で行います。文章のままでは内容を分類できないため、内部的にはMeCabで解析した単語を保存しています。
今回の説明では、サッカーについて書かれた以下の文章を学習します。
学習する文章
スペインが欧州制覇に王手!フランス撃破で3大会ぶり決勝進出…16歳ヤマルが最年少弾
上記の文章を、ベイズ文章モデルに保存した際にpost_saveコールバックで解析して学習します。
単語・カテゴリの学習を保存
上記の文章をMeCabで解析した結果、16個の単語になりました。この単語をベイズ単語モデルに保存します。
また、ベイズカテゴリモデルにサッカーについて学習したことを記録します。
上記キャプチャでは、サッカーについて1度学習し、16個の単語が登録されたことを表しています。この記事の冒頭で、ベイジアンフィルタは学習量が増えるとフィルタの分類精度が上がる特徴をもっていると書きましたが、サッカーについて書かれた文章を繰り返し学習させることで、データが蓄積されて精度が上がってきます。
今回の説明では、サッカーについて学習させていますが、野球・テニス・バレー・バスケなどいろいろなスポーツについて学習させることで、文章がどのスポーツのことを書いているか分類できるようになります。
データを分類する機能(テンプレートタグ)の実装
ある程度学習させたら文章の分類を取得する機能を実装します。プラグインでテンプレートタグを実装し、利用しやすいようにします。プラグインでのテンプレートタグ実装方法はプラグインによるテンプレートタグの実装を参考にすると良いでしょう。
ファンクションタグの実装
データの分類を取得するファンクションタグ <mt:Predict> を実装し、データが属するカテゴリを返します。
<mt:SetVarBlock name="text">
大谷翔平 28号ソロホームラン 大リーグ通算200号まであと1本
</mt:SetVarBlock>
<mt:Predict value="$text" />
// -> 野球
<mt:SetVarBlock name="text">
元日本代表MF清武弘嗣がサガン鳥栖へ期限付き移籍決定「今までの経験をチームの為に全てを注ぎ込みたい」
</mt:SetVarBlock>
<mt:Predict value="$text" setvar="text_category" />
// -> サッカー
<mt:If name="text_category" eq="サッカー">
サッカーについて書かれています。
<mt:ElseIf name="text_category" eq="野球">
野球について書かれています。
</mt:If>
スポーツについて学習させるのではなく、スパムメール・スパムではないメールを学習させると、お問い合わせフォームの内容からスパムメールの判定が可能です。
PowerCMS Xのフォーム機能は、件名・メール内容・送信先にテンプレートタグが利用できます。つまり、スパムメールなら件名やメール内容・送信先を変更したりできますね。
まとめ
PowerCMS Xは非常に拡張性の高いCMSです。モデル(DBのテーブル)やテンプレートタグがプラグインから拡張可能なため、こういったデータを蓄積する処理もプラグインで実装することができます。 プラグイン実装でお悩みのことがあればお気軽にご相談ください。
今後の予定
- 学習データの削除対応
- csvから学習データのインポート
- 非同期でデータ分類の取得(RESTful APIのエンドポイント追加など)
- 複数のフィルタ対応(親子カテゴリの追加など)