nasauber.de

Blog: Einträge 10.02–28.03.2006

Reguläre Ausdrücke

Ich frage mich ernsthaft, wie ich früher ohne reguläre Ausdrücke leben konnte. Das könnt ich mir beim besten Willen nicht mehr vorstellen!

Anlaß für die Freude: Mein Gästebuch und mein Weblog verlinkt jetzt URLs in Einträgen und Kommentaren automatisch. War an sich auch net schwer: mit einem

/(.*?)((?:https?:\/\/|www.)[^\s">]+)(.*)/

ist da schon viel getan! Wobei ich zugeben muß, daß ich vor ein paar Jahren noch mit Unverständnis auf eine fürs ungeübte Auge verständlicherweise kryptische Zeile Code reagiert hätte ;-) Die php-Umsetzung sieht dann folgendermaßen aus:

preg_match("/(.*?)((?:https?:\/\/|www.)[^\s">]+)(.*)/", $eintrag, $treffer);

Danach hat man dann in $treffer[1] den Text vor dem ersten Link, in $treffer[2] den Link selber und in $treffer[3] den Text danach. Dann muß man ja bloß schauen, daß der Link auch mit „http://“ anfängt und ob's ein interner ist (/^http:\/\/www.nasauber.de/) und entsprechend verlinken. Dann ab mit Treffer 1 und 2 in die Ausgabe und Treffer 3 wird wiederum nach nem Link durchsucht. Und so weiter :-)

Mit Perl könnt man das natürlich noch schöner machen. Und kürzer: Nach einem

