Loading...

スパム対策プラン

Original

2002年8月

(この記事では、私たちがArcを練習するために構築したスパム防止のウェブベースのメールリーダーで使用されているスパムフィルタリング技術について説明します。 改善されたアルゴリズムについては、より良いベイズフィルタリングを参照してください。)

スパムを止めることは可能であり、コンテンツベースのフィルターがその方法であると考えています。スパマーの致命的な欠点は、彼らのメッセージです。彼らはあなたが設定した他のどんな障壁も回避することができます。少なくとも、これまでそうでした。しかし、彼らはどんなメッセージであれ、それを配信しなければなりません。彼らのメッセージを認識するソフトウェアを書くことができれば、彼らはそれを回避する方法はありません。


受信者にとって、スパムは簡単に認識できます。あなたが誰かにあなたのメールを読んでスパムを捨てるように雇った場合、彼らはそれをやるのに苦労することはありません。AIに頼らずに、このプロセスを自動化するために、どれだけのことをする必要があるのでしょうか?

私は、かなり単純なアルゴリズムで問題を解決できると考えています。実際、私は、個々の単語のスパム確率のベイズ結合以上のものを使用せずに、今日のスパムを許容できるレベルでフィルタリングできることを発見しました。わずかに調整された(以下で説明する)ベイズフィルターを使用すると、現在、1000件のスパムのうち5件未満を見逃しており、偽陽性は0件です。

統計的なアプローチは、スパムフィルターを作成する際に、人々が最初に試みる方法ではありません。ほとんどのハッカーの最初の本能は、スパムの個々の特性を認識するソフトウェアを書こうとすることです。あなたはスパムを見て、「この人たちは、"親愛なる友人"で始まるメールを送ったり、すべて大文字で書かれていて8つの感嘆符で終わる件名行を送ったりするとは、なんて厚かましいんだ」と思うでしょう。私は、1行のコードでその部分をフィルターアウトできます。

そして、あなたはそうします。そして、最初はうまくいきます。いくつかの単純なルールで、受信するスパムを大幅に減らすことができます。単に"クリック"という単語を探すだけで、私のスパムコーパス内のメールの79.7%をキャッチし、偽陽性はわずか1.2%です。

私は、統計的なアプローチを試す前に、約6か月間、個々のスパム機能を探すソフトウェアを書いていました。私が発見したのは、最後の数パーセントのスパムを認識することが非常に難しくなり、フィルターを厳しくするにつれて、偽陽性が増加したということです。

偽陽性は、スパムとして誤って識別された無害なメールです。ほとんどのユーザーにとって、正当なメールを見逃すことは、スパムを受信するよりもはるかに深刻な問題です。そのため、偽陽性を生み出すフィルターは、患者に死亡のリスクを伴うニキビ治療のようなものです。

ユーザーが受信するスパムが多ければ多いほど、スパムフォルダに無害なメールが1通あることに気づく可能性は低くなります。そして奇妙なことに、スパムフィルターが良くなればなるほど、偽陽性は危険になります。なぜなら、フィルターが本当に良くなると、ユーザーはフィルターがキャッチしたすべてを無視する可能性が高くなるからです。

なぜ統計的なアプローチを試すのを避けてきたのか、わかりません。それは、スパマーと一種の競争ゲームをしているかのように、スパム機能を自分で特定しようとすることに夢中になっていたからだと思います。(非ハッカーはしばしばこのことに気づきませんが、ほとんどのハッカーは非常に競争力があります。)統計分析を試したとき、私はすぐにそれが私が考えていたよりもはるかに賢いものであることに気づきました。もちろん、それは"virtumundo"や"teens"のような用語がスパムの良い指標であることを発見しました。しかし、それはまた、"per"や"FL"や"ff0000"がスパムの良い指標であることを発見しました。実際、"ff0000"(明るい赤のhtml)は、ポルノ用語と同じくらいスパムの良い指標であることが判明しました。


