#! /usr/bin/perl # # spamfilter.el のコーパスファイルから, ランダムっぽい単語を削除するス # クリプト. Message-ID や base64, uuencode な単語を削除することが目的. # # スコアが十分に小さく, かつ, 長い単語を, ランダムな単語とみなして(手 # 抜き)その単語をコーパスから除外する. # # ランダムな単語を判定する方法に関するアイデアがあれば # ccbcc@black.livedoor.com まで教えてください. # # TODO: # - look(1) を使う? でも, あんまり意味ないかも. # - 今のところ, ハイフンでつながれた単語(例: 'generate-application') # が巻き添えをくらうので, 何とかしたい. # # See http://www-6.ibm.com/jp/developerworks/linux/021129/j_l-spamf.html # # Usage: # # % cp -p ~/.spamfilter ~/.spamfilter.org # % perl strip_corpus.pl ~/.spamfilter > ~/.spamfilter.new 2> ~/.spamfilter.trash # % mv ~/.spamfilter.new ~/.spamfilter # # 削除対象とする単語のスコア. スコアがこの値以下の単語を削除対象とする. $score_limit = 1; # 削除対象とする単語の長さ. 長さがこの値以上の単語を削除対象とする. $token_length_limit = 20; # ちなみに # perl -e '$total = 0; $count = 0; while (<>) { chop; $total += length($_); $count++; } print ($total / $count)' /usr/share/dict/words # した結果は 9.6 くらいなので 15-20 くらいを指定しておけばよいと思う. # 削除対象とするコーパス. 正規表現で指定する. $target_corpus = 'good|bad'; # $target_corpus = 'good'; # good のみ # $target_corpus = 'bad'; # bad のみ # 削除対象外とする正規表現. スコアと長さが削除条件にマッチしても削除しない. $exclude_regexp = ''; # $exclude_regexp = '^name:.+|^trip:.+|^mail:.+'; # Navi2ch の場合はこうしたほうがよいかも # 削除対象とする正規表現. スコアと長さが削除条件にマッチしていなくても削除する. $include_regexp = 'なんか適当にとにかく何がなんでも起こりえない正規表現'; # $include_regexp = '^\-+$'; while (<>) { if (/^\(spamf-set-corpus (.+) (\d+) '\(/) { $corpus_name = $1; $message_count = $2; print; print STDERR; } elsif (/^\("(.+)" \. (\d+)\)/) { $token = $1; $score = $2; if (!($corpus_name =~ /$target_corpus/)) { print; } elsif ($token =~ /$include_regexp/ || $score <= $score_limit && length($token) >= $token_length_limit && !($token =~ /$exclude_regexp/)) { # 削除条件を変更/追加したければ上の条件を書き換える print STDERR; } else { print; } } else { print; print STDERR; } }