ベイジアンフィルタ

ベイジアンフィルタ () は単純ベイズ分類器を応用し、対象となるデータを解析・学習し分類する為のフィルタ。学習量が増えるとフィルタの分類精度が上昇するという特徴をもつ。個々の判定を間違えた場合には、ユーザが正しい内容に判定し直すことで再学習を行う。
現状ではスパムメール（いわゆる迷惑メール）を振り分ける機能を持つソフトウェア（フィルタリングソフト）で、スパムフィルターでのスパム判定に利用されることが多い。最近ではWeblogのトラックバック用フィルタ（トラックバックスパム対策）にも利用されるようになるなど、その利用範囲は徐々に広がりつつある。
概要.
ベイジアンフィルタでは、初期状態である程度までの振り分けができるように設定されている。振り分け対象となるデータ（迷惑メールなど）の学習量が増えると振り分ける精度（分類精度）が高くなるといった特徴を持つ。個々の判定を間違えた場合にはユーザが判定し直すことで再学習を行う必要があるが、振分け精度が上がると再学習の頻度は少なくなる。
従来型のキーワード指定によるフィルタとは異なり、対象データの内容をフィルタが学習して自動的に分類する為、ユーザーが煩雑なキーワード指定を行う必要が無い。そのため適切なキーワード指定ができない初心者に向いている。
また、個々の迷惑メールの内容が変化した場合にも統計的に解析するため、大量の迷惑メールを受信する場合などにも向いている。
補足用機能として、特定のキーワードやアドレスのメールはフィルタに優先して受け付けるなどの機能を有するものもある。
登場の経緯.
従来のフィルタリングソフト（あるいは電子メールクライアントに組み込まれたフィルタリング機能）では、受信を拒否するアドレスや、受信した電子メールに記載された題名や本文に含まれる特定の単語（例えば「広告」「SEX」「交際」などといったキーワード）を一つ一つ設定する必要があるため、使用するためには煩雑な初期設定（条件設定）が必要であった。また、登録したキーワードの一文字を伏字（例えば "s*x"）にしたようなケースではフィルターを潜り抜けてしまうなど、キーワードやメールアドレスが可変的に付けられている迷惑メールに対してはほとんど無力であった。
このような問題に対応するため、迷惑メールの特徴を確率統計的な手法を用いて分析し、分類に利用する方法として登場したのがベイジアンフィルタである。ベイジアンフィルタでは妙な伏字を多用したメールはスパムメールの顕著な特徴であるため、下手な工作はかえってベイジアンフィルタによって排除されやすくなる。
ベイジアンフィルタは2002年にポール・グレアムが発表した論文“A Plan for Spam”が元になって開発された。さらに改良されたアルゴリズムは“Better Bayesian Filtering”に発表されている。
日本語環境特有の問題.
ベイジアンフィルタの解析は、単語単位でその数値を計算する。そのため、フィルタでデータを解析する前に、対象となる文章を単語単位に分解しておく必要がある。英語を含む多くの言語では、単語は普通空白によってあらかじめわかち書きされるため、単語単位に分解し直す必要はない。しかし、日本語のように単語を区切るための印がない言語の場合、そのままフィルタで解析を行っても、適切な解析結果が得られない。したがって、日本語の文章を適切な形に分解してから、ベイジアンフィルタに解析させる必要がある。
このように、言語の種類によって単語単位に分解する方法が異なるため、分解する方法の違いによってフィルタ精度が変化してしまう。
このような問題に対応するため、日本語に対応するベイジアンフィルタでは、形態素解析などの自然言語処理が追加されていることがある。
もうひとつの問題として、日本語のメールにおける文字コードの問題もある。通常日本語でのメールであれば、ISO-2022-JP文字コードを使うのが一般的である。しかし、MIMEによる文字コード指定 (charset) が適切であれば、別の文字コードで送ることも原理上可能である。そのため、MIME charsetを見て、文字コードを認識しないといけない。
さらに、日本語のspam（迷惑メール）では、ベイジアンフィルタ等をすりぬけるためか、MIMEによるキャラクタセットと実際の文字コードをわざと違うものにする（MIMEではISO-2022-JPと指定しておきながら、実際はShiftJIS等）こともある。そのため、本文のコードから文字コードを推定することも求められてしまう。この問題は、メールの送受信を行うソフトウェアが文字コードに関して寛容になりすぎていることも原因の一端であろう。
採用している主なソフト.
その他.
Web上に「ベイジアンフィルタを使っている」との情報があるが、メーカーサイトの公式情報にはその記述が無いもの