統計的フィルタリングを行う方法の概要を以下に示します。私は、スパムのコーパスと、スパムではないメールのコーパスを1つずつ開始します。現時点では、それぞれ約4000件のメッセージが含まれています。私は、各コーパス内の各メッセージのヘッダーと埋め込まれたhtmlとjavascriptを含む、すべてのテキストをスキャンします。現在、私は英数字、ダッシュ、アポストロフィ、ドル記号をトークンの一部と見なし、それ以外のすべてをトークンセパレータと見なしています。(ここには改善の余地があるかもしれません。)私は、すべてが数字であるトークンを無視し、htmlコメントも無視し、トークンセパレータとしても考慮しません。

私は、各トークン(現在、大文字と小文字を区別しない)が各コーパス内で何回出現するかをカウントします。この段階で、私は2つの大きなハッシュテーブルを取得します。1つは各コーパス用で、トークンを出現回数にマッピングします。

次に、私は3番目のハッシュテーブルを作成します。今回は、各トークンを、それを含むメールがスパムである確率にマッピングします。これは、次のように計算します[1]。


(let ((g (* 2 (or (gethash word good) 0))) (b (or (gethash word bad) 0))) (unless (< (+ g b) 5) (max .01 (min .99 (float (/ (min 1 (/ b nbad)) (+
(min 1 (/ g ngood)) (min 1 (/ b nbad)))))))))

ここで、wordは確率を計算しているトークンであり、goodと badは最初のステップで作成したハッシュテーブルであり、ngoodとnbad は、それぞれスパムではないメッセージの数とスパムメッセージの数です。

私は、いくつかの重要な詳細を示すために、これをコードとして説明しました。私は、偽陽性を避けるために、確率をわずかにバイアスしたいと考えています。そして、試行錯誤の結果、good内のすべての数を2倍にするのが良い方法であることがわかりました。これは、正当なメールに時々出現する単語と、ほとんど出現しない単語を区別するのに役立ちます。私は、合計で5回以上出現する単語のみを考慮します(実際には、2倍にしたため、スパムではないメールで3回出現すれば十分です)。そして、一方のコーパスには出現するが、もう一方のコーパスには出現しない単語にどのような確率を割り当てるかという問題があります。再び、試行錯誤の結果、.01と.99を選択しました。ここには調整の余地があるかもしれませんが、コーパスが大きくなると、そのような調整は自動的に行われます。

特に観察力のある人は、出現回数をカウントするために、各コーパスを1つの長いテキストストリームと見なしている一方で、スパム確率を計算する際の除数として、各コーパスのメールの数ではなく、それらの合計の長さを使用していることに気付くでしょう。これは、偽陽性を防ぐために、もう1つのわずかなバイアスを追加します。

新しいメールが到着すると、それはトークンにスキャンされ、最も興味深い15個のトークンが使用されて、メールがスパムである確率が計算されます。ここで、興味深いとは、スパム確率が中立の.5からどれだけ離れているかによって測定されます。probs が15個の個々の確率のリストの場合、あなたは 組み合わせ確率を次のように計算します。

(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))

実際には、これまで見たことがない単語、つまり単語確率のハッシュテーブルに存在しない単語にどのような確率を割り当てるかという問題が生じます。再び、試行錯誤の結果、.4が使用できる良い数字であることがわかりました。これまで見たことがない単語の場合、それはおそらくかなり無害です。スパムの単語は、あまりにもよく知られています。

このアルゴリズムが実際のメールに適用された例は、最後に付録に記載されています。

上記のアルゴリズムが、メールがスパムである確率が.9以上である場合、私はそのメールをスパムとして扱います。しかし、実際には、このしきい値をどこに置いてもそれほど違いはありません。なぜなら、ほとんどの確率は範囲の中央に終わらないからです。


統計的なアプローチの大きな利点の1つは、それほど多くのスパムを読む必要がないことです。過去6か月間、私は文字通り何千ものスパムを読んできました。それは本当に一種の意気消沈です。ノーバート・ウィーナーは、奴隷と競争すれば奴隷になるだろうと言いました。そして、スパマーと競争することには、それに似た何かが劣等感を感じさせます。個々のスパム機能を認識するには、スパマーの心に乗り込む必要があります。率直に言って、私はスパマーの心にできるだけ長く滞在したくありません。

