【言語処理】Perlでspamフィルタを作る

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
相談できる相手がいないのでここで知識を得たいと思いスレ立てしました。
Perlでのより良いプログラミングの話以外に、spamフィルタ技術の話全般で
切磋琢磨したいです(切磋琢磨という表現はおこがましいとは思いますが。。)

一応動くものは作ったので上げたいと思うのですが
perlは初めて1ヶ月ほどな上、人に見せるつもりで書いたプログラムではないので
かなり読みにくいと思います。
(作っているものはbsfilterやPOPFileのようなベイズを基本にしたクライアント側のフィルタです)
2デフォルトの名無しさん:2006/11/13(月) 18:26:32
動くものが欲しければ既存のもの使えば良いじゃない
技術的な話なら書籍なり論文集なり漁れば良いじゃない
あとなぜに Perl?
3デフォルトの名無しさん:2006/11/13(月) 19:03:32
動くものがほしいわけではなくて技術的な話しです。
ネットに落ちている文書分類系のpdfなどを読んではいるのですが、
独学だと変なところでつまづいたり、時間がかかったりしますし、孤独です。

言語がPerlなのはそれ以外はCくらいしか使えないので言語を扱うにはPerlのほうがやり易すいかと思って、今書いている最中だからです。
あとGrahamさんやbsfilter製作者やその他みかけた多くの人がRubyを使っていましたが
メリットがどこにあるのかいまいち掴めなく、イメージ的に「Perlの兄弟言語」のように受け取り、
好評そうなPOPFileもPerlで書かれているのでPerlでいいかと思ったからです。
4 ◆mR2RlX5cuk :2006/11/13(月) 19:40:20
Perlプログラムです。
確率はRobinson方式で、モデルに与える確率変数はMecabでの形態素解析結果を、木はハッシュで作っています。
ttp://www.mediafire.com/?doqn1r5mqmk
5 ◆mR2RlX5cuk :2006/11/13(月) 22:53:59

式は間違ってないはずなのにbsfilterとくらべるとかなり精度が悪いです。
いろいろなサイトをとびまわって情報をかいつまんでわかったことは、
GaryRobinson式はほかの2つ(Graham,Robinson-Fisher)と比べてスパム確率が分散すること。
H = 1 - (1 - f(w1)) * (1 - f(w2)) *...* (1 - f(wn) )^(1 / n)はHUM性 、
S = 1 - (f(w1) * f(w2) *...* f(wn))^(1 / n) はスパム性を表わしていること。

でもなんでわざわざ1から差をとる必要があるのか。
H = (f(w1) * f(w2) *...* f(wn))^(1 / n)
S = (1 - f(w1)) * (1 - f(w2)) *...* (1 - f(wn) )^(1 / n)
でいいような気がするんですが・・・
6デフォルトの名無しさん:2006/11/14(火) 19:11:47
スゲーーーーーーー

