Vinzenz Mai: Artikel-Review: Bayesscher Spam-Filter für Weblogs

Beitrag lesen

Hallo Alexander,

Bayesscher Kommentarspam-Filter

es ist schön, wieder einen neuen Artikel zu sehen. Du schreibst über ein Thema, mit dem Du Dich intensiv auseinandergesetzt hast, das Du gut kennst. Das ist _eine_ wichtige Voraussetzung, um einen guten Artikel zu schreiben. Auf der anderen Seite fällt es einem dann schwer, sich in die Lage eines anderen zu versetzen, der sich mit der Materie bisher nicht oder nur flüchtig auseinandergesetzt hat. Du läßt Aspekte weg, Du läßt Erklärungen weg, die Dir trivial erscheinen, dem Neuling in der Materie jedoch diese erst erschließen.

Was könntest Du besser machen (bitte nicht erschrecken)?

a) Einleitung: Konzepte von Spamfiltern
   Du hast wunderbares Material zusammengetragen, hübsch gegliedert.
   Nutze dies => gliedere Deine Abschnitte mit entsprechenden Unterüberschriften

Verschiedene Konzepte
   - Captcha (-varianten)
   - Variation Feldnamen
   - Versteckte Felder

Hauptabschnitt Bayesfilter
   - Konzept des Bayestheorem in einfachen Worten
     (Nein, nicht die Mathematik)
   - Vorteile
   - Nebenaspekte

b) Bayestheorem
   Nicht an zweiter Stelle, jedenfalls nicht in dieser Ausführlichkeit.
   Wenn so ausführlich, dann im Anhang, dann gern noch ausführlicher.

c) Nimm gleich die Spamformel, gleich die Umschreibung mit den Logarithmen
   im Exponenten von e. Die weitere Erläuterung im Anhang

Das tut Dir weh, vermute ich - verringert meiner Meinung nach jedoch die
Hemmschwelle, die Deine mathematischen Umformungen erzeugen. Den Hinweis
"versetzen wir uns zurück in die zehnte Klasse" lass bitte weg. Du weißt
doch selbst, dass nicht jeder, der auf diese Seiten kommt, bereits sein
zehntes Schuljahr hinter sich hat. Ich weiß auch nicht, wie es mit dem
Logarithmus an anderen Schulformen als dem Gymnasium aussieht - und auch
nicht, wann die Logarithmusgesetze derzeit auf dem Lehrplan stehen. Zu
meiner Zeit dürfte das zehnte Schuljahr gepasst haben :-)

d) Beispielimplementierung
   Statt fertiger CREATE TABLE-Statements beschreibe lieber die Tabellen,
   führe Beispieldatensätze (z.B. ein Auszug Deiner eigenen Produktivdaten)
   auf. Genauer gesagt: solche Datensätze, an denen sich ein Beispielbeitrag
   exemplarisch durcharbeiten läßt.

Warum _keine_ fertigen Statements? Es ist wichtiger, dass man versteht,
   welche Daten abgespeichert werden müssen. Das sind ja nicht besonders
   viele. Dazu lassen Deine Beispieltabellen und -beschreibungen zu wünschen
   übrig:

Tabelle filter_words
   word VARBINARY(50)
   -- Es ist gute Praxis, SQL-Schlüsselwörter groß zu schreiben, siehe z.B.
   -- MySQL-Handbuch
   -- Warum ausgerechnet VARBINARY, warum genau dieser Datentyp.
   -- Begründe die 50.
   -- die Angabe der Storage-Engine ist überflüssig, oder hast Du bestimmte
   -- Gründe ausgerechnet MyIsam zu verwenden?

Tabelle filter_stats
   Du schreibst in Deiner Signatur, dass Deine Klasse Texte kategorisieren
   kann. Darunter verstehe ich eine beliebige Anzahl von Kategorien. Deine
   Tabelle spiegelt das nicht wieder. Eine neue Kategorie bedeutet bei Dir
   eine neue Spalte. Das ist normalerweise ein Anzeichen eines ungünstig
   gewählten Tabellendesigns.

Dann füllst Du sie mit zwei Datensätzen. Viel einfacher hättest Du einfach
   den Initialinhalt der Tabelle hingeschrieben. Einfacher, verständlicher.
   Bei Deinem Design ist zudem der Spaltenname "name" ungünstig, weil
   aussagelos, gewählt. Inkonsequent und inkonsistent die beiden Datensätze:

"lnum"   ist der (natürliche) Logarithmus der Anzahl der Kommentare
   "lwords" ist der (natürliche) Logarithmus der Anzahl der Wörter

Fällt Dir etwas auf? Welchen Eintrag solltest Du treffender wählen?
   Inkonsequent der Datentyp: CHAR(5) wäre ausreichend und würde zudem
   Datensätze fester Länge ermöglichen, aber das nur am Rande.
   Wenn Du die Tabelle transponierst, dann werden daraus Spaltenüberschriften
   und Du brauchst Dir keinen Gedanken über einen beschreibenderen Namen zu
   machen :-) Ich weiß, dass das Konsequenzen für Deine ganze Klasse hat,
   aber das sollte machbar sein.