しかし、もちろん、ベイズアプローチの真の利点は、あなたが何を測定しているのかを知っていることです。SpamAssassinのような機能認識フィルターは、メールにスパム"スコア"を割り当てます。ベイズアプローチは、実際の確率を割り当てます。 "スコア"の問題は、誰もその意味を知らないことです。ユーザーはその意味を知りませんが、さらに悪いことに、フィルターの開発者もその意味を知りません。 "sex"という単語を含むメールには、何ポイントを与えるべきでしょうか?確率は誤っている可能性がありますが、その意味や、それを計算するために証拠をどのように組み合わせるべきかについては、ほとんど曖昧さがありません。私のコーパスに基づいて、"sex"は、含まれているメールがスパムである確率が.97であることを示しており、一方、"sexy"は.99の確率を示しています。そして、同様に曖昧ではないベイズの法則は、他の証拠がない場合(ありそうもないことですが)、両方の単語を含むメールは、スパムである確率が99.97%であると言っています。

確率を測定しているため、ベイズアプローチはメール内のすべての証拠、良いものも悪いものも考慮します。スパムでまれに不均衡に発生する単語("though"や"tonight"や"apparently"など)は、"unsubscribe"や"opt-in"などの悪い単語が確率を高めるのと同じくらい、確率を下げるのに役立ちます。そのため、"sex"という単語が含まれているだけで、それ以外の点では無害なメールは、スパムとしてタグ付けされません。

もちろん、理想的には、確率は各ユーザーごとに個別に計算されるべきです。私は"Lisp"という単語を含むメールをたくさん受け取っていますが、(今のところ)スパムはありません。そのため、"Lisp"のような単語は、私にメールを送信するためのパスワードのようなものです。以前のスパムフィルタリングソフトウェアでは、ユーザーはこれらの単語のリストを設定することができ、それらの単語を含むメールは自動的にフィルターを通過していました。私のリストには、"Lisp"のような単語と、私の郵便番号も含まれていました。そのため、(それ以外の点では、かなりスパムっぽいサウンドの)オンライン注文の領収書が通過しました。私は自分が非常に賢いと思っていたのですが、ベイズフィルターが私と同じことをしていることに気づき、さらに、私が考えたことのない多くの単語を発見しました。

最初に、私たちのフィルターは1000件のスパムのうち5件未満を見逃し、偽陽性は0件であると述べましたが、これは、私のメールのコーパスに基づいて私のメールをフィルタリングしていることを意味します。しかし、これらの数字は誤解を招くものではありません。なぜなら、それは私が提唱しているアプローチだからです。つまり、各ユーザーのメールを、彼が受信したスパムとスパムではないメールに基づいてフィルタリングするのです。基本的に、各ユーザーは、通常の削除とスパムとして削除の2つの削除ボタンを持つ必要があります。スパムとして削除されたものはすべてスパムコーパスに、それ以外のものはすべてスパムではないコーパスに入ります。

ユーザーにシードフィルターを適用して開始することもできますが、最終的には、各ユーザーは、彼が実際に受信したメールに基づいた、単語ごとの確率を持つ必要があります。これは、(a) フィルターをより効果的にし、(b) 各ユーザーがスパムの正確な定義を決定できるようにし、(c) おそらく最も重要なことに、スパマーがフィルターを通過するようにメールを調整することを難しくします。フィルターの脳の多くが個々のデータベースにある場合、シードフィルターを通過するようにスパムを調整するだけでは、個々のユーザーの異なる、はるかに訓練されたフィルターを通過する程度について何も保証されません。

コンテンツベースのスパムフィルタリングは、多くの場合、ホワイトリストと組み合わされます。ホワイトリストは、フィルターなしでメールを受け入れることができる送信者のリストです。このようなホワイトリストを作成する簡単な方法は、ユーザーがこれまでメールを送信したことがあるすべてのアドレスのリストを保持することです。メールリーダーにスパムとして削除ボタンがある場合、ユーザーが通常のゴミ箱として削除したすべてのメールの送信元アドレスを追加することもできます。