けど、誰も着いて来ない気が・・・w
72:2006/11/14(火) 20:00:19
なんだMecab使って形態素解析までやって
ちゃんとまじめにやってるっぽいじゃないかw
今は忙しいから付き合えないけれど、自分も興味ある分野だから
暇になったらじっくり時間かけて追ってみるよ
って1居るのかな?
8デフォルトの名無しさん:2006/11/15(水) 17:22:04
spam.py
9 ◆mR2RlX5cuk :2006/11/16(木) 03:40:20
人きたぁつД`)
>>6
いやぁかなりごり押しプログラムです・・・。
初めて立てたスレなので
しばらく、「タイトルが悪かったのかなぁ」「板違いなのかなぁ。。」とか考えたり
夕日を見ながら削除依頼だしたほうがいいのかな。。とか思ってました。

>>7
ありがとうございます!!

>>8
むむ、pythonですか。まったく未知の領域です。
しらべた限りではおそらく例題によく出されているのであろうコンビーフのspamのことですね。
dbmとかいろいろpythonのほうが記述しやすい(コンパクト)ってことなんでしょうか?
あ、もしやたただのシャレ・・・。

wikipediaには
大雑把な位置付けは「Ruby」と同じく「Perlのオブジェクト指向版」ってありますね。





10デフォルトの名無しさん:2006/11/16(木) 05:29:21
オライリーから解説本もでてるspamassasinはすくなくとも
インターフェース(ngワードの指定)部分はperlだぜ
内部はCかもれしれないけど
1が参考にするにはうってつけでは?
11デフォルトの名無しさん:2006/11/16(木) 16:59:06
現在大学院で自然言語処理を勉強しています。
プログラミングはPerlぐらいしかできませんが、興味あるスレだったので
これから眺めさせてもらいます!
12デフォルトの名無しさん:2006/11/16(木) 17:07:19
おい!スレ立てた>>1が首を傾げてるぞw
13デフォルトの名無しさん:2006/11/16(木) 17:09:50
ん?◆mR2RlX5cukが>>1じゃないのか?
14 ◆mR2RlX5cuk :2006/11/16(木) 22:47:33
>>10
スパムアサシンはPerlを使ってたんですねー。知らなかったです。
ありがとうございます。
オライリーで解説がでてる本というのはたぶん英語ですよね。
うーん、英語が読めないとそろろそ限界かもとは思ってはいるんですが。。。
スパムアサシンはCombineNaiveBayes.pmというファイルの中にRobinsonの式がありました。
ここでかなり衝撃的だったのはx(=0.6)とs(=0.16)の値が固定値だったこと(しかも想定外の値),
F(w)を求める式は頻度が少ないうちはxの値に近づけられて、その引きつける強さを表したのが
sなのでスパムアサシンはF(w)がf(w)から大きく変化はしないことになります。
それと
# Should we ignore tokens with probs very close to the middle ground (.5)?
# tokens need to be outside the [ .5-MPS, .5+MPS ] range to be used.
our $MIN_PROB_STRENGTH = 0.430;
とあるように0.07から9.53までのスパム確率をもつ単語は特徴的ではないとバッサリきり捨てています。
でもこれだと0頻度確率のx =0.6は切り捨てられるから意味がないような。。。
もうちょっと深くよんでみます。
ただbsfilterのほうが簡単そうなのでRubyで書かれてますが、こちらから攻めてみようかと
考えてます。


>>11
おおー仲間だーーー!
よろしくー

>>12
>>13
あ、すいません>>1です。うっかりしてました。。
15 ◆mR2RlX5cuk :2006/11/17(金) 02:20:07
あー、頻度がすくないときにxの値に近づけるということはxは0.5に近い値のほうがいいですよね。
xは各単語のスパム確率の平均値だとあるサイトに書いてあったのでプログラムは単純に平均をだして
xの値を更新するようになっているのですが、
これだとスパムのほうが非スパム(hum)より学習差がとびぬけて多いとx=0.9辺りになって
しまいます。
なんらしかの方法で最適化しない限りxは定数で与えてたほうがよいみたいですね。
というわけでプログラムを一部削除・・・知識データに総単語数を記述する必要もなくなりました・・・

16デフォルトの名無しさん:2006/11/17(金) 12:13:40
my (%data);
my $num1 = 3;
my $num2 = 4;
my $moji =tetra;

$data{$moji} = [ $num1, $num2 ];

print("%d",$data{$moji});


perl 実行
%dARRAY(0x85a7c28

何かよくわからない結果になってしまったのですが・・・
17デフォルトの名無しさん:2006/11/17(金) 12:44:15
>>16
print関数の使い方間違ってるし別に変な結果じゃないしスレ違いじゃね?
18 ◆mR2RlX5cuk :2006/11/17(金) 23:38:15
>>16
スレ違いですね。質問スレがあるのでそちらでどうぞ。
とりえずPerlは%dとかは使いませんよ。
19デフォルトの名無しさん:2006/11/18(土) 00:11:01
>>16
マルチ
20 ◆mR2RlX5cuk :2006/11/18(土) 16:12:12
これからの予定なんですが、
この1週間くらいでなんとかbsfilterの中身を本(ASCII SOFTWARE SCIENCE Language 11 オブジェクト指向スプリクト言語 Ruby)
を片手に読んでみて、理解ができたらそれを自分のプログラムに反映させようと思います。
(オライリー[Perl]も読んでみて既存の部分ももう少しマシなものにしたいです。自分が勉強したのはCGIを目標とした本と基礎勉強サイトなので
複雑なデータ構造とかについては全く知らないんです。)
21 ◆mR2RlX5cuk :2006/11/18(土) 16:20:16
スプリクト('A`)
22デフォルトの名無しさん:2006/11/18(土) 19:59:26
23デフォルトの名無しさん:2006/11/19(日) 02:00:22
↑なんかとっても損した気分
24 ◆mR2RlX5cuk :2006/11/20(月) 00:00:57
25デフォルトの名無しさん:2006/11/20(月) 03:30:07
このスレ興味津々。
技術で貢献は出来ないけど影から応援してみる
26 ◆mR2RlX5cuk :2006/11/20(月) 21:08:14
mecabで形態素解析した結果から助詞を除くとかなり精度があがったけれどまだまだ、という感じです。
記号も取り払ったほうがいいのだろうか。。。

助詞を取り除いて精度があがったという事実から考えられるのは、
SpamAssassinが0.07から9.53までのスパム確率の単語を切捨てているように
「中途半端な確率はノイズでしかない」
「ベイズは自分が思っていたよりも繊細な働きをしているわけではない
(というかそんな複雑なことをしないでも精度よくフィルタリングできるから
凄いんでしょうけども)」
ということです。

自分が考えていたベイズというのは、
スパムによく現れる単語と自分のよく使う単語が重複していると、その単語のspam確率をうまく下げてくれる。
自分の環境でよく使う単語であるにも関わらずspamメールの学習数のほうが圧倒的に多いせいで
spam確率が高い単語と認識されてしまう危険性も、spamメールとhumメールの学習数差を考慮して単語のspam確率を下げてくれるから何の心配もいらない、
でした。

