◀Webトップへ
  • 229 アレの処理
    • 230 RE: アレの処理
  • [229] アレの処理 すい 2006年07月22日 03:49

    また最近多いアレの件ですが。 >>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'} .~~ ); とか。
    • [230] RE: アレの処理 すい 2006年07月22日 03:51

      単語辞書(spam.txt) に、よく含まれている単語をバカスカ登録しまくる。
      ・まともな文章にも よく含まれ得る単語は低得点
      ・まともな文章には滅多に含まれない単語は高得点
      ・こんな単語があったら絶対アレだ!! という単語には、一発で閾値を越えるような超高得点
      を定義しまくる。

      試してみたら、こんな単純な処理でも単に単語を多量に登録するだけで
      それなりに精度が上がるっぽい。
      SPAMメールの中から単語を拾いまくって登録しまくるとか。

      ちなみにマイナス点(この単語があったら、その分、まともな文章とみなす)も定義可能! (って、要らんかな)

      このフィルタを突破されて何か書き込まれてしまったら、辞書ファイル spam.txt に
      お気楽に単語追加して、それだけサーバーへ転送で更新完了。

      「単語が1回でも含まれていたらアウト」方式だと悪影響(普通の文章まで跳ねられる)が
      出ないように単語追加には神経使うけど、この方式だと、比較的お気楽に単語追加しても平気。
      単語を何個か追加したからって、すぐに悪影響が出るって事は殆ど無いみたい。

      いうまでもなく単語は掲示板の用途を考慮して登録するのが吉。
      短い英単語なんかは、この掲示板だとソースコード投稿時に変数とかの
      一部にマッチしてSPAM扱いになる危険性が高いから登録しない、とか。
      '料金'という単語は世間的には普通に使われるけど、この掲示板では普通なら
      使われないから高得点で単語登録しちゃえ、とか。


      ちょっと過去ログで試して見た感じ「名前が"エロ"い人は不利だな (;^^;)」と。
      エロマントパーティさん とか ピエロさん とか。
      辞書の先頭の方で "ピエロ" とかの単語を 0点で登録しておけば平気になりますが。
      (いわゆる除外条件あつかい)