私はホワイトリストの支持者ですが、フィルタリングを改善するためというよりも、計算を節約するための方法としてです。以前は、ホワイトリストはフィルタリングを容易にするだろうと思っていました。なぜなら、あなたは聞いたことがない人からのメールのみをフィルタリングする必要があるからです。そして、初めてあなたにメールを送信する人は、あなたに何を言えるかについて、慣習によって制約されています。すでに知っている人が、セックスについて話すメールを送信する可能性がありますが、初めてあなたにメールを送信する人は、そうする可能性は低いです。問題は、人々は複数のメールアドレスを持つことができるため、新しい送信元アドレスは、送信者が初めてあなたに書いていることを保証するものではないということです。古い友人(特にハッカーの場合)が、突然新しい送信元アドレスでメールを送信してくることは珍しくありません。そのため、未知のアドレスからのメールを特に厳しくフィルタリングすることで、偽陽性を冒すことはできません。

しかし、ある意味では、私のフィルターは、ヘッダーを含む、メール全体に基づいているため、一種のホワイトリスト(とブラックリスト)を体現しています。そのため、その程度まで、彼らは信頼できる送信者のメールアドレスや、メールが彼らから私に届くまでの経路を知っています。そして、彼らはスパムについても同じことを知っています。サーバー名、メーラーバージョン、プロトコルなどです。


現在のスパムフィルタリングの速度を維持できると考えれば、この問題は解決されたと考えるでしょう。しかし、今日のほとんどのスパムをフィルタリングできることは、それほど意味がありません。なぜなら、スパムは進化するからです。実際、ほとんどの スパム対策技術は、これまで、新しい耐性のあるバグを生み出す殺虫剤のようなものでした。

私は、ベイズフィルターについて、より楽観的です。なぜなら、それらはスパムとともに進化するからです。そのため、スパマーが、個々の単語に基づいた単純なスパムフィルターを回避するために、"cock"の代わりに"c0ck"を使用し始めると、ベイズフィルターは自動的にそれに気づきます。実際、"c0ck"は"cock"よりもはるかに有罪の証拠であり、ベイズフィルターはそれがどれほど有罪の証拠であるかを正確に知っています。

それでも、スパムフィルタリングの計画を提案する人は誰でも、次のような質問に答えることができなければなりません。スパマーがあなたのやっていることを正確に知っていたら、彼らはあなたをどれほどうまくすり抜けることができるでしょうか?たとえば、チェックサムベースのスパムフィルタリングが深刻な障害になる場合、スパマーは、メッセージ本文を生成するために、マッドリブ技術に切り替えるだけだと思います。

ベイズフィルターを打ち負かすには、スパマーがメールをユニークにするか、個々のわいせつな単語の使用をやめるだけでは十分ではありません。彼らは、メールをあなたの通常のメールと区別がつかないようにする必要があります。そして、私はこれが彼らを厳しく制限すると思います。スパムはほとんどがセールスレターなので、あなたの通常のメールがすべてセールスレターでない限り、スパムは必然的に異なる特徴を持つことになります。そして、もちろん、スパマーは、彼らのインフラストラクチャ全体を変更する(そして変更し続ける)必要もあります。なぜなら、そうでなければ、ヘッダーは、メッセージ本文に何をしたとしても、ベイズフィルターにとってこれまでと同じくらい悪に見えるからです。私は、スパマーが使用するインフラストラクチャについて十分に理解していないため、ヘッダーを無害に見せるのがどれほど難しいのかはわかりませんが、私の推測では、メッセージを無害に見せるよりもさらに難しいでしょう。

彼らがヘッダーの問題を解決できると仮定すると、将来のスパムはおそらく次のようなものになるでしょう。

Hey there. Thought you should check out the following: http://www.27meg.com/foo

なぜなら、それは、コンテンツベースのフィルタリングがスパマーに許すセールスレターの量です。(実際、これをフィルターを通過させることさえ難しいでしょう。なぜなら、メール内の他のすべてが中立的な場合、スパム確率はURLに依存し、それを中立に見せるには努力が必要になるからです。)

