nasauber.de

Blog

Spam

Ohne mir jetzt selbst auf die Schulter klopfen zu wollen – zum Glück funtioniert mein Spamfilter bayes-php so gut. Mittlerweile kommen am Tag (zum Glück nicht immer) auch schonmal 100 Einträge in meinem Gästebuch und meinem Weblog an, die den arglosen Besucher meiner Homepage netterweise über alle Online-Casinos, Autoversicherungen, Handyklingeltöne, billige Medikamente und andere (nicht jugendfreie) Online-Angebote aufklären, die das Internet so zu bieten hat. Das heißt, sie würden das tun, wenn sie nicht aussortiert würden.

Anfangs war ich der Meinung, man könnte ein ähnliches Ergebnis erzielen wie z. B. mit dem bogofilter, der netterweise meinen E-Mail-Posteingang spamfrei hält. Heißt, irgendwas mit einer Spamwahrscheinlichkeit > 90 % ist Spam, was darunterliegt höchstens Spamverdacht. Aber leider hat bayes-php nicht so viel Futter zur Verfügung wie bogofilter. Der hat, auch wenn im Text quasi nichts steht, immerhin noch die E-Mail-Header. Aber viele der Einträge in meinem Gästebuch sehen ungefähr so aus:

Name:nkumye
E-Mail-Adresse:ophn@kldlfte.com
Homepage:obskure URL
Text:abc123

… dazu noch eine IP-Adresse (mit der man nicht viel anfangen kann), und das war's. Nun ja – was will man groß rausholen? Wenn ein bißchen mehr Text zur Verfügung steht, dann bekomme ich schon meine 99 % Spamwahrscheinlichkeit. Aber so sind's dann oft (verständlicherweise) doch nur 80.

Wenn man aber den Schritt wagt, einfach alles > 70 % Spamwahrscheinlichkeit als Spam zu deklarieren und alles, was mit > 70 % aber < 80 % gewertet wird, dem Autolearn-Filter zum Fraß vorzuwerfen, hat man ein spamfreies Gästebuch als Belohnung! Und keiner der Einträge, die kein Spam waren (egal ob auf Deutsch oder Englisch), wurde mit mehr als ca. 50 % Spamwahrscheinlichkeit gewertet. Die meisten mit deutlich weniger. Ich mußte also bisher keine Angst haben, daß was rausfliegt, was nicht rausfliegen soll!
Anzumerken ist, daß bayes-php nicht selbst eine Autloearn-Funktion bietet. Die paar Zeilen muß man einfach selbst in sein Gästebuch schreiben. Oder man macht sich eine kleine Datei, die eine Funktion mit einem einheitlichen Interface für Gästebuch und Weblog enthält. Ich benutze das hier:

function check_text($text)
{

	require "{$_SERVER['DOCUMENT_ROOT']}/bayes/bayes.php";
	$bayes = new bayes;

	$check_stat['jetzt'] = time();
	$bayescheck['text'] = $text;
	$bayescheck['bewertung'] = $bayes->classify($bayescheck['text']);
	$check_stat['bewertung'] = sprintf("%5f", $bayescheck['bewertung']);

	if($bayescheck['bewertung'] < 0.7)
	{
		$check_stat['status'] = "akzeptiert";
		$check_stat['autolearn'] = "-";
		$check_stat['rating2'] = "";
	}

	else
	{

		$check_stat['status'] = "abgewiesen";

		# Autolearn

		if($bayescheck['bewertung'] < 0.8)
		{
			$bayes->learn($bayescheck['text'], "spam");
			$check_stat['autolearn'] = "Spam; ";
			$check_stat['rating2'] = sprintf("%5f", $bayes->classify($bayescheck['text']));
		}
		else
		{
			$check_stat['autolearn'] = "-";
			$check_stat['rating2'] = "";
		}

	}

	return $check_stat;

}

Wobei ich rating2 und autolearn nur dazu verwende, in der E-Mail, die ich nach jedem Eintrag bekomme, Auskunft darüber zu geben, wie „erfolgreich“ denn das „Lernen“ war.

Egal wie … dank Thomas Bayes und ein paar netten Artikeln über Spambekämpfung (namentlich A Plan for Spam, Spam Detection und Better Bayesian Filtering) konnte ich ein Progrämmchen schreiben, was meinen Weblog und mein Gästebuch weitestgehend frei von Spam hält. Und zwar mit einer Datenbank, die gerade mal gut 200 KB klein ist. Würde das nicht so gut funktionieren, hätte ich die Kommentarfunktion und mein Gästebuch schon lang rausschmeißen müssen. Weil den ganzen Kram per Hand auszusortieren wäre mir eindeutig zu blöd!

Vielleicht sehen die Spammer ja irgendwann mal ein, daß es nichts nützt … so ganz allgemein – aber vermutlich bleibt das Wunschdenken ;-)