 jeremy the total collections are NUMBER messages i trained with NUMBER NUMBER messages while that s not a lot of training data i picked random subsets of my corpora and got much better behavior this is URL output f p rate per run in left column f n rate in right training on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER training on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER training on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER training on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER training on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER total false pos NUMBER NUMBER NUMBER total false neg NUMBER NUMBER NUMBER another full run with another randomly chosen but disjoint NUMBER of each in each set was much the same the score distribution is also quite sharp ham distribution for all runs NUMBER items NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER spam distribution for all runs NUMBER items NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER it s hard to say whether you need better ham or better spam but i suspect better spam wink NUMBER of the NUMBER most powerful discriminators here were html related spam indicators the top NUMBER overall were font NUMBER NUMBER NUMBER content type text plain NUMBER NUMBER NUMBER body NUMBER NUMBER NUMBER html NUMBER NUMBER NUMBER click NUMBER NUMBER NUMBER html NUMBER NUMBER NUMBER wrote NUMBER NUMBER NUMBER skip NUMBER NUMBER NUMBER NUMBER python NUMBER NUMBER NUMBER content type text html NUMBER NUMBER NUMBER the html tags come from non multipart alternative html messages from which html tags aren t stripped and there are lots of these in my spam sets that doesn t account for it though if i strip html tags out of those too the rates are only a little worse raining on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER raining on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER raining on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER raining on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER raining on data ham setNUMBER data spam setNUMBER NUMBER hams NUMBER spams NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER otal false pos NUMBER NUMBER NUMBER otal false neg NUMBER NUMBER NUMBER the NUMBERth strongest discriminator still finds another html clue though subject python NUMBER NUMBER NUMBER money NUMBER NUMBER NUMBER content type text plain NUMBER NUMBER NUMBER charset us ascii NUMBER NUMBER NUMBER i m NUMBER NUMBER NUMBER content type text html NUMBER NUMBER NUMBER nbsp NUMBER NUMBER NUMBER wrote NUMBER NUMBER NUMBER python NUMBER NUMBER NUMBER click NUMBER NUMBER NUMBER heh i forgot all about nbsp 