#!/usr/bin/perl my $lambda = 1; my %scores; my $numpasses = 10; my $sumtcr = 0; my $sumsr = 0; my $sumsp = 0; open(SPAM, ") { next unless /^score\s+([^\s]*)\s+([-0-9.]*)/; $scores{$1} = $2; } close(SCORES); while() { next if /^\#/; /.\s+[-0-9]*\s+[^\s]+\s+([^\s]*)\s*$/; my $testshit = $1; $testshit ||= ''; my @rules=split /,/,$testshit; my $score = 0.0; foreach $rule (@rules) { next unless (defined ($scores{$rule})); $score += $scores{$rule}; } if($score < 5) { add_point (1, 0, $score); } else { add_point (1, 1, $score); } } close(SPAM); while() { next if /^\#/; /.\s+[-0-9]*\s+[^\s]+\s+([^\s]*)\s*$/; my $testshit = $1; $testshit ||= ''; my @rules=split /,/,$testshit; my $score = 0.0; foreach $rule (@rules) { next unless (defined ($scores{$rule})); $score += $scores{$rule}; } if($score >= 5) { add_point (0, 1, $score); } else { add_point (0, 0, $score); } } my $werr = ($lambda * $nlegitspam + $nspamlegit) / ($lambda * $nlegit + $nspam); my $werr_base = $nspam / ($lambda * $nlegit + $nspam); $werr ||= 0.000001; # avoid / by 0 my $tcr = $werr_base / $werr; my $sr = ($nspamspam / $nspam) * 100.0; my $sp = ($nspamspam / ($nspamspam + $nlegitspam)) * 100.0; $sumtcr += $tcr; $sumsr += $sr; $sumsp += $sp; printf ("TCR: %3.6f SpamRecall: %3.6f%% SpamPrecision: %3.6f%%\n", $tcr, $sr, $sp); exit; sub add_point { my ($isspam, $filedasspam, $score) = @_; if ($isspam) { $nspam++; if ($filedasspam) { $nspamspam++; } else { $nspamlegit++; } } else { $nlegit++; if ($filedasspam) { $nlegitspam++; } else { $nlegitlegit++; } } }