スパマーは、自分の身元を隠そうとしない、いわゆるオプトインリストを運営している企業から、ポルノサイトを宣伝するためにメールサーバーをハイジャックしている人まで、さまざまな人々です。フィルタリングを使用して、彼らの選択肢を上記のメールのようなメールに絞り込めば、それはスパマーをスペクトル上の"正当な"端に追い込むでしょう。彼らは、さまざまな州法によって、なぜ彼らのスパムがスパムではないのか、そしてどのように"購読"をキャンセルするかについて、定型文を含める義務を感じています。そして、その種のテキストは簡単に認識できます。

(以前は、より厳しい法律がスパムを減らすと信じるのはナイーブだと考えていました。今では、より厳しい法律は、スパマーが送信するスパムの量を減らすことはできないかもしれませんが、フィルターが受信者が実際に目にするスパムの量を減らすのに役立つことは確かです。)

スペクトル全体を通して、スパマーが作成できるセールスレターを制限すると、必然的に、彼らはビジネスから撤退する傾向があります。その単語ビジネスは、覚えておくべき重要な単語です。スパマーはビジネスマンです。彼らは、スパムが効果があるため、スパムを送信します。それは、応答率がひどく低い(カタログメールの300万件あたり3000件に対して、せいぜい100万件あたり15件)にもかかわらず、彼らにとってコストが事実上ゼロであるため、効果があります。受信者にとってコストは莫大です。100万人の受信者のうち、スパムを削除するために1秒間費やす人は、それぞれ約5人週間の費用がかかりますが、スパマーはそれを支払う必要はありません。

しかし、スパムを送信するには、スパマーにもコストがかかります[2]。そのため、フィルタリングによって、またはフィルターを使用してスパマーにピッチを希釈させることによって、応答率を低く抑えることができれば、スパムを送信する価値があると考える企業は少なくなります。

スパマーが セールスレターのようなものを使用する理由は、応答率を高めるためです。これは、スパマーの心に乗り込むよりも、おそらくさらに嫌なことです。しかし、スパムに応答する人の心に少しだけ覗いてみましょう。この人は、驚くほど信じやすい人か、自分の性的興味について深く否定しているかのどちらかです。どちらにしても、スパムは私たちにとって嫌悪感を与えるか、ばかげているように思えますが、彼らにとってはエキサイティングです。スパマーは、エキサイティングに聞こえなければ、これらのことは言いません。そして、"次のことを確認する必要があると思いました"は、スパマーが現在言っているようなものほど、スパム受信者に魅力的ではありません。結果:エキサイティングなセールスレターを含めることができない場合、スパムはマーケティングツールとしての効果が低くなり、それを利用したいと思う企業は少なくなります。

それが最終的な大きな勝利です。私は、もうそれを見る必要がないように、スパムフィルタリングソフトウェアを書き始めました。しかし、スパムをフィルタリングするのが十分に上手くなれば、それは機能しなくなり、スパマーは実際にスパムを送信することをやめるでしょう。


スパム対策のあらゆるアプローチの中で、ソフトウェアから法律まで、私はベイズフィルタリングが最も効果的であると考えています。しかし、私はまた、スパム対策の取り組みの種類が多ければ多いほど良いとも考えています。なぜなら、スパマーを制限するどんな対策も、フィルタリングを容易にする傾向があるからです。そして、コンテンツベースのフィルタリングの世界の中でも、さまざまな種類のソフトウェアが同時に使用されていることは良いことだと思います。フィルターの種類が多ければ多いほど、スパマーがフィルターを通過するようにスパムを調整することが難しくなります。

付録:フィルタリングの例

ここ は、この記事を書いている間に届いたスパムの例です。このスパムの中で最も興味深い15個の単語は次のとおりです。

qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675

単語は、ヘッダーとメッセージ本文からのものの混合であり、これはスパムの特徴です。スパムの特徴として、これらの単語のすべてが、私のデータベースでは、.99のスパム確率を持っています。実際には、.99の確率を持つ単語は15個以上あり、これらは最初に見た15個だけです。

残念ながら、これはベイズの法則の使用の退屈な例になります。さまざまな確率を見るには、 これ を見てください。これは、実際にはかなり異例のスパムです。

このスパムの中で最も興味深い15個の単語とその確率は次のとおりです。


