#!/usr/bin/perl -w my %falsepos; my %falseneg; my $nfp=0; my $nfn=0; my %scores; my %rulehit; open(SPAM, ") { next unless /^score\s+([^\s]*)\s+([-0-9.]*)/; $scores{$1} = $2; $falsepos{$1} = 0; $falseneg{$1} = 0; $rulehit{$1} = 1; } close(SCORES); while() { next if /^#/; /.\s+[-0-9]*\s+[^\s]+\s+([^\s]*)(\s+?:(?:bayes|time)=\S+)\s*?$/; my @rules=split /,/,$1; my $score = 0.0; foreach $rule (@rules) { next unless (defined ($scores{$rule})); $score += $scores{$rule}; $rulehit{$rule}++; } if($score < 5) { foreach $rule (@rules) { next unless (defined ($scores{$rule})); $falseneg{$rule}++; } $nfn++; } } close(SPAM); while() { next if /^#/; /.\s+[-0-9]*\s+[^\s]+\s+([^\s]*)\s*$/; next unless defined($1); my @rules=split /,/,$1; my $score = 0.0; foreach $rule (@rules) { next unless (defined ($scores{$rule})); $score += $scores{$rule}; $rulehit{$rule}++; } if($score >= 5) { foreach $rule (@rules) { next unless (defined ($scores{$rule})); $falsepos{$rule}++; } $nfp++; } } @fpk = sort { $falsepos{$b}/($rulehit{$b}||0.0001) <=> $falsepos{$a}/($rulehit{$a}||0.00001) } keys %falsepos; print "COMMON FALSE POSITIVES: ($nfp total)\n-----------------------\n\n"; foreach $key (@fpk) { print sprintf("%0.3f %5d % 0.4f %s\n",$falsepos{$key}/($rulehit{$key}-1),$falsepos{$key},$scores{$key},$key) if $falsepos{$key}>0; } @fnk = sort { $falseneg{$b}/($rulehit{$b}||0.0001) <=> $falseneg{$a}/($rulehit{$a}||0.00001) } keys %falseneg; print "\n\n\nCOMMON FALSE NEGATIVES: ($nfn total)\n-----------------------\n\n"; foreach $key (@fnk) { print sprintf("%0.3f %5d % 0.4f %s\n",$falseneg{$key}/($rulehit{$key}-1),$falseneg{$key},$scores{$key},$key) if $falseneg{$key}>0; }