$eintrag =~ !((?:https?://|www.)[^\s">]+)!;

hat man in $` den Text vor dem Link, in $1 den Link selber und in $' den Text danach. Aber wenn der Rest der Homepage (leider) in php geschrieben ist, kann man halt nix machen …

Auch meine kürzlich geschriebene Download-Statistik wäre ohne reguläre Ausdrücke aufgeschmissen: denn da wird erstmal geschaut, was grep '$gestern_log.\+GET.\+.gz' /.../...log so zu bieten hat und per /\"(.+?)\".+\"(.+?)\"$/ werden die relevanten Daten rausgezogen.

Ich weiß nicht, wer den Kram erfunden hat … aber vielen Dank dafür :-)


Laaangweilig

Ich glaube, ich habe mir im letzten halben Jahr, in dem ich auf's Physikum gelernt habe, nichts sehnlicher gewünscht, als daß mir mal wieder langweilig ist. So richtig. Tja … Physikum ist (endlich!!!) vorbei, und jetzt kommt es ab und an tatsächlich vor, daß mir langweilig ist. Und was soll ich sagen? Langeweile nervt. Also sucht man sich doch einfach mal was, was man tun kann.

Was ich schon lang machen wollte: das Menüsystem meiner Homepage mal ordentlich schreiben. Das stammt noch aus der Zeit, als ich abi2002amschiller.de gemacht habe. Und da hatte ich – milde gesagt – nur grundlegende Programmierkenntnisse. Also los! Okay … einen Nachmittag später war der Zauber vorbei und das neue Menüsystem fertig. Sieht genauso aus, wie das alte, aber jetzt isses schön geschrieben. Ist doch toll, oder?
Also, was jetzt? Die Fachschaftshomepage will doch schon lang mal überarbeitet werden und vor allem mal aufgeräumt. Also: neues Menüsystem eingebaut, alles neu strukturiert. Da wäre auch noch viel zu tun … aber irgendwie hab ich keine Lust.

Langeweile macht träge. Ich wollte auch schon lang mal den Bauplan und Fotos vom Bau meines Liegefahrrads online stellen. Oder überhaupt mal ein paar Informationen über mich – für die, die's interessiert. Wenn's denn einen interessiert ;-)

Naja, immerhin hab ich ja noch 4 Wochen Zeit, bevor die Klinik losgeht. Und da wird schon noch ein bißchen was werden. Und vielleicht auch das eine oder andere, was jetzt nichts mit Computer-Kram zu tun hat ;-)


bayes-php

Gesagt, getan: nachdem ich meinen Bayes-Filter in php geschrieben und einige Zeit getestet habe, stelle ich ihn jetzt der Allgemeinheit zur Verfügung. Dem ganzen habe ich den höchst kreativen Namen „bayes-php“ gegeben, das Programm steht ab jetzt zum Download bereit.

Standardmäßig benutzt bayes-php eine BerkeleyDB, um die statistischen Daten der gelernten Texte zu speichern. Falls diese nicht verfügbar sein sollte, kann alternativ auch eine MySQL-Tabelle benutzt werden.

Nach ca. 100 gelernten Spam-Einträgen schätzt der Filter so gut wie alle Spam-Texte, die ich ihm anbiete, mit 90 % Wahrscheinlichkeit oder mehr als Spam ein. Den Rest meist mit zumindest mehr als 70–80 %. Wo man die Grenze setzt, ab wann ein Eintrag als Spam gehandhabt wird, bleibt jedem selbst überlassen.

Also auf jeden Fall viel Spaß damit! Ich würde mich freuen, wenn jemand den Filter benutzen und mir evtl. auch Feedback bezüglich der Leistungsfähigkeit zukommen lassen würde :-)


Thomas Bayes [Update]

… so heißt der nette Mathematiker, der das nach ihm benannte Bayessche Theorem über bedingte Wahrscheinlichkeit aufgestellt hat. Gut so! Weil das ist die Grundlage für die Textkategorisierung aufgrund statistischer Daten der Bayes-Filter, die (z. B. in Thunderbird, Spamassassin oder Bogofilter) zur Identifizierung und Bekämpfung von Spam eingesetzt.

Bedingt dadurch, daß in letzter Zeit einige meiner Bekannten bzw. Betreiber von Seiten, die ich öfters besuche, ihr Gästebuch geschlossen haben, weil es von Spam überschwemmt wird, hab ich mir gedacht, daß es vielleicht nicht dumm wäre, vorzusorgen.
Auf der französischsprachigen Seite http://www.xhtml.net/ habe ich dann nach kurzem Suchen eine php-Implementation eines Bayes-Filters gefunden: den PHP Naive Bayesian Filter. Das Programm schien mir ein bißchen „zu“ objektorientiert und komplex zu sein, aber nach ein paar Änderungen ist der Quellcode dann doch kleiner und übersichtlicher geworden. Jetzt läuft das ganze erstmal auf meinem lokalen Server zum Testen. Das einzige, was ich jetzt noch brauche, sind Spameinträge ;-)
Die ersten Versuche sehen sehr vielversprechend aus. Sollte mein Gästebuch oder Weblog also demnächst auch zugespammt werden, könnte es passieren, daß ein Bot (oder sonstwer) statt eines „Eintrag gespeichert“ ein „Mein Bayes-Filter denkt, daß dieser Eintrag Spam ist, deswegen wird er nicht sofort gespeichert. Sollte dem nicht so sein, wird der Eintrag nachträglich veröffentlicht.“ zu sehen bekommt.

Naja, warten wir's mal ab!

Update:

Das Script hat mir doch nicht so gefallen, bzw. es hat doch nicht so gut funktioniert, wie ich mir das vorgestellt hatte. Also hab ich kurzerhand meinen eigenen Bayes-Filter geschrieben. Viel kleiner und übersichtlicher – und vor allem mit einer BerkeleyDB statt MySQL als Datenbank. Ob's funktioniert, wird man sehen …
Die ersten (Test-)Ergebnisse machen auf jeden Fall einen guten Eindruck und liefern bessere Ergebnisse, als es PHPNaiveBayesian getan hat. Wenn ich das ganze noch etwas getestet habe, dann werde ich den Filter auch hier veröffentlichen. Ich denke mal, es besteht einiger Bedarf an einem kleinen, effektiven Bayes-Filter, der in php geschrieben ist ;-)