madam 0.99 promotion 0.99 republic 0.99 shortest 0.047225013 mandatory 0.047225013 standardization 0.07347802 sorry 0.08221981 supported 0.09019077
people's 0.09019077 enter 0.9075001 quality 0.8921298 organization 0.12454646 investment 0.8568143 very 0.14758544 valuable 0.82347786

今回は、証拠は良いものと悪いものの混合です。 "shortest"のような単語は、"madam"や"promotion"のような単語が有罪であることを示すのと同じくらい、無実であることを示す証拠です。しかし、それでも有罪の証拠はより強いものです。これらの数字をベイズの法則に従って組み合わせると、結果として得られる確率は.9027になります。

"Madam"は、明らかに"Dear Sir or Madam"で始まるスパムからのものです。それらはそれほど一般的ではありませんが、"madam"という単語は、私の正当なメールには決して出現せず、すべて比率が問題です。

"Republic"は、多くの場合、ナイジェリアの詐欺メールに表示されるため、高いスコアを獲得しています。また、韓国や南アフリカに言及しているスパムにも1、2回出現します。それは、それがこのスパムを特定するのに役立つのは偶然であると言うかもしれません。しかし、スパム確率を調べたとき、私はこれらの偶然がたくさんあることに気づきました。そして、それらは、間違った方向ではなく、正しい方向に物事を押しやる傾向があります。この場合、"Republic"という単語がナイジェリアの詐欺メールとこのスパムに含まれているのは、まったくの偶然ではありません。発展途上国を巻き込んだ、疑わしいビジネス提案のクラス全体があり、それらは、共和国であることを明示的に指定する名前を持つ可能性が高くなります(なぜなら、それらは共和国ではないからです)[3]。

一方、"enter"は、本物のミスです。それは、ほとんどの場合、購読解除の指示に含まれていますが、ここでは完全に無害な方法で使用されています。幸いなことに、統計的なアプローチは非常に堅牢であり、結果が狂い始める前に、かなりの数のミスを許容できます。

比較のために、 ここ は、珍しい鳥、フィルターを通過するスパムの例です。なぜでしょうか?それは、偶然にも、私の実際のメールに含まれている単語でいっぱいになっているからです。


perl 0.01 python 0.01 tcl 0.01 scripting 0.01 morris 0.01 graham 0.01491078 guarantee 0.9762507 cgi 0.9734398 paul 0.027040077 quite 0.030676773 pop3
0.042199217 various 0.06080265 prices 0.9359873 managed 0.06451222 difficult 0.071706355

ここには、良いニュースが2つあります。まず、このメールは、プログラミング言語を専門としていて、Morrisという名前の良い友人がいない人のフィルターを通過しないでしょう。平均的なユーザーにとって、ここにある上位5つの単語はすべて中立であり、スパム確率に寄与しません。

第二に、私は、単語ペアに基づいたフィルタリング(以下を参照)がこのメールをキャッチする可能性が高いと考えています。"cost effective"、"setup fee"、"money back" - かなり有罪の証拠です。そして、もちろん、彼らが私(または私が所属しているネットワーク)にスパムを送り続けたら、"Hostex"自体がスパム用語として認識されるでしょう。

最後に、 ここ は無害なメールです。その最も興味深い15個の単語は次のとおりです。


continuation 0.01 describe 0.01 continuations 0.01 example 0.033600237 programming 0.05214485 i'm 0.055427782 examples 0.07972858 color 0.9189189
localhost 0.09883721 hi 0.116539136 california 0.84421706 same 0.15981844 spot 0.1654587 us-ascii 0.16804294 what 0.19212411

これらの単語のほとんどは、メールが無害であることを示しています。 "color"(スパマーは色のついたフォントが大好き)と"California"(これは、推薦状と、フォームのメニューにも含まれています)という2つの臭いのある単語がありますが、それらは、"continuation"や"example"のような明らかに無害な単語を上回るほどではありません。

"describe"がそれほど徹底的に無害であると評価されているのは興味深いことです。それは、私の4000件のスパムの1つにも出現していません。データは、そのような驚きでいっぱいであることが判明しました。スパムテキストを分析するときに学ぶことの1つは、スパマーが動作する言語のサブセットがどれほど狭いかということです。それは、個々のユーザーのメールの同様に特徴的な語彙とともに、ベイズフィルタリングを有望なものにしています。