でも実際はそう上手に確率を下げてくれるものではないようです。
となると本当に特徴的な単語というのは大半が名詞ですね、きっと。
そう考えると(平仮名を無視した)bigramと形態素解析の性能が大して違わないのもうなづける気がします。
27 ◆mR2RlX5cuk :2006/11/20(月) 21:13:00
>>23
そんな怪しいのクリックしちゃダメですよ('A`)

>>25
ありがとおおおおおお。役に立てそうで良かった。。
28デフォルトの名無しさん:2006/11/26(日) 00:57:24
俺は受信してから解析ってのがどうしても許せない。
そんなわけS25Rお気に入り。
29 ◆mR2RlX5cuk :2006/11/28(火) 16:41:36
助詞などを取り払った結果、ある程度学習させるとspam判定率は98%程度まであがり、
また学習数に関係なくhumをspamと誤判定することはありません。
さてここからどう進展させよう。。。。

今注目しているのは「画像を含むspam」です。ここ1年で急増しているらしいのですが
だいたいは画像とは無関係のテキストを張り付けていることが多いです。
で、これを画像解析せずにテキストだけでどう判定するか、です。

どこかから適当に持ってきた記事などを張り付けた場合、ほとんどが新出単語になります。
humメールに含まれる新出単語とspamに含まれる新出単語の特徴にはなにかしらの差があって
そこから判定できないか、と考えているのですが、はてさてうまくいくやら。。。


>>28さんが言う通りサーバ側も考えないといけないなと思っています。
S25Rを最近知ったぐらいサーバ側の知識がないのですが、サーバが勝手にユーザのメールを
誤判定で捨てることは許されないと思うのでベイズのような統計的な処理はサーバ側には置けないと考えます。
なのでS25Rのような確実な方法でフィルタリングしないといけないのですが、今はベイズで
手一杯ですね。。。自分でサーバを構築できた後に考えようと思ってます。

30デフォルトの名無しさん:2006/11/28(火) 23:11:51
ベイズなんて大学の時にやったような記憶がある程度の身だが,
面白そうなので思いつきで書いてみる.

>>29
思いっきりヒューリスティックに画像を含むものはspamである確率を上げる(画像なんて使わんもん)

いっそのこと辞書は空の状態からはじめて,未知である記号の列から
最長で一致するものを抽出していき,それを辞書に登録していくとかどうか.
abcdedcbabcba => abc
# 効率のよいアルゴリズムは思いつかないが

あとはその辞書を使ってベイズでも何でもいいけど普通に統計処理する.
うまくいくかは知らんが,新出単語とか気にする必要もないし,言語にも依存しないと思うがどうか.
31 ◆mR2RlX5cuk :2006/11/30(木) 04:11:31
>>30
辞書を空の状態からはじめるというのは、学習をさせずにいきなり判定を行うということでしょうか?
通常ならばある程度学習させてspam、非spam(hum)の両方の辞書をつくり、それを元に
「過去の結果から未来を推測する」ベイズで判定します。
もし無学習からはじめると未知である記号列(これから判定するメールの本文のことですよね)から
最長一致するものをとってきたとして、それをspam辞書に登録するのか非spam辞書に登録するのかが
わからなくなると思うのですが、私が何か勘違いしていますか?

それと最長一致だと同じことを言っている文なのに語尾が違うだけで違うものとみなされるという問題があります。
「無料で」「無料です」「無料!」の3パターンを覚えているよりは従来どおり形態素解析やbigramで「無料」とだけ覚えておくのが
良いと思います。
32デフォルトの名無しさん:2006/11/30(木) 06:56:16
普通にspamなんて1通も来ない
33デフォルトの名無しさん:2006/11/30(木) 07:37:19
>>32
噂では童貞には来ないらしい
34デフォルトの名無しさん:2006/11/30(木) 18:26:14
おおまだやってたのか
Spamassasinについてちょっとおもいだしたんですが
日本語対応が完全ではないらしく
日本語対応パッチを作った人がなんか苦労話を書いていたようなきがする。

まるごとPerl! Vol.1 (大型本)
Spamassassinの日本語スパム対応への取り組み
http://www.amazon.co.jp/gp/product/4844322893

がんばってねー
35デフォルトの名無しさん:2006/11/30(木) 20:21:10
>33
俺童貞だけど来るぞ
Yahoo!メール使ってる
36 ◆mR2RlX5cuk :2006/12/01(金) 02:25:03
>>32 >>33 >>35 
私もちょくちょく来ますけど多くはないですねぇ。

>>34
ありがとうございます!しかし敷居が高そうですねぇ〜先は長いです。
37 ◆mR2RlX5cuk :2006/12/03(日) 02:25:27
ふと思ったんですが、チャレンジレスポンスができるなら、こういうのはどうでしょう?
クライアント側ベイズフィルタリングで「spam」と判断されたメールには
「お宅のメールはspamと判定されましたよ」という内容のメールを送る。
そうすれば正当なメールをspamと判定してしまっても送信者が気づけば送りなおしてくれるのでは。

向こうが気づかなかったとしても(企業間メールを想定)
「メール送っただろ!」と怒られたとき「一応届いてないとの旨は送ったんですが。。。」くらいは言えそう。
それと送信者が偽装されていなければ、ゾンビPCのところには無視できない数のメールがくることになるので
ゾンビPCの使用者も異変に気づいて、かつ対処せざるを得なくなるのでは?と考えます。

書いた後になんですが、よくよく考えると「単にベイズとチャレンジレスポンスを組み合わせた」だけなので、
もうとっくにあるんでしょうねぇきっと
38 ◆mR2RlX5cuk :2006/12/04(月) 22:31:33
あー無理ですね、これ。
MTAでフィルタリング?するチャレンジレスポンスと受信してからフィルタリングするベイズだと
チャレンジレスポンス→ベイズはできますが逆はできないです。
うーん、できないのかなぁ・・・。できたら便利だと思うんですが・・・
39 ◆mR2RlX5cuk :2006/12/06(水) 16:44:12
MTAでベイズでき・・・るかも。
しかしベイズではないですが↓に同じことが書いてあります。
ttp://k2net.hakuba.jp/rgrey/
結局私が言っていたことは「フィルタの誤判定を再送で救済」ということなので・・・。

やはり大体のことは先人が考えているんですねぇ。
チャレンジレスポンスとGreylistingって何が違うのだろう・・。
Greylisting(再送要求)とtarpitting(返答の遅延)の違いはわかるんですが。
40デフォルトの名無しさん:2006/12/06(水) 17:53:15
お。まだ頑張ってたのか。
>>1だけのときちらっと見て以来だな。

>>5
f(x)ってのは何を表してるの?
とりあえず確率では1から差を取るということはよくやると思う。
41 ◆mR2RlX5cuk :2006/12/07(木) 01:40:49
もしわたしの説明でわからなければ↓をみてください。
ttp://www.tom.comm.waseda.ac.jp/~ike/column/0006.html
このサイトでは、hum性がP、spam性がQを表しているので>>5でのH、Sにあたります。

まずgary方式の単語スパム確率であるp(w)を下記の式でロビンソン方式の単語spam確率f(w)にします。
f(w) = ((robs * robx) + (n * p(w))) / (robs + n)
robxはspamでもhumでもないときの確率(0.5付近に設定)でn(単語の出現回数)が少ないときは
p(w)は信頼性なしとみなされrobxの確率に近付くようになり、回数が増えると本来のp(w)の値に近付きます。
robsは近付ける強さを表します。

で、ここから後が問題なのですが(>>5で言ったことは忘れてください。。)
(nはメール内に含まれていた単語の種類数)
H = 1 - (1 - f(w1)) * (1 - f(w2)) *...* (1 - f(wn) )^(1 / n)
だと1から各単語spamでない幾何平均をひいているのでこれはspam性を表すSで、
同様に
S = 1 - (f(w1) * f(w2) *...* f(wn))^(1 / n)
はhum性を表すHなのでは、、と思うのです。

そしてもっとわからないのが
I = (H - S) / (H + S)
です。
H∧Sでなければ上の式はまったく意味がないように思うのですが、H∧Sになる理由がわからないのです。。

A Plan for Spam(garyの式解説)
ttp://level.s69.xrea.com/mozilla/spam/index.html
ロビンソンの式解説(本人のところ)
ttp://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html

42デフォルトの名無しさん:2006/12/07(木) 03:36:02
>>41
とりあえず上のサイト見たけどHに当たるものががスパム性で
Sに当たるものがノンスパム性(hum性)って書いてあるよ。よく読んでみれ。

んでIの式だけどノンスパム性が低いorスパム性が高いと1に近づくように
人為的に設定した式だと思う。
こういう風に大まかな挙動を考えて式を発見するってのは結構よくやる。
あくまでもこれは確率の式なので事象が同時に起こるとかそういうのは
気にしなくていい。
43 ◆mR2RlX5cuk :2006/12/07(木) 04:18:38
うわ逆ですね。。。ずっと気づかなかった。。
人為的な式ということでIの式はあんま気にしないほうがよいんですね
44デフォルトの名無しさん:2006/12/07(木) 10:37:39
一応Iの正当性としてはノンスパム性とかスパム性の絶対値にかかわらず、
ノンスパム性>>>>>スパム性の時-1に、スパム性>>>>ノンスパム性のとき1に
ノンスパム性=スパム性のとき0になるような式を作ったという感じだね。

例えばノンスパム性がきわめて低いメールであっても、それ以上にスパム性の
低いメールであればスパムでないメールとして判定できるようになってる。
45 ◆mR2RlX5cuk :2006/12/08(金) 23:57:42
>>44の考え方だと確かにベイジアンフィルタの理屈にかなっていますね。


画像スパムをどうしたものか・・・辞書をあらされるのが一番怖いです
46デフォルトの名無しさん:2006/12/09(土) 08:20:49
>>1ってもしかしてttp://yasu.asuka.net/の人
47 ◆mR2RlX5cuk :2006/12/09(土) 22:06:23
いや違いますよw
証拠は私のプログラミング能力の無さですかね・・・w
48 ◆mR2RlX5cuk :2006/12/13(水) 01:03:48
うーん、画像スパムに対するコンテンツフィルタ(本文のみ評価)はどうすればいいでしょうねぇ・・。行き詰まり。
49デフォルトの名無しさん:2006/12/13(水) 03:02:41
ベイズフィルタなら関数型のほうが作りやすいんでないの。
LispならPerlより速いし
50デフォルトの名無しさん:2006/12/13(水) 20:28:27
一度来たことのあるスパムのヘッダのホストを利用して判断すれば?
6つぐらいよく来るホストを指定したら2/3ぐらいに減ったよ。
ただ最初学習させるのに間違うと大変なことになるから自動処理には向かないかもしれない。
51デフォルトの名無しさん:2006/12/13(水) 20:49:52
スパムフィルタなら優良と思われるものの概要がハッカーと画家に載ってた。
52デフォルトの名無しさん:2006/12/13(水) 22:15:19
ずっと規制されてて書き込めなかったぜ・・・
>>48
PerlならHTML::Parserで本文だけを取り出すべき
53 ◆mR2RlX5cuk :2006/12/14(木) 01:50:31
49>>
「文字列処理はPerl」というつもりでPerlで書いているんですが、関数型の方が
速いのも確かですし、メインのところはCかLisp(経験無し)で書いたほうがいいんですかねえ。
文字列とモジュールが使えるところはPerlということにして。

50>>
今の画像spamは「画像中に描かれている文字を読み取る」か「ヘッダ情報」を用いて判定するらしいのですが、
画像解析をするつもりは今のところないので、そうするとヘッダと本文(1行文やどこかの記事のコピーを貼り付けたもの)
から判断するしかありません。(ヘッダspam確率*本文spam確率)
で、ヘッダはあまり工夫の余地がないと思うので、本文のほうの精度をなんとか上げられないかと思っているんです。

>>51
webで日本語訳をちらほら読んだことはあるんですが、やっぱり買って一読したほうがよいですかね〜

>>52
なるほどー。
こんなのもありました。
ttp://www.din.or.jp/~bigstone/cgilab/guide/mime.html

MIME.pmで必要な部分だけ取り出して、HTMLが混じっていたときはHTML::Parserって感じでしょうか。
54デフォルトの名無しさん:2006/12/15(金) 20:11:16
MIME.pmは標準ライブラリじゃないし、何より本文だけ取り出せばいいので
(MIME.pmは添付ファイルのデコードまでしてる)
自作した方がいいんじゃない?
正規表現使えばすぐだし。

あと本格的なSPAMフィルタを作りたいならこれにくわえて
2chの串規制でも使ってるDSBLもかますといいかもね。
55 ◆mR2RlX5cuk :2006/12/16(土) 05:40:26
うーん、便利そうだと思ったんですが、MIME.pmを参考に必要な機能だけ作ったほうが良いですかね。
DSBLはサーバ側に実装すると問い合わせが多いのでむちゃくちゃ重かったような気がします。
クライアント側だと大丈夫かな??(千や2千なら・・)
56デフォルトの名無しさん:2006/12/16(土) 11:29:46
なつかしいな。昔グラハムとか実装したよ。Cだったけど。
perl詳しくないけど、速度はどうなんだろ。
MIMEはツリー構造をまじめに解析したらかなり面倒だと・・
57 ◆mR2RlX5cuk :2006/12/23(土) 01:02:55
アク禁されてた・・・
MIMEも必要なところ以外無視するようにすればなんとかなりませんか?
MIME.pmもtext/**とmessage/**以外は無視のようです
58 ◆mR2RlX5cuk :2006/12/26(火) 03:15:33
年末年始はネット環境がないので不在ですm(_ _)m

画像スパムの中に、wwwから画像をリンクしているものがあったのですが、
スパムが読まれたかどうかを調べるもののようです。
生きているアドレスを調べることができるそうですが、個人的には
どこに何通送ったら何通読まれていた、という市場調査が可能なのが嫌な感じです。
59デフォルトの名無しさん:2006/12/27(水) 04:15:42
漏れはむつかしーことわかんねーけど、perlはけっこう長く使ってる。
そういう漏れに言わせると、perlを使いこなせるかはCPANライブラリを使いこ
なせるかと同義だ。

なので極力モジュールに任せられるところは任せるようにしたほうがいいぞ。

あと>>4のソースいまさら眺めてみたが、jcode.plはさすがに古いのでやめとき。
Jcode.pmかEncode使うよろし。

それからPerlをマルチバイト文字で書くときは、encodingプラグマ使うといい
ぞ。
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html

perlに慣れて来たら、strictプラグマも使うといいぞ。
ttp://iandeth.dyndns.org/mt/ian/archives/000617.html

これは自分に手枷はめてミスをふせぐためのもんだから、慣れないとめんどく
さく感じるだろうけどな。

ちなみに>>58で言ってるのはウェブビーコンとかウェブバグとか言われる奴な。
古典的な手だ。
外部のファイル読みに行くUAが悪いんだけどな。
60デフォルトの名無しさん:2006/12/27(水) 09:34:52
昔bsfilterをperlに移植しようとして面倒であきらめた俺が来ましたよ。
テストとコードの精査とか断片書くのなら手伝うでよ。
61デフォルトの名無しさん:2006/12/27(水) 15:22:02
>59
encodingはやめたほうがいいと思う。よっぽど注意して使わないとバグの元になるから。

strictとwarningsはワンライナーならともかく、ある程度の規模のもの書くなら必須。
62デフォルトの名無しさん:2006/12/27(水) 16:35:25
>>39
37で書かれている主旨とRgreyは少し違うと思います。
37でやりたいのはfalse positiveかもしれないものの送信者へwarningを送るということですよね。
Rgrey等は、複合的条件で判断することでfalse positiveを減らす、というのが主旨なので。

チャレンジレスポンスとGreylistingでは、人が判断するかシステムが自動で返すかが違います。
もっと簡単に言うと、GreylistingはまともなMTAから送信されているかをチェックするものです。
Greylistingは確認をしてもらうためではなく、あくまで再送チェックによるフィルタなのです。
そういう意味ではTarpittingも同じです。

チャレンジレスポンスするのは、送信者アドレスの偽装があるため、難しいというか
迷惑になる可能性が高いのでやめたほうが良いかと思います。
アドレスが偽装されてる場合、ゾンビPCにメールを届けることは出来ませんよね。

SMTPセッションが張られている間にベイズで判断してGreylistingさせるとかを
考えられてるのだとすると、こちらの論文が一部参考になるかも。
http://info.ipsj.or.jp/01kyotsu/award/funai_bp/2006_pdf/LL_008.pdf
63デフォルトの名無しさん:2006/12/27(水) 16:41:21
>>48
画像スパムに対してベイジアンだけで対抗するのは難しいのではないでしょうか。
送信元の特徴と、添付画像サイズや数などの特徴の複合条件で、その可能性が高い
という判断が出来るまででは。
それ以上に完全に判定するには、やはり画像から文字認識させるしかないと思います。
64 ◆mR2RlX5cuk :2006/12/28(木) 02:32:00
すみません、めちゃ眠くて難しいことは考えられないので後日ちゃんと返信します。。。
とりあえず自分の言いたいことだけ言います。

その1
とりあえベイズだけだと難しいので、画像もみてみようと思います。手始めにエッジと
色の距離をとってみれば、同じ画像や背景色を変えただけのものはわかると思います。l
「いろいろ色を混ぜてある背景に、(OCRを意識して)ぐにゃぐにゃした文字が書いてある」くらいまで
わかるようになれば、、、と思っています。

その2
サンプルデータがない(humの)
今のプログラムは本文テキスト部しかみてないのですが、ちょっと改造してヘッダをみるようにしたのですが
環境が違いすぎて判定率が良過ぎるんです。
humメールは全部日本語で、HTMLを使ったメールは1通もないし、Outlookを使っている人間もいない。
対してspamは英語で、HTMLを使いまくり、ソフトはだいたいOutlookという状況。
コンテスト用にサンプルデータとかあったりするんだろうか。。。

その3
ここしばらく携帯で見れなかったのですが、大丈夫なようなので年末年始もいますw
65デフォルトの名無しさん:2006/12/28(木) 09:58:24
>>64
その1の方向は、SpamAssassinのFuzzyOCRがやってるので、そちらを参考にされてみては。
FuzzyOCRは禁止ワード登録という手法なので、FuzzyOCRで検出された語句をベイジアンに
渡すという方向でやってみるのも面白いかと。
あと、文字を認識するのではなくて、画像の種類を認識させる
(文字っぽいのか写真っぽいのか文章っぽいのか、といった感じで)というのもいいかと思います。
それなら、FuzzyOCRの判断と組み合わせて使うことも出来て有用ですから。

その2の点ですが、英語のMLに入っておくと良いと思います。
HTMLメールは、取りたくなくてもメールマガジンを入っておいて、HTMLで受けるにしときましょう。
出来れば、英語でHTMLメールの画像入りまくりなメールマガジンを取りたいところですが
手頃なそういうメールマガジンを知らないので、合ったら教えて下さい。
66 ◆mR2RlX5cuk :2006/12/29(金) 02:19:55
>>59
CPANライブラリはついつい(後回しにして)避けてしまうんですよね。
でなければ自分でトライ木?を作ったりはしなかったと思います。

jcode.plは古かったんですかっ。直しておきます。
encodingプラグマとstrictも勉強してみます。
1つのファイルに長々とコードを書いるくせに変数名はその場で適当に決めてますから。。

ウェブビーコン、wikipediaに結構詳しくのってますね。古い手でもまだ流通しているんですねぇ。
統計的にはかなりspam寄りだろうに。。。

>>60
bsfilterも何気に多機能だったりしますからねw
しょぼいコードの指摘をお願いしますm(_ _)m

>>61
扱いが難しいんでしょうか、とりあえず使えそうなら使ってみようと思います。
痛い目に実際にあったほうがよくわかるだろうし。。。
67 ◆mR2RlX5cuk :2006/12/29(金) 02:58:18
>>62
ふむふむ、理解しました。

チャレンジを受け取った相手は自分の送信履歴と照合して、一致しなければ削除、みたいな
ことをすれば大丈夫かなとも思いますが、相手が整備していることを前提のシステムはだめみたいですね。

SMTPセッションまでは考えていません。今のところコンテンツフィルタメインです。
ただspam対策の決め手はやはりそちらだろうと思います。

論文読みました。なるほどー。強制切断がミソですね。
正直分散協調型はどうなんだろうと思っていてあまり関心がなかったのですが、面白いです。

>>63
今のところ画像を解析するのは処理が重すぎて大規模サーバでは使えないので
OCRはクライアント側ですることになることになるのかもしれませんが、spamがクライアントに届いた時点で
spammerの目的は半分達したことになると考えています。
(spamの広告文句にひっかかる人はおそらくフィルターは入れていないので)

なのでなんとかして極力、画像を解析する数を減らすのが重要ではないかと。

>>65
「画像の種類を認識」
そう、これをやりたかったんです!

OCRは自分で作るつもりはなかったのであまり気にしていなかったのですが
てっきり認識した文字はベイズにかけるものだとばかり思っていました。
禁止ワード登録はちょっとやりすぎですね。


そろそろ教えてもらったことを血肉にしなければっ
68 ◆mR2RlX5cuk :2006/12/29(金) 03:02:31
>>65
spamに近い構造のメールを送ってくるグレーなMLが理想ですねw



ハッカーと画家購入!
69デフォルトの名無しさん:2006/12/29(金) 11:22:07
>>67
怪しいものに対してだけチャレンジ・レスポンスで確認するFairUCEというのがあります。
alphaWorks : FairUCE : Overview
http://www.alphaworks.ibm.com/tech/fairuce
自分はチャレンジ・レスポンス自体に否定的なので、ちゃんと試してないけども。

そうそう。OCRは重すぎるので、荒く画像の種類を認識して、怪しいのだけをOCR掛ける
というようなイメージです。
ただ、FuzzyOCRもいろいろと負荷下げるための工夫が施されているようなので
実はすでにそういう荒いフィルタでの選り分けも、実装されてるのかもしれませんが。
70 ◆mR2RlX5cuk :2007/01/03(水) 23:31:41
>>69
携帯で書き込みできなかった。。。

最近になってスパムアサシンのすごさがわかってきたので勉強したいと思いますm(_ _)m


新しい案を。
今まではメールの内容を「野球」「サッカー」「株」などの分野分けをしてフィルタリングしていましたが、
これを「このメールは確率的に野球の話」から「このメールは確率的にホワイトリスト内のAさんが書いたもの」
という風にするのはどうでしょうか。

個人の文章の書き方でフィルタリングするということです。(普通のベイズフィルタの後に)
私なら「まぁ」や「。。。」を多用し、一人称は「私」、使う顔文字も割りと限定的です。
ホワイトリストの人数分だけ特徴を記憶しておいて、実際の判定時には閾値を超えた
人物が現れたら、そこで判定を打ち切ってhumにしようと思っています。

正直うまくいくとは思えなかったりもするのですが、OCRに持っていく数を少しでも減らせたらという考えです。
71デフォルトの名無しさん:2007/01/04(木) 01:36:40
ホワイトリストの人からは
いきなりhtmlメールで画像の添付ファイル送られて来たりしないからな
htmlメール全部禁止するだけで99%解決なんだが
72デフォルトの名無しさん:2007/01/04(木) 10:35:54
>>70
それよりも単に、オートホワイトリストを使ったほうがいいような気がします。
SpamAssassinでは、メールアドレスとIP(の上2つぶん)でオートホワイトリスト作ります。
ただ、オートホワイトリストのポイントが高ければ、他のフィルタを通さないで素通り
とは出来なかったと思うので、そのへん出来るとOCRへの負担を減らせるように思います。
73 ◆mR2RlX5cuk :2007/01/06(土) 21:38:06
>>71
ホワイトリストにいるような知人が違う環境から送ってきた場合とかに有効かなと思いまして。

>html99%禁止
実際そうなんだと思います。HTMLが使えること自体が歯がゆい感じです。
メールでHTML可能なメリットって何があるんでしょうね。。。

私の聞いたことのあるトラブルとしては、普段からやりとりしている顧客先からのメールが
その時だけたまたまHTML設定(おそらくoutlook・・)になっていて弾かれていた、というものがありました。

>>72
段階的にフィルタリングするという発想ですね。
SpamAssassinのことはあまり知らなかったのですが、最終的なスコアで判定するんですね。
私は段階的にフィルタリングするほうが良いような気がします。

>オートホワイトリスト
段階的にフィルタリングするのですから信頼性の高いものは最初のほうのフィルタで
humにしてやったほうがよいと思いますが、それが終わったあとに>>70のようなのを入れてみたいと
思うのですがどうでしょうか
74 ◆mR2RlX5cuk :2007/01/11(木) 16:32:20
spamについての参考資料がいろいろあるので興味のある人は見てみてください
http://www.iajapan.org/anti_spam/event/2005/conf0510/program.html
75 ◆mR2RlX5cuk :2007/01/15(月) 13:54:59
特徴的な単語の数が少ない(15から20くらい?)ものは判定結果をグレーゾーンとして
振り分けるというやりかたを思い付いたのですが、これもすでにあるんでしょうか。

特徴的でない単語を確率値をみて3つに別けると、spam確率が低めの単語の数が
多いものはやはりhumであることが多いようです。
実際にどれくらい有効なのか試してみます
76デフォルトの名無しさん:2007/01/16(火) 05:57:34
最近グレーゾーンに入るSPAMが増えてきたな
送る方もフィルタの抜け方研究してるんだろうな
77デフォルトの名無しさん:2007/01/16(火) 08:58:28
SpamAssassinの結果見てても、ベイジアンだけの得点だと抜けてしまうような場合が多くなってる。
やっぱり限界があるな。
78デフォルトの名無しさん:2007/01/17(水) 12:28:06
79 ◆mR2RlX5cuk :2007/01/19(金) 00:57:23
spamassassinはスコアを算出してその値が半端なときはメールに
[spam]と記述するようになってる、、のだと思います。

今回試してみたのが特徴的な単語($F<0.1,$F>0.9)をどれだけ含んでいるのか
ということなのですが、普段受け取っているメールに近いものは特徴的な単語をかなり多く
含んでいるので、単純にこの頻度で閾値を設定するだけで今までフィルタリングをすり抜けていた分をグレーゾーンに
もっていくことができそうです。(もちろん今までにないタイプのhumはグレーです)

ただもう少しテスト用のメールがほしいですが。。。
今回はhum20通、spam400通を学習して、画像spam250通でテストしました。
英語のhumは集めにくいです。

>>76
ぱっと見て、ここがspammerの工夫、と気づくような点はありましたでしょうか?

>>77
どうしてもコンテンツフィルタに限界はありますね。。。
ただ画像spamもそうですが、対応しなければいけないメールは次々でてくるので
それに対処はしていこうと思うのです。
根本的にspamをなくすにはやはりネットワークの部分でしょうね・・・。

>>78
規制というか新しいルール作りに関しては良いとも悪いとも判断つきかねる感じです。
判断できないのは知識が足りないのも大きいですが・・・
80デフォルトの名無しさん:2007/01/19(金) 02:42:51
>>79
>規制というか新しいルール作りに関しては良いとも悪いとも判断つきかねる感じです。


おまえ日本語読解力全然だめだな
81デフォルトの名無しさん:2007/01/19(金) 08:57:01
>>79
spamassassinはルールファイルに従いスコアを算出して、それがある閾値(これも指定出来る)
を越えたら[spam]とフラグを立てることができます。
だからグレーという判断ではなく、スパムという判断です。
捨てるかどうかは、その後段のprocmailとかのフィルタで行います。

あと>>78のものは、動的IP(のような名前のところ)から出されたものをスパムとして一時拒否する
というものです。>>39で書かれていたRgreyでは一時拒否をgreylistingサーバへ回すことで
対応しているわけです。
ベイジアンフィルタで利用するには、このパターンにマッチしたものは動的IPのものとして
フラグを立てて、それを学習させると良いと思います。
82デフォルトの名無しさん:2007/01/19(金) 09:27:33
>>81
まりがとう
83 ◆mR2RlX5cuk :2007/01/20(土) 02:22:21
>>80
「メール中継サーバからのメールだけを受け取るというポリシー」
という部分が、それ以外からメールは送れないという暗黙のルールを強いることになると思ったのでそう表現したのですが、
そういうことでもないんでしょうか。。。


>>81
ありがとうございます。
はやくそういった基本的な話以外ができるようにします。
84デフォルトの名無しさん:2007/01/20(土) 07:42:07
85デフォルトの名無しさん:2007/01/20(土) 14:18:37
>>83
というか、>>29でS25Rについて返答してるやん。
86デフォルトの名無しさん:2007/01/20(土) 14:36:17
酉が偶然一致したとか言い出しそうだな
87 ◆mR2RlX5cuk :2007/01/21(日) 22:29:26
確実な方法と書いてありますね。あんまり理解していなくて中途半端に受け答えしてしまった結果です。
主張をころころ変えると信頼もなくしますし、ダメダメですね・・・
人に説明できるようになるのが一番良い方法かな、と思うのですが
これを説明してみろっとか、この手法がわからないとかがあったらお願いします。調べた結果を書いてみます。
88 ◆mR2RlX5cuk :2007/01/21(日) 22:44:50
>>84
かなり分かり易いです!
一度みたことはあったのですが素通りしてました。
ありがとうございました。
89デフォルトの名無しさん:2007/01/31(水) 03:15:07
興味があるので参加させてください。
まだまだアルゴリズムの理解ができていませんが。

ところで、humではなくてhamだと思います>>1
90デフォルトの名無しさん:2007/02/01(木) 20:52:43
IPリスト式のスパムブロックってかなりずさんな運営らしいね
こわー

>>89
human mailでは?とりあえず本質とは関係ない。
91デフォルトの名無しさん:2007/02/01(木) 23:56:09
>>90
いや、humはおかしいだろ。
っつーかhuman mailってなんだよ。

span = アメリカの Hormel Foods 社が製造するブタ肉のランチョンミートの缶詰
ham = 豚のもも肉/ハム
hum = 鼻歌

英国 BBC が放映したコメディー番組「モンティ・パイソン」(Monty Python's Flying Circus)のコントで、
ある夫婦がレストランに入ったところ、ほかの客が "Spam! Spam! Spam!" と大声で何度も繰り返し、
スパム入り料理を注文せざるを得なくなった。そのしつこいスパム攻撃のイメージから。

おまえ>>1だろ
92デフォルトの名無しさん:2007/02/01(木) 23:56:44
human mail
93デフォルトの名無しさん:2007/02/02(金) 01:54:10
human mailの人気にshit

human
mail

人気

shit

>>90はスパムメールです
94 ◆mR2RlX5cuk :2007/02/03(土) 00:14:15
すみません、hamですね。わたしが間違って使ってただけです。
語源はわからないです。spamは諸説あるみたいですが。

>>90
なのでホワイトリスト併用が必須です。


95デフォルトの名無しさん:2007/02/03(土) 12:11:32
human mailテラワロス
9690:2007/02/03(土) 21:18:41
失礼しました。まったくの誤解でした。
ちなみに>>1ではありません。
97デフォルトの名無しさん:2007/02/04(日) 22:37:12
>>96
スレの本質とはずれるが誤解っていうレベルじゃないだろ.
人としてどうかとおもうぞ.
98 ◆mR2RlX5cuk :2007/02/17(土) 23:02:50
MIME.pmよりHTMLParserの方がいいです。
text/**の**の部分(副題?)がないと取得してくれないとかいろいろ問題が発生しました.
spamassassinもHTMLParser使ってますね.

あと単語数が増え続ける辞書は自動削除が必要になってくると思うのですが、どういう風にすれば
よいでしょうか?案が浮かばないです。。。
99 ◆mR2RlX5cuk :2007/02/18(日) 21:50:21
HTMLではなくてMIMEですね。。
100デフォルトの名無しさん:2007/02/25(日) 22:06:06
で? 誰かwiki立てるなりして議論したりしないの?
要望やら展望やら出してちゃんと要求をまとめようぜ。
101 ◆mR2RlX5cuk :2007/02/27(火) 23:33:13
ある程度みんなが納得できる出来の1つのもの(MIMEをちゃんと解析できるとか文字コードの問題をつぶすとか)を作ることに専念して
いったほうがわかりやすいですかね?

102デフォルトの名無しさん:2007/04/03(火) 09:20:04
あげ
103デフォルトの名無しさん:2007/04/03(火) 09:52:46
>>101
やる気なくしてるんなら、降参して消えてくれ。
104デフォルトの名無しさん:2007/04/23(月) 18:09:13
■ Perl言語 ■ 何でも質問コーナー ■
http://mixi.jp/view_bbs.pl?id=17607679&comm_id=1401396
Perlに関すること、cgiに関すること
なんでも質問できるコーナーです(たとえばApacheとかでもOKとします!)
(Web系であればOK)

ルール:
Google検索で調べてわかるようなことでも質問してもOKです
(初心者のうちは、どの情報を取捨選択したらイイのかわからないと思うので)
回答してくださるかたは、暖かく質問者を迎えてやってください
o(^^o) (o^^)o



105デフォルトの名無しさん