Mein Hauptanliegen:

e) Erläutere die verschiedenen Arbeitsschritte an einem Beispiel. Besser noch
   ein Beispiel für Spam, ein Beispiel für Ham. Ein einfaches Beispiel ohne
   komplexe Tokens, ein Text von vielleicht 20 Wörtern Umfang. Die Tabellen
   mit genau die erforderlichen Datensätzen gefüllt, mit Werten aus Deiner
   Praxis.

In Einzelschritten
     - die Verarbeitung des Textes erläutern,
     - den Spamwert berechnen,
     - die neuen Tabellenwerte ermitteln
   damit auch die Fähigkeit zum Selbstlernen demonstrieren.

Genau solche Beispiele erleichtern meiner Meinung nach ungemein den Zugang zu
solchen Techniken, erleichtern den Zugang zur dahinter liegenden Mathematik,
motivieren vielleicht jemanden, sich damit auseinanderzusetzen, auch wenn
derjenige sonst nicht viel damit am Hut hat.

Zusammenfassung:

  • Du hast Dir ein interessantes Thema ausgesucht, von dem Du viel Ahnung hast.
  • Du hast bereits gutes Material gesammelt,
  • Du hast eine ausbaufähige Gliederung.
  • Nutze ein konkretes Beispiel (am besten je eines für Spam und eines für Ham),
      um die praktische Anwendung des Bayes-Theorems aufzuzeigen.
  • Verschiebe die zugrundeliegende Mathematik in die Erklärung _nach_ dem
      Beispiel. Vergleiche dazu andere Artikel:
        a) So sieht es aus/So geht es  (Beispiel)
        b) Das ist die Erklärung dafür (Bayes-Theorem)
        c) Beachte ...                 (Probleme bei der Implementierung)
  • Erläutere bei der Implementierung, was getan werden muss - nicht wie Du es
      speziell gelöst hast (das kann im Kommentar zu Deinem Code stehen).
      Dein PHP-Code ist im Archiv, warum nicht auch Deine SQL-Statements?

Ich hoffe, ich konnte Dir einige Anregungen geben, durch deren Umsetzung
Dein Artikel zugänglicher wird - und somit auch Beachtung finden wird. Das
hast Du sicherlich auch verdient.

Freundliche Grüße

Vinzenz

0 56

Artikel-Review: Bayesscher Spam-Filter für Weblogs

Alexander Brock
  • programmiertechnik
  1. 0
    Felix Riesterer
    1. 0
      Mathias Brodala
      1. 0
        Alexander Brock
        1. 0
          Mathias Brodala
          1. 0
            Alexander Brock
  2. 1
    Robert Bienert
    1. 0
      Alexander Brock
      1. 1

        kleine anmerkung zum multiplikations-zeichen

        seth_not@home
        • sonstiges
        1. 0
          Alexander Brock
  3. 6
    Vinzenz Mai
    1. 1
      seth
      1. 0
        Alexander Brock
        1. 1
          seth_not@home
        2. 1
          Blaubart
          1. 1

            kleine anmerkung zur kommasetzung

            seth_not@home
            1. 1
              Auge
              1. 0
                seth
                • sonstiges
                1. 0
                  Auge
                  1. 0

                    ole, ole, metadiskussionen ueber komma-diskussionen

                    seth
                    1. 0

                      "ole, ole" ... die alten Schweden, die!

                      Auge
      2. 1
        Blaubart
        1. 1
          seth_not@home
          1. 1
            Blaubart
    2. 0
      Alexander Brock
      1. 3
        Vinzenz Mai
  4. 2
    seth
    1. 0
      Alexander Brock
      1. 1
        seth_not@home
        1. 0
          Alexander Brock
          1. 1
            seth
            1. 0
              Alexander Brock
              1. 1
                seth_not@home
                1. 0
                  Alexander Brock
                  1. 1
                    seth_not@home
                    1. 0
                      Alexander Brock
                      1. 0
                        seth_not@home
                        1. 0
                          Alexander Brock
                          1. 1
                            seth
                            1. 0
                              Alexander Brock
  5. 0
    Alexander Brock
    1. 1
      Robert Bienert
      1. 0
        Alexander Brock
        1. 1
          Robert Bienert
          1. 0
            Alexander Brock
            1. 1
              seth
              1. 0
                Alexander Brock
                1. 1
                  seth
                  1. 0
                    Alexander Brock
                  2. 0
                    O'Brien
    2. 1
      Der Dicki
      1. 0
        Alexander Brock
    3. 0
      Christian Seiler
      1. 0
        Alexander Brock
        1. 0
          Christian Seiler
          1. 0
            Alexander Brock