付録:さらなるアイデア

私がまだ試していないアイデアの1つは、個々の単語ではなく、単語ペア、またはトリプルに基づいてフィルタリングすることです。これは、確率のより鋭い推定値をもたらすはずです。たとえば、私の現在のデータベースでは、"offers"という単語の確率は.96です。単語ペアに基づいて確率を計算した場合、"special offers"と"valuable offers"の確率は.99になり、"approach offers"("this approach offers"のように)の確率は.1以下になります。

私がこれを行っていない理由は、個々の単語に基づいたフィルタリングがすでに非常にうまく機能しているからです。しかし、それは、スパムが検出するのが難しくなれば、フィルターを強化する余地があることを意味します。(奇妙なことに、単語ペアに基づいたフィルターは、実際には逆方向に実行されるマルコフ連鎖テキストジェネレーターになります。)

特定のスパム機能(たとえば、受信者のアドレスがto:フィールドに表示されないこと)は、もちろん、スパムを認識する際に価値があります。それらは、仮想単語として扱うことで、このアルゴリズムで考慮することができます。私は、将来のバージョンでは、少なくとも最もひどいスパムインジケーターのいくつかについては、これを行うでしょう。機能認識スパムフィルターは、多くの詳細において正しいです。彼らに欠けているのは、証拠を組み合わせるための全体的な規律です。

スパム機能を認識することよりも、スパムではない機能を認識することの方が重要かもしれません。偽陽性は非常に心配なため、特別な対策が必要です。私は、将来のバージョンでは、偽陽性を避けるために特別に設計された、2番目のレベルのテストを追加するでしょう。メールがこの2番目のレベルのフィルターをトリガーした場合、スパム確率がしきい値を超えていても、それは受け入れられます。

この2番目のレベルのフィルタリングがベイズであるとは期待していません。それは、必然的に、アドホックであり、推測に基づいているでしょう。なぜなら、偽陽性の数は、パターンに気づくほど多くない傾向があるからです。(それは、バックアップシステムがプライマリシステムと同じテクノロジーに依存しない場合、良いことです。)

将来試すかもしれないもう1つのことは、メールの特定の部分に特別な注意を払うことです。たとえば、現在のスパムの約95%は、彼らが訪問してほしいサイトのURLを含んでいます。(残りの5%は、電話番号に電話をかけるように、メールまたは郵便で返信するように、または少数の場合は特定の株式を購入するように求めています。)URLは、そのような場合、メールがスパムかどうかを判断するのに十分なものです。

ドメイン名は、(ドイツ語以外の)メール内の他のテキストとは異なり、多くの場合、複数の単語がくっついて構成されています。一般的には計算量が多いですが、それらを分解してみる価値があるかもしれません。フィルターがこれまで"xxxporn"というトークンを見たことがない場合、個々のスパム確率は.4になります。一方、"xxx"と"porn"は、それぞれ.9889と.99の確率(私のコーパスでは)を持ち、組み合わせた確率は.9998になります。

スパマーがメッセージのテキストに有罪の単語を使用することを徐々にやめるようになると、ドメイン名を分解することがより重要になると予想されます。(IPアドレスを含むURLは、もちろん、非常に有罪の兆候です。ただし、少数のシステム管理者のメールを除きます。)

スパマーによって宣伝されているURLの共同で管理されたリストを持つことは、良い考えかもしれません。Raph Levienによって研究されたタイプの信頼メトリックが必要になります。これは、悪意のあるまたは無能な提出を防ぐためですが、そのようなものがあれば、どんなフィルタリングソフトウェアにもブーストを提供するでしょう。それは、ボイコットの便利な基礎にもなるでしょう。

疑わしいURLをテストするもう1つの方法は、ユーザーがそのURLを言及しているメールを見る前に、クローラーをそのサイトに送信することです。メールと同じように、ベイズフィルターを使用してサイトを評価することができます。そして、サイトで見つかったものはすべて、メールがスパムである確率を計算するために使用できます。リダイレクトにつながるURLは、もちろん、特に疑わしいです。

