[SAde] Vorkommen von shbjkl testen
Werner Maier <[email protected]> Thu, 16 Oct 2003 17:01:10 +0200
| Newsgroups | gmane.mail.spam.spamassassin.devel.de |
|---|---|
| Message-ID | <1922948964.1066323670@[192.168.42.19]> |
Hi,
wir hatten uns ja kürzlich drüber unterhalten.
wir haben da heute eine Lösung zusammengehackt, allerdings ist das
noch nicht so rund. ggf. kann mal der eine oder andere seine Ideen
einwerfen.
ist soweit mit 2-3 Mails getestet, aber für den Einsatz mit
richtiger Punkte-Vergabe steht noch der Test mit
mehr spam und ham aus.
Funktionsweise: man übergibt in der config die regexp sowie die
split-regexp sowie min und max an den eval-Test, und der
gibt zurück, wenn der entsprechende Text die regexp
zwischen min und max oft enthält.
Beispiel ich möchte alle vorkommen von mind. 5 bis 20 Konsonanten
Testen:
body CONSONANT_SCORE_20_100 eval:check_regexp_count("konsonant","/[bcdfghjklmnpqrstvwxyz]{5,20}/ig","/\b\W+/",'20','100')
describe CONSONANT_SCORE_2_100 zu viele Konsonanten 0-50
score CONSONANT_SCORE_20_100 3
will heißen: ich nenne die regexp "konsonant", damit ich die funktion
auch recyclen kann und ich im speicher ein array mit den tests
aufbauen kann. ich suche nach konsonantenfolgen, mit 6-20 buchstaben,
damit ich besser suchen kann, trenn ich nach Wortende \b mit \W+,
um in der nachfolgenden Funktion etwas weniger Worte für split/grep
zu haben, dann wird 20 und 100 als min und max übergeben.
Wenn das ganze trifft, bitt 3 Punkte.
nun der Code dazu:
(bei mir ists SpamAssassin 2.53, aber bei neueren sollte das
auch so gehen):
Datei EvalTests.pm
--------------snip--------------------
sub check_regexp_count {
my ($self,$body,$regident,$reg,$split,$min,$max) = @_;
if (! defined $self->{regexp_count}{$regident}) {
my $full = join " ", @{$body};
my @words = eval "split $split, \$full;";
$self->{regexp_count}{$regident} = eval "scalar grep $reg, \@words;";
}
return ($self->{regexp_count}{$regident} >= $min && $self->{regexp_count}{$regident} <= $max );
}
--------------snip--------------------
eigentlich recht schmerzlos: im Array {regexp_count}{$regident}
wird das ergebnis gespeichert, damit der Test nur 1x laufen muß,
auch wenn man mehrere Regeln hat (bei 1-10x 1 Punkt, bei 11-20x 2 Punkte...)
Damit man die Funktion recyclen kann für unterschiedliche
regexps gibts den regident (obiges Beispiel "konsonant").
Vorsicht beim Ausprobieren, das Teil ist bissig.
z.b. 5-20 Konsonanten trifft auch in der deutschen Sprache noch
recht gut: Anschluß -> "nschl" -> 5 Konsonanten.
so wie die Regel ist kann man sie für "body" und "rawbody"
verwenden, bei full tuts nicht, und bei header auch nicht.
any hints welcome.
viele Grüße aus Würzburg,
Werner Maier.
--
Werner Maier, Dipl.-Ing. Univ. E-Mail: [email protected]
fidion GmbH Berner Straße 2, 97084 Würzburg
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php