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

Beitrag lesen

Hallo Forum,

Tabelle filter_words
   word VARBINARY(50)
   -- Es ist gute Praxis, SQL-Schlüsselwörter groß zu schreiben, siehe z.B.
   -- MySQL-Handbuch

Ich mag diese Praxis nicht, ich habe die ganze Zeit das Gefühl, dass meine SQL-Statements mich anschreien.

-- Warum ausgerechnet VARBINARY, warum genau dieser Datentyp.

Weil der Fall relevant ist, wenn ich varchar nehme kann ich nicht "Foo" und "foo" gleichzeitig in der Tabelle speichern.

-- Begründe die 50.

Relativ großes Maximum, mit dem man herumexperimentieren kann.

-- die Angabe der Storage-Engine ist überflüssig, oder hast Du bestimmte
   -- Gründe ausgerechnet MyIsam zu verwenden?

Ja, Performance. In meiner MySQL-Installation ist InnoDB voreingestellt, ich brauche aber weder Transaktionen noch referentielle Integrität, auch nicht wenn mehrere Benutzer gleichzeitig Trainingsdaten einfügen.

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.

Das ist mir bewusst, aber die Spamfilter-Klasse ist nicht die Text-Kategorisierer-Klasse.

Der Text-Kategorisierer entstand bevor ich den Satz von Bayes anwenden konnte und verwendet ein krudes mathematisches Konstrukt, das in der nächsten Version ersetzt wird und kann beliebig viele Kategorien ohne Änderung der Tabellen verwalten, erzeugt aber ziemlich viel overhead.

Der Spamfilter kann nur zwei Kategorien, aber dafür verbraucht er auch relativ wenig Speicherplatz.

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.

In dieser Tabelle sind Zeit ihres Lebens nur diese beiden Datensätze, die halt die Anzahl Wörter und die Anzahl Texte speichern. Wo genau ist jetzt das Problem?

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.

Meinst du so eine Tabelle für die Statistiken?

  
create table filter_stats (  
 id integer undigned auto_increment primary key,  
 category varchar(10) not null unique,  
 lnum float default 0,  
 lwords float default 0  
);  

Dein PHP-Code ist im Archiv, warum nicht auch Deine SQL-Statements?

Die SQL-Statements sind im PHP-Code bzw. werden von ihm zusammengebaut, wozu brauche ich da noch gesonderte 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.

Deine Ausführungen zum Aufbau des Artikels werde ich zu Hause nochmal in aller Ruhe durchgehen und den Artikel überarbeiten.

Gruß
Alexander Brock

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