[229]
アレの処理
すい
また最近多いアレの件ですが。 >>web:177 でも教えていただいたアレの処理。
処理を
「投稿データ中にアレによく含まれている単語があったら、
単語1回につき何点と点を付けていき、文章全体での合計点が
とある閾値を越えたらアレと見なす。」
にしてみてはどうかな?と思ったのですが、どうでしょう?
例えば perl だと↓この程度で済みますよね。
# ********** #
sub isSPAM{ ( &SPAMpoint($_[0]) >= $SPAM ) }
sub SPAMpoint{
local $ten = 0;
if( -r 'spam.txt' ){
require 'spam.txt'; # SPAM 単語辞書を読み込む。
local $buff = $_[0]; # 調査対象の文字列をコピー
local $Z = ' '; # 全角スペース文字(正規表現中に直接記述すると perl によってはエラーになるため、一旦、変数に格納してから使う)
# 単語が行をまたぐ場合などの対策
$buff =~ s/$Z//go; # 全角スペース文字を削除
$buff =~ s/\s//go; # 改行やスペース文字類を削除
for( $j=0 ; $j < $#SPAM ; $j+=2 ){
local( $word , $point ) = ( $SPAM[$j] , $SPAM[$j+1] );
# print "検索[$word/$point点]\n"; # for DEBUG
while( $buff =~ s/$word// ){ # 見つけた単語は調査対象文字列から削除していく
# print "->$word:$point\n" if( $deb ); # for DEBUG
$ten += $point;
}
}
}
$SPAM = $SPAM || 10; # 閾値 $SPAM が定義されていなかったら(単語辞書が無かったとか)初期値 10 にしておく。
$ten;
}
# ********** #
使う辞書ファイル spam.txt は↓こんな雰囲気で。
--↓-- spam.txt --↓--
# スパム判定用辞書 2006/07/21 22時
# スパム書込みと見なす閾値。合計点が、この点 以上ならスパム書込みとみなす。
$SPAM = 6;
# 単語 , 得点 の配列。(単語は正規表現可能)
# 見つけた単語を文字列から削除しながら調査していくので、検索する単語順に定義すること。
# (連想配列を使うと、配列参照時の順番が変わってしまうため、普通の配列を使用している)
@SPAM = (
'出会い' , 3.5,
'エロ' , 3,
'えろ' , 3,
'素人' , 3,
'男女' , 4,
'女性' , 4,
'女' , 3,
'レア(画像|動画)' , 5,
'動画' , 4,
);
----------
使い方は
# ----------
$TEXT = << '_TEXT_';
テスト用の書込み文章 貼り付け位置
_TEXT_
# ----------
if( &isSPAM($TEXT) ){ print "*スパムだ*\n" } # 判定だけ
print &SPAMpoint($TEXT) . "点\n"; # 点数を得る場合
な、感じで。
&isSPAM(); や &SPAMpoint(); にタイトル,本文,URLなどの文字列を全て連結して投げる。
&isSPAM( $FORM{'subject'} . $FORM{'body'} .~~ ); とか。