Moin!
Ich habe zwei Tabellen in einer Datenbank:
Eine, in der steht wie viele Wörter alle Spam-Mails zusammen haben und wie viele alle erwünschten Mails.
Die Anzahl der Wörter in Spammails halte ich zwar nicht unbedingt für ein Kriterium, aber man weiß ja nie. Wenn Spammer sich üblicherweise sehr kurz fassen, und deine regulären Mailsender immer Romane schreiben, wäre das allein ja eventuell schon ein Kriterium.
Es spricht jedenfalls nichts dagegen, dieses Kriterium auch irgendwie auszuwerten und zumindest die Statistik zu befüllen.
Eine, in der steht welches Wort wie oft in Spam und wie oft in erwünschten Mails auftritt.
Das ist der eigentliche Bayes-Ansatz. Wobei das weitere Vorgehen unterschiedlich ist:
Wenn jetzt eine neue Mail getestet werden soll, wird für jedes Wort abgefragt, wie häufig es in Spam-Mails und wie häufig in erwünschten Mails auftrat.
Bis hierhin korrekt. Wobei der originale Ansatz nur die TOP-10 der gefundenen Worte nimmt. Also genauer:
Alle in der Mail gefundenen Worte werden in der Datenbank gesucht. Die dort am häufigsten in den Kategorien HAM oder SPAM eingetragenen 10 Worte werden zur Bewertung herangezogen - wenn die Mehrzahl der Worte "SPAM" sagt, scheint die Mail wohl SPAM zu sein, und umgekehrt.
Wobei jedes Wort natürlich sowohl einen HAM als auch einen SPAM-Wert besitzt, also selten wirklich eindeutig böse ist. Aber nur die eindeutigsten Worte heranzuziehen bedeutet unter Umständen einen Vorteil, weil man damit gegen die Verwässerungstaktiken in Spammails wirkt.
Dann werden die Summen gebildet und jeweils durch die gesamt-Zahl aller Wörter in den Spam- bzw. erwünschten Mails geteilt. Dann hat man zwei Zahlen, deren Betrag sehr nahe an null ist (wie nahe liegt an dem Verhältnis Textlänge/Größe der vorhandenen Datenbank), diese werden so umgerechnet, dass sie zusammen eins ergeben (wie sich das für Wahrscheinlichkeiten gehört) und das Verhältnis erhalten bleibt.
Wie du genau errechnest, was dein "Spamfaktor" sein soll, ist im Prinzip auch wieder egal, solange das Ergebnis dich zufrieden stellt. Es gibt da kein "richtig" oder "falsch", sondern nur ein reichhaltiges Experimentierfeld für dich. Und: Je individueller jeder Mailnutzer seine Spamfilter gestaltet, desto schwieriger wird es für die Spammer, Mailtexte zu erfinden, die bei allen durchkommen.
Als Trenner für Wörter habe ich übrigens folgenden regulären Ausdruck: #[\s.:,;(){}\[\]!?´`']+# hat da jemand einen besseren?
Wo du deine Worte trennst, ist ebenfalls komplett dir überlassen. Es könnte sogar schlau sein, diverse Ansätze zu benutzen. Beispielsweise kann man vor dem Worttrennen ja HTML-Tags rausfiltern, damit man Dinge wie "<span>VIA</span>GRA" erkennt. Andererseits sind solche seltsamen HTML-Tag-Kombos doch eher in SPAM zu finden, und daher doch interessant für den Filter. Eine Kombination von beidem ist also nicht unbedingt "böse", sondern bietet eventuell sogar eine Verbesserung der Erkennungsquote.
- Sven Rautenberg
My sssignature, my preciousssss!