[Spambayes] Bugs? Yup. Fixes? Definitely. Downloadable installer and patches? Yes.
thruska at cubiclesoft.com
Tue Dec 25 20:14:28 CET 2007
[For those interested in an installable build of 1.0.4 with my fixes
and/or want to see the source code modifications I've made, scroll down]
While applying the modifications I suggested a couple weeks ago, I'm
fairly (99%) certain I've run into at least one critical bug in the
Spambayes 1.0.4 POP3 proxy. If you use the proxy, read on.
1) Messages are not saved in their original format. There is actually
a hack that _should NOT exist_ in Corpus.py that is referenced from
----- ProxyUI.py -----
# fromCache is a fix for sf #851785.
# See the comments in Corpus.py
----- ProxyUI.py -----
----- Corpus.py -----
# If the notate_to or notate_subject options are set, then the
# message in the cache has this information, and it will get used
# in training, which is not ideal. So if that option is set, strip
# that data before training. The only time I can see this failing
# is if the option is changed at some point, so older messages
# don't have the notation, but some other program did do the same
# notation, which would be lost. This shouldn't be a big deal,
...Modify message to attempt to make it look like the original...
----- Corpus.py -----
This hack is WRONG. Training on messages that include the modified
headers is also WRONG (as far as I can tell, the code doesn't undo that
either - but having to undo anything in the first place is WRONG).
Training should only be done using the original, unmodified message. It
is difficult to impossible to revert a modified message back to its
2) sb_server.py classifies a message and modifies the headers but does
not save a copy of the original message. Instead, it saves the modified
message. It should save a copy of the original message for training
3) message.py does not offer any method of retrieving/storing a copy of
the original message. This seems like the most logical place but would
probably be hard to implement here.
My improvement/fix: Due to the nature of how the POP3 proxy operates,
it would be seriously detrimental to either performance or usability if
the modified message were eliminated altogether. Also, changing how
messages are stored would probably create a disaster of modifications to
the entire code base. Therefore, the simplest (and only _somewhat_
hacky) solution is to create an 'unknown-orig' ExpiryFileCorpus cache
that tracks the original message for training purposes.
For those who are interested in my solution and use the POP3 proxy,
here's the Windows installer version:
That applies all the recommended changes I've made to date to the 1.0.4
branch. You can train on any message and Spambayes defends itself from
letting its database get too large by rejecting messages that are
already classified correctly. It does this by running the original
message through the classifier before training on the message - thus
training only on "mistakes and unsures" as per the recommendations of
the developers. Since each message trained alters the database, I've
factored this fact in as well*. You could train on 10 messages or
60,000 messages and Spambayes will still correctly pick and choose what
to train on. In layman's terms: Spambayes is smarter than before.
* The changes I've made allow you to train on more than one message at a
time. If you've been following along with my recent rants, you know
that the existing 1.0.4 has some major statistical issues with training
beyond one message at a time. If you train on a message that would
already be classified that way, the database flattens out over time and
Spambayes will eventually not be able to figure out what is ham and what
is spam. Additionally, really large databases (e.g. 30,000+ messages)
have performance issues.
Consider wiping your Spambayes database and staring over after
installing this - especially if you have more trained on more than 2000
messages. The entire database so far was based on training on modified
messages (not the original messages!).
There is a new configuration option in the Advanced configuration page
of the POP3 proxy for controlling the name of the directory used for the
original message cache.
For those who want to see my changes (12MB file):
That contains all the source code modifications I made, binaries, etc.
The two most critical modifications are in sb_server.py and ProxyUI.py.
I heavily commented my changes in ProxyUI.py. I also updated the
InnoSetup script to build properly under InnoSetup 5.2.2.
This took: 4 hours to learn the basics of Python and how Spambayes
works. 30 minutes to apply my fixes. 12 hours to get the darn thing to
build properly under Python 2.5.1. Sort of. I'm fairly certain I hosed
the Outlook add-in part of the build really good due to not having
Outlook 2000. A few hours of testing (spanned over several days).
Total time spent on getting this all working was roughly 20 hours. Time
I'd rather have spent doing something else. However, I'm quite happy
with the result.
And all this is from someone who doesn't know Python**. Probably not
the most inspiring/reassuring statement, but I'll leave it up to the
developers to decide if my modifications are sound enough to merge into
the 1.0.4 branch (and hopefully good enough to consider releasing a
1.0.5). They might not go for the 2.5-specific changes due to the email
w/ py2exe package problems (case-sensitivity issues in py2exe), but it
would be nice if they did.
** I can edit code in almost any programming language without actually
knowing the language.
Merry Christmas! I can't think of a better Christmas present than to
know there will be more spam blocked next year thanks to my changes to
*NEW* MyTaskFocus 1.1
Get on task. Stay on task.
More information about the SpamBayes