私が本当に良い考えだと思う共同プロジェクトの1つは、スパムの巨大なコーパスを蓄積することです。大きく、クリーンなコーパスは、ベイズフィルタリングをうまく機能させるための鍵です。ベイズフィルターは、実際にコーパスを入力として使用できます。しかし、そのようなコーパスは、他の種類のフィルターにも役立ちます。なぜなら、それを使用してテストできるからです。

そのようなコーパスを作成するには、いくつかの技術的な問題があります。もちろん、悪意のあるまたは無能な提出を防ぐために、信頼メトリックが必要になります。また、メール内の個人情報(toアドレスとccだけでなく、多くの場合toアドレスをエンコードしている購読解除URLの引数など)を消去する方法も必要になります。このプロジェクトを引き受けたい人がいれば、それは世界にとって良いことです。

付録:スパムの定義

スパムが何かについては、大まかなコンセンサスがあると思いますが、明示的な定義があると便利です。スパムの中心的なコーパスを確立したり、スパムフィルタリング率を意味のある方法で比較したりするには、これを行う必要があります。

まず、スパムは、迷惑な商業メールではありません。私の近所の人が、私が状態の良い古いRaleighの3段変速車を捜していることを聞き、それを売ると申し出るメールを送ってきた場合、私は喜ぶでしょう。しかし、このメールは、商業的であり、迷惑なものです。スパムの定義となる特徴(実際には、その存在理由)は、迷惑であることではなく、自動化されていることです。

スパムが通常商業的なものであることも、単なる偶然です。たとえば、誰かが、ある政治的な目的を支持するために、大量のメールを送信し始めた場合、それはポルノサイトを宣伝するメールと同じくらいスパムです。

私は、スパムを迷惑な自動メールと定義することを提案します。この定義には、スパムの多くの法的定義に含まれていないメールも含まれています。スパムの法的定義は、おそらくロビイストの影響を受けて、受信者と"既存の関係"を持つ企業が送信したメールを除外する傾向があります。たとえば、企業から何かを購入したとしても、あなたは彼らから継続的なメールを要求したことを意味しません。オンラインストアから何かを注文して、その後スパムのストリームが送られてきた場合、それは依然としてスパムです。

スパムを送信する企業は、多くの場合、"購読解除"の方法を提供したり、スパムの受信を停止したい場合は、サイトにアクセスして"アカウント設定"を変更するように求めています。これは、メールがスパムであることを止めるには十分ではありません。オプトアウトしないことは、オプトインすることと同じではありません。受信者が、メールの受信を希望するかどうかを明確にラベル付けされたボックス(デフォルトはno)を明示的にチェックしていない限り、それはスパムです。

一部のビジネス関係では、あなたは暗黙のうちに特定の種類のメールを要求しています。オンラインで注文する場合、あなたは暗黙のうちに領収書と、注文が発送されたときの通知を要求していると思います。Verisignが、ドメイン名が期限切れになることを警告するメールを送信しても、私は気にしません(少なくとも、彼らが 実際のレジストラである場合)。しかし、Verisignが、私のEコマースウェブサイトを構築するための無料ガイドを提供するメールを送信してきた場合、それはスパムです。

注記:

[1] この記事の例は、信じられないかもしれませんが、よりアクセスしやすくするために、Common Lispに翻訳されています。ここで説明されているアプリケーションは、まだリリースされていないArcと呼ばれる新しいLisp方言をテストするために私たちが書いたものです。

[2] 現在、最も低いレートは、100万件のスパムを送信するために約200ドルのようです。それは非常に安いです。スパム1件あたり0.5セントの1/50です。しかし、たとえば、スパムの95%をフィルタリングすると、スパマーが特定のオーディエンスに到達するためのコストが20倍になります。そのコストを吸収できるだけのマージンを持つ企業はほとんどいません。

[3] 経験則として、国の名前の前に修飾語が多いほど、支配者は腐敗しています。Xの社会主義人民民主共和国と呼ばれる国は、おそらく世界で最も住みたくない場所でしょう。

謝辞 この原稿を読んでくれたSarah Harlinに