スパム対策の計画
Original2002年8月
(この記事では、Arcを試すために構築したスパム対策のウェブベースのメールリーダーで使用されるスパムフィルタリング技術について説明します。改善されたアルゴリズムについては、Better Bayesian Filteringで説明されています。)
私はスパムを止めることが可能であり、コンテンツベースのフィルタがその方法であると考えています。スパマーのアキレス腱は彼らのメッセージです。彼らはあなたが設定した他の障壁を回避することができます。少なくとも今のところは。しかし、彼らは何であれメッセージを届けなければなりません。もし私たちが彼らのメッセージを認識するソフトウェアを書くことができれば、彼らはそれを回避することはできません。
受信者にとって、スパムは簡単に認識できます。もし誰かを雇ってあなたのメールを読み、スパムを捨てさせたら、彼らはそれをするのにほとんど苦労しないでしょう。AIを除いて、このプロセスを自動化するためにどれだけのことをしなければならないのでしょうか?
私は、かなりシンプルなアルゴリズムで問題を解決できると考えています。実際、私は現在のスパムを個々の単語のスパム確率のベイジアンの組み合わせだけで十分にフィルタリングできることを発見しました。少し調整した(以下に説明)ベイジアンフィルタを使用すると、現在、1000件のスパムのうち5件未満を見逃し、偽陽性は0です。
統計的アプローチは、スパムフィルタを書くときに人々が最初に試すものではありません。ほとんどのハッカーの最初の本能は、スパムの個々の特性を認識するソフトウェアを書くことです。スパムを見て、「親愛なる友人」と始まるメールや、すべて大文字で8つの感嘆符で終わる件名のメールを送ってくる彼らの厚かましさを考えます。私はそのようなものを約1行のコードでフィルタリングできます。
そして、あなたはそうします。そして最初はうまくいきます。いくつかのシンプルなルールで、受信するスパムの大きな部分を取り除くことができます。「クリック」という単語を探すだけで、私のスパムコーパスの79.7%のメールをキャッチし、偽陽性はわずか1.2%です。
私は約6ヶ月間、個々のスパムの特徴を探すソフトウェアを書いていましたが、統計的アプローチを試す前に、最後の数パーセントのスパムを認識するのが非常に難しくなり、フィルタを厳しくするにつれて偽陽性が増えることがわかりました。
偽陽性は、誤ってスパムとして識別される無害なメールです。ほとんどのユーザーにとって、正当なメールを見逃すことはスパムを受け取ることよりもはるかに悪いことです。したがって、偽陽性を生じるフィルタは、患者に死のリスクを伴うニキビ治療のようなものです。
ユーザーが受け取るスパムが多ければ多いほど、彼はスパムフォルダにある無害なメールに気づく可能性が低くなります。そして奇妙なことに、スパムフィルタが良くなるほど、偽陽性はより危険になります。なぜなら、フィルタが本当に良いとき、ユーザーはキャッチしたすべてを無視する可能性が高くなるからです。
なぜ私はこれほど長い間、統計的アプローチを試すのを避けていたのかわかりません。おそらく、私はスパマーと競争するような形でスパムの特徴を特定しようとすることに中毒になっていたからだと思います。(非ハッカーはこれをあまり理解しませんが、ほとんどのハッカーは非常に競争的です。)統計分析を試みたとき、私はすぐにそれが私よりもはるかに賢いことを発見しました。もちろん、「virtumundo」や「teens」のような用語がスパムの良い指標であることを発見しました。しかし、「per」や「FL」、「ff0000」もスパムの良い指標であることを発見しました。実際、「ff0000」(明るい赤のHTML)は、どのポルノ用語と同じくらいスパムの良い指標であることがわかりました。
以下は、私が統計的フィルタリングを行う方法の概要です。私はスパムのコーパスと非スパムのメールのコーパスを1つずつ持っています。現在、それぞれには約4000件のメッセージがあります。私は各コーパス内の各メッセージの全テキスト、ヘッダーや埋め込まれたHTMLやJavaScriptをスキャンします。現在、私は英数字、ダッシュ、アポストロフィ、ドル記号をトークンの一部と見なし、それ以外のすべてをトークンセパレーターと見なしています。(ここには改善の余地があるかもしれません。)私はすべての数字からなるトークンを無視し、HTMLコメントも無視し、トークンセパレーターとして考慮しません。
私は各トークン(現在は大文字小文字を無視)を各コーパス内で発生する回数をカウントします。この段階で、私は各コーパスのトークンを出現回数にマッピングする2つの大きなハッシュテーブルを得ます。
次に、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回出現するだけで十分です)。そして、1つのコーパスに出現するが他のコーパスには出現しない単語にどの確率を割り当てるかという問題があります。再び試行錯誤によって、私は0.01と0.99を選びました。ここには調整の余地があるかもしれませんが、コーパスが成長するにつれて、その調整は自動的に行われるでしょう。
特に観察力のある人は、各コーパスを出現回数をカウントする目的で単一の長いテキストストリームと見なす一方で、スパム確率を計算する際の除数として各コーパス内のメールの数を使用していることに気づくでしょう。これは、偽陽性を防ぐためのわずかなバイアスを追加します。
新しいメールが到着すると、それはトークンにスキャンされ、スパム確率が中立の0.5からどれだけ離れているかで測定される最も興味深い15のトークンが、メールがスパムである確率を計算するために使用されます。もしprobsが15の個々の確率のリストであれば、あなたは結合された確率を次のように計算します:
(let ((prod (apply #'* probs))) (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs)))))
実際に生じる1つの質問は、ハッシュテーブルの単語確率に存在しない単語にどの確率を割り当てるかということです。私は再び試行錯誤によって、0.4が良い数字であることを発見しました。もしあなたが以前に単語を見たことがなければ、それはおそらくかなり無害です。スパムの単語はあまりにも馴染み深い傾向があります。
このアルゴリズムが実際のメールに適用される例は、最後の付録にあります。
私は、上記のアルゴリズムがスパムである確率を0.9以上とする場合、メールをスパムとして扱います。しかし、実際にはこの閾値をどこに置いてもあまり重要ではありません。なぜなら、ほとんどの確率は範囲の中間に終わることはないからです。
統計的アプローチの大きな利点の1つは、これほど多くのスパムを読む必要がないことです。過去6ヶ月間、私は文字通り何千件ものスパムを読みましたが、それは本当に士気を削ぐものです。ノーバート・ウィーナーは、奴隷と競争すると奴隷になると言いましたが、スパマーと競争することにも同様に屈辱的なものがあります。個々のスパムの特徴を認識するためには、スパマーの心の中に入ろうとしなければなりません。そして正直なところ、私はスパマーの心の中にできるだけ少ない時間を費やしたいと思っています。
しかし、ベイジアンアプローチの本当の利点は、もちろん、あなたが何を測定しているのかを知っていることです。特徴認識フィルタのようなSpamAssassinは、メールにスパム「スコア」を割り当てます。ベイジアンアプローチは実際の確率を割り当てます。「スコア」の問題は、それが何を意味するのか誰も知らないことです。ユーザーはそれが何を意味するのかわからず、さらに悪いことに、フィルタの開発者もそれが何を意味するのかわかりません。「sex」という単語が含まれているメールには何ポイント与えるべきでしょうか?確率はもちろん間違っている可能性がありますが、それが何を意味するのか、またそれを計算するために証拠をどのように組み合わせるべきかについてはほとんど曖昧さがありません。私のコーパスに基づくと、「sex」はそのメールがスパムである確率が0.97であるのに対し、「sexy」は0.99の確率を示します。そして、ベイズの法則は同様に明確であり、両方の単語を含むメールは、(他の証拠がない場合)99.97%の確率でスパムであると言います。
確率を測定しているため、ベイジアンアプローチはメール内のすべての証拠、良いものと悪いものの両方を考慮します。スパムにおいて不釣り合いにまれに出現する単語(「though」や「tonight」や「apparently」など)は、スパムの確率を減少させるのに貢献し、悪い単語(「unsubscribe」や「opt-in」など)はそれを増加させるのに貢献します。したがって、たまたま「sex」という単語を含む無害なメールはスパムとしてタグ付けされることはありません。
理想的には、もちろん、確率は各ユーザーごとに個別に計算されるべきです。私は「Lisp」という単語を含むメールをたくさん受け取りますが、(今のところ)それを含むスパムはありません。したがって、そのような単語は私にメールを送るためのパスワードのようなものです。私の以前のスパムフィルタリングソフトウェアでは、ユーザーはそのような単語のリストを設定でき、それを含むメールは自動的にフィルタを通過しました。私のリストには「Lisp」や私の郵便番号のような単語を入れました。そうすることで、(それ以外はかなりスパムっぽい)オンライン注文の領収書が通過することができました。私は非常に賢いと思っていましたが、ベイジアンフィルタが私のために同じことを行い、さらに私が考えもしなかった多くの単語を発見したことがわかりました。
私が最初に言ったように、私たちのフィルタは1000件あたり5件未満のスパムを通過させ、偽陽性は0です。これは私のメールに基づいてフィルタリングしていることを意味します。しかし、これらの数字は誤解を招くものではありません。なぜなら、私は提唱しているアプローチが、各ユーザーの受信するスパムと非スパムのメールに基づいてそのメールをフィルタリングすることだからです。基本的に、各ユーザーは通常の削除ボタンとスパムとして削除ボタンの2つの削除ボタンを持つべきです。スパムとして削除されたものはスパムコーパスに入り、それ以外のすべては非スパムコーパスに入ります。
ユーザーにはシードフィルタから始めることができますが、最終的には各ユーザーが受信する実際のメールに基づいて独自の単語ごとの確率を持つべきです。これにより、(a) フィルタがより効果的になり、(b) 各ユーザーがスパムの正確な定義を決定できるようになり、(c) おそらく最も良い点は、スパマーがフィルタを通過するためにメールを調整するのが難しくなることです。フィルタの脳の多くが個々のデータベースにある場合、シードフィルタを通過するようにスパムを調整するだけでは、個々のユーザーの異なる、はるかに訓練されたフィルタを通過するのがどれだけうまくいくかは保証されません。
コンテンツベースのスパムフィルタリングは、ホワイトリストと組み合わせることがよくあります。ホワイトリストは、フィルタリングなしで受け入れられる送信者のリストです。このようなホワイトリストを構築する簡単な方法は、ユーザーがこれまでにメールを送信したすべてのアドレスのリストを保持することです。メールリーダーにスパムとして削除ボタンがあれば、ユーザーが通常のゴミとして削除したすべてのメールの送信元アドレスも追加できます。
私はホワイトリストの支持者ですが、フィルタリングを改善する方法としてよりも計算を節約する方法として支持しています。私は以前、ホワイトリストがフィルタリングを容易にすると思っていました。なぜなら、あなたは聞いたことのない人からのメールだけをフィルタリングすればよく、初めてあなたにメールを送る人は、慣習的にあなたに言えることに制約があるからです。すでに知っている誰かがセックスについて話すメールを送るかもしれませんが、初めてメールを送る人はそうする可能性は低いでしょう。問題は、人々が複数のメールアドレスを持つことができるため、新しい送信元アドレスが送信者が初めてあなたに書いていることを保証するわけではないことです。古い友人(特に彼がハッカーである場合)が突然新しい送信元アドレスでメールを送ってくることは珍しくないので、特に厳格に未知のアドレスからのメールをフィルタリングすることで偽陽性のリスクを冒すことはできません。
とはいえ、私のフィルタは、ヘッダーを含む全メッセージに基づいているため、ある種のホワイトリスト(およびブラックリスト)を体現しています。そのため、その点において、彼らは信頼できる送信者のメールアドレスや、彼らから私にメールが届くルートを「知っている」と言えます。そして、彼らはスパムについても同様のことを知っています。サーバー名、メール送信者のバージョン、プロトコルを含めて。
もし私が現在のスパムフィルタリングのレートを維持できると思ったら、この問題は解決されたと考えるでしょう。しかし、ほとんどの現在のスパムをフィルタリングできることはあまり意味がありません。なぜなら、スパムは進化するからです。実際、これまでのほとんどのアンチスパム技術は、新しい耐性のあるバグの株を作り出す以外の何物でもありません。
私はベイジアンフィルタに対してより希望を持っています。なぜなら、彼らはスパムと共に進化するからです。スパマーが単純なスパムフィルタを回避するために「c0ck」を「cock」の代わりに使用し始めると、ベイジアンフィルタは自動的にそれに気づきます。実際、「c0ck」は「cock」よりもはるかに有罪の証拠であり、ベイジアンフィルタはその差を正確に知っています。
それでも、スパムフィルタリングの計画を提案する人は、次の質問に答えられなければなりません。もしスパマーがあなたが何をしているのか正確に知っていたら、彼らはどれだけうまくあなたを通過できるでしょうか?たとえば、チェックサムベースのスパムフィルタリングが深刻な障害になると、スパマーはメッセージ本文を生成するためにマッドリブ技術に切り替えるだけだと思います。
ベイジアンフィルタを打ち負かすためには、スパマーはメールをユニークにするだけでは不十分です。彼らは自分のメールをあなたの普通のメールと区別できないようにしなければなりません。そして、これが彼らを厳しく制約すると思います。スパムは主に販売の提案です。したがって、あなたの通常のメールがすべて販売の提案でない限り、スパムは必然的に異なる性格を持つことになります。そして、スパマーはもちろん、彼らの全インフラを変更(そして変更し続け)なければなりません。そうしないと、ヘッダーはベイジアンフィルタにとっては依然として悪いものに見えるでしょう。彼らがメッセージ本文に何をしても。スパマーが使用するインフラについて十分に知らないので、ヘッダーを無害に見せるのがどれほど難しいかはわかりませんが、私の推測では、メッセージを無害に見せるよりもさらに難しいでしょう。
彼らがヘッダーの問題を解決できると仮定すると、未来のスパムはおそらく次のようなものになるでしょう:
こんにちは。次のものをチェックするべきだと思いました: http://www.27meg.com/foo
なぜなら、それはコンテンツベースのフィルタリングがスパマーに残す販売の提案としてはこれが限界だからです。(実際、これをフィルタを通過させるのは難しいでしょう。なぜなら、メール内の他のすべてが中立であれば、スパム確率はURLに依存し、それを中立に見せるにはいくらかの努力が必要だからです。)
スパマーは、アイデンティティを隠そうともしないいわゆるオプトインリストを運営するビジネスから、ポルノサイトを宣伝するスパムを送信するためにメールサーバーをハイジャックする人々までさまざまです。もし私たちがフィルタリングを使用して、彼らの選択肢を上記のようなメールに絞り込むことができれば、スパマーを「合法的」な範囲から追い出すことができるはずです。彼らは、スパムがスパムでない理由や「購読」をキャンセルする方法についてのボイラープレートを含めることを、さまざまな州の法律によって義務付けられています。そして、そのようなテキストは認識するのが簡単です。
(私は以前、より厳しい法律がスパムを減少させると信じるのはナイーブだと思っていました。今では、より厳しい法律がスパマーが送信するスパムの量を減少させることはないかもしれませんが、受信者が実際に見るスパムの量を減少させるのに確実に役立つと考えています。)
スパムの販売提案を制限すれば、ビジネスの範囲全体で、スパマーを追い出す傾向が必然的に生じます。その言葉ビジネスは重要なことを思い出すためのものです。スパマーはビジネスマンです。彼らはスパムを送信するのは、それが効果的だからです。それが効果的なのは、反応率が非常に低い(せいぜい100万件あたり15件、カタログ郵送の3000件に対して)にもかかわらず、彼らにとってコストがほとんどないからです。受信者にとってはコストが膨大で、100万件の受信者がスパムを削除するのに1秒を費やすと、約5人週かかりますが、スパマーはそれを支払う必要はありません。
スパムを送信することは、スパマーに何かをコストさせます。[2] したがって、反応率をできるだけ低く抑えることができれば、フィルタリングやフィルタを使用してスパマーに提案を薄めさせることで、スパムを送信する価値があるビジネスは減少します。
スパマーが使用する販売提案の種類は、反応率を高めるためです。これは、スパマーの心の中に入ることよりもさらに不快かもしれませんが、スパムに反応する人の心の中を少し見てみましょう。この人は驚くほど信じやすいか、彼らの性的興味について深く否認しているかのどちらかです。どちらにしても、スパムが私たちには嫌悪感を抱かせるものであっても、彼らにとっては刺激的です。スパマーは、刺激的に聞こえない限り、これらのことを言わないでしょう。「次のものをチェックするべきだと思いました」は、スパム受信者に対して、スパマーが今言っているような種類のことほどの引力を持つことはありません。結果として、刺激的な販売提案を含まない場合、スパムはマーケティング手段としての効果が低下し、より少ないビジネスがそれを使用したがるでしょう。
結局のところ、それが大きな勝利です。私はスパムフィルタリングソフトウェアを書くことを始めたのは、もうそのものを見たくなかったからです。しかし、もし私たちがスパムをフィルタリングするのが十分に上手くなれば、それは効果がなくなり、スパマーは実際にそれを送信するのをやめるでしょう。
スパムと戦うためのすべてのアプローチの中で、ソフトウェアから法律まで、私はベイジアンフィルタリングが最も効果的であると信じています。しかし、私たちが行うさまざまな種類のアンチスパムの努力が多ければ多いほど良いとも思います。なぜなら、スパマーを制約するあらゆる手段は、フィルタリングを容易にする傾向があるからです。そして、コンテンツベースのフィルタリングの世界の中でも、同時に多くの異なる種類のソフトウェアが使用されることは良いことだと思います。フィルタが多ければ多いほど、スパマーがそれらを通過させるためにスパムを調整するのが難しくなります。
付録: フィルタリングの例
ここ は、私がこの記事を書いている間に届いたスパムの例です。このスパムで最も興味深い15の単語は次のとおりです:
qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg unsecured platinum 3d0 qves 7c5 7c266675
これらの単語は、ヘッダーとメッセージ本文からの混合であり、スパムに典型的です。また、スパムの典型的な特徴は、これらの単語のすべてが私のデータベースでスパム確率0.99を持っていることです。実際、確率が0.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」のような単語が有罪の証拠であるのとほぼ同じくらい無罪の証拠です。しかし、それでも有罪の証拠の方が強いです。これらの数字をベイズの法則に従って組み合わせると、結果の確率は0.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
ここにはいくつかの良いニュースがあります。まず、このメールは、プログラミング言語を専門とし、モリスという良い友人を持っていない人のフィルタを通過しない可能性が高いです。平均的なユーザーにとって、ここにある上位5つの単語はすべて中立であり、スパム確率に寄与しません。
第二に、単語ペアに基づくフィルタリング(以下を参照)でこれをキャッチできる可能性があると思います。「コスト効果」、「設定料金」、「返金」--非常に有罪の証拠です。そしてもちろん、彼らが私にスパムを送り続けた場合(または私が参加しているネットワークに)、「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つは、個々の単語ではなく、単語ペアやトリプルに基づいてフィルタリングすることです。これにより、確率のより鋭い推定が得られるはずです。たとえば、私の現在のデータベースでは、「offers」という単語の確率は0.96です。確率を単語ペアに基づいて計算すると、「special offers」と「valuable offers」の確率はそれぞれ0.99になり、「approach offers」(「このアプローチは提供します」のように)の確率は0.1以下になるでしょう。
私がこれを行っていない理由は、個々の単語に基づくフィルタリングがすでに非常にうまく機能しているからです。しかし、スパムが検出しにくくなった場合、フィルタを厳しくする余地があることを意味します。(興味深いことに、単語ペアに基づくフィルタは、実質的に逆に動作するマルコフ連鎖テキストジェネレーターになります。)
特定のスパムの特徴(たとえば、宛先フィールドに受信者のアドレスが表示されないこと)は、スパムを認識する上で価値があります。これらは、仮想単語として扱うことでこのアルゴリズムに考慮されることができます。私はおそらく、将来のバージョンで、最も悪質なスパム指標のいくつかについてこれを行うでしょう。特徴認識スパムフィルタは、多くの詳細において正しいですが、証拠を組み合わせるための全体的な規律が欠けています。
非スパムの特徴を認識することは、スパムの特徴を認識することよりも重要かもしれません。偽陽性は非常に心配であり、特別な対策を必要とします。私はおそらく、将来のバージョンで偽陽性を回避するために特別に設計された第2レベルのテストを追加するでしょう。この第2レベルのフィルタをトリガーしたメールは、スパム確率が閾値を超えていても受け入れられます。
この第2レベルのフィルタリングがベイジアンであるとは期待していません。これは必然的にアドホックであり、推測に基づくものになります。なぜなら、偽陽性の数はパターンを認識するのに十分大きくなる傾向がないからです。(バックアップシステムがプライマリシステムと同じ技術に依存しない方が良いのは、どちらにしても同じです。)
将来的に試してみるかもしれないもう1つのことは、メールの特定の部分に特別な注意を払うことです。たとえば、現在のスパムの約95%は、訪問してほしいサイトのURLを含んでいます。(残りの5%は、電話番号に電話をかける、メールで返信する、または米国郵便アドレスに返信する、あるいは数件のケースで特定の株を購入することを求めています。)このような場合、URLはスパムであるかどうかを判断するのにほぼ十分です。
ドメイン名は、(非ドイツ語の)メールの他のテキストとは異なり、通常、いくつかの単語がくっついて構成されています。一般的なケースでは計算コストが高いですが、分解してみる価値があるかもしれません。フィルタが「xxxporn」というトークンを以前に見たことがない場合、それは個別のスパム確率0.4を持ちますが、「xxx」と「porn」はそれぞれ私のコーパスで0.9889と0.99の確率を持ち、結合確率は0.9998です。
スパマーがメッセージのテキストで有罪の単語を使用するのを徐々にやめさせられるにつれて、ドメイン名を分解することがますます重要になると予想しています。(IPアドレスを含むURLは、もちろん、非常に有罪の兆候です。特に、いくつかのシステム管理者のメールを除いて。)
スパマーによって宣伝されるURLの共同管理リストを持つことは良いアイデアかもしれません。悪意のあるまたは無能な提出を防ぐために、Raph Levienによって研究されたタイプの信頼メトリックが必要ですが、そのようなものがあれば、フィルタリングソフトウェアにブーストを提供するでしょう。また、ボイコットの便利な基盤にもなります。
疑わしいURLをテストする別の方法は、ユーザーがそのメールを見ている前にサイトを確認するためにクローラーを送信することです。あなたは、メールと同様にサイトを評価するためにベイジアンフィルタを使用でき、サイトで見つかったものは、メールがスパムである確率を計算する際に含めることができます。リダイレクトに導くURLは、もちろん特に疑わしいです。
私が本当に良いアイデアだと思う共同プロジェクトの1つは、巨大なスパムコーパスを蓄積することです。大きくてクリーンなコーパスは、ベイジアンフィルタリングをうまく機能させるための鍵です。ベイジアンフィルタは、実際にコーパスを入力として使用できます。しかし、そのようなコーパスは、他の種類のフィルタにも役立ちます。なぜなら、それをテストするために使用できるからです。
そのようなコーパスを作成することは、いくつかの技術的な問題を引き起こします。もちろん、悪意のあるまたは無能な提出を防ぐために信頼メトリックが必要です。また、コーパス内のメールから個人情報(宛先アドレスやCCだけでなく、しばしば宛先アドレスをエンコードする解除URLの引数など)を消去する方法も必要です。このプロジェクトを引き受けたい人がいれば、それは世界にとって良いことになるでしょう。
付録: スパムの定義
スパムが何であるかについては大まかな合意があると思いますが、明示的な定義があれば便利です。中央のスパムコーパスを確立したり、スパムフィルタリング率を意味のある形で比較したりする場合には、これが必要です。
まず、スパムは未承諾の商業メールではありません。もし私の近所の誰かが、私が良好な状態の古いラーレイ三速を探していると聞き、私にそれを売るメールを送ってきたら、私は喜ぶでしょうが、このメールは商業的であり、未承諾でもあります。スパムの定義的な特徴(実際にはそのraison d'etre)は、それが未承諾であることではなく、自動化されていることです。
スパムが通常商業的であることは、単なる偶然です。たとえば、誰かが政治的な原因を支持するために大量のメールを送信し始めた場合、それはポルノサイトを宣伝するメールと同じくらいスパムです。
私はスパムを未承諾の自動化されたメールとして定義することを提案します。この定義は、したがって、多くの法的なスパムの定義には含まれないメールも含まれます。法的なスパムの定義は、おそらくロビー活動の影響を受けており、受信者との「既存の関係」を持つ企業から送信されたメールを除外する傾向があります。しかし、たとえば、企業から何かを購入することは、彼らからの継続的なメールを求めたことを意味しません。オンラインストアから何かを注文し、その後スパムの流れを送信される場合、それは依然としてスパムです。
スパムを送信する企業は、しばしば「解除」する方法を提供したり、スパムを受け取らないように「アカウント設定」を変更するためにサイトに行くように求めたりします。これは、メールがスパムであるのを止めるには不十分です。オプトアウトしないことは、オプトインすることとは異なります。受信者が明示的に、受信することを求める明確にラベル付けされたボックス(そのデフォルトは「いいえ」)にチェックを入れない限り、それはスパムです。
いくつかのビジネス関係では、特定の種類のメールを暗黙的に求めることがあります。オンラインで注文するとき、私は領収書と注文が発送されたときの通知を暗黙的に求めていると思います。Verisignがドメイン名が期限切れになりそうだと警告するメールを送ってくるとき、私は気にしません(少なくとも、彼らが実際のレジストラである場合)。しかし、Verisignが「私のEコマースウェブサイトを構築するための無料ガイド」を提供するメールを送ってくると、それはスパムです。
ノート:
[1] この記事の例は、信じられないかもしれませんが、よりアクセスしやすくするためにCommon Lispに翻訳されています。ここで説明されているアプリケーションは、まだリリースされていない新しいLisp方言であるArcをテストするために私たちが書いたものです。
[2] 現在、最も低いレートは、100万件のスパムを送信するのに約200ドルのようです。これは非常に安価で、スパム1件あたり0.02セントです。しかし、たとえば95%のスパムをフィルタリングすると、特定のオーディエンスに到達するためのスパマーのコストは20倍になります。ほとんどの人はそれを吸収するのに十分なマージンを持っていません。
[3] 一般的な経験則として、国名の前に修飾語が多いほど、支配者が腐敗している可能性が高いです。「Xの社会主義人民民主共和国」と呼ばれる国は、おそらく世界で最も住みたくない場所です。
感謝 サラ・ハーリンにこの草稿を読んでもらったこと、ダニエル・ギフィン(彼も生産用Arcインタープリタを書いています)にフィルタリングに関するいくつかの良いアイデアを提供してもらったこと、私たちのメールインフラを作成してくれたこと、ロバート・モリス、トレバー・ブラックウェル、エラン・ガットにスパムについて多くの議論をしてもらったこと、ラフ・レビエンに信頼メトリックに関するアドバイスをもらったこと、チップ・コールドウェルとサム・スタインゴールドに統計に関するアドバイスをもらったことに感謝します。
このエッセイと他の14のエッセイは、 ハッカーと画家 で見つけることができます。
詳細情報: