60 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
classifier "bayes" {
 | 
						|
    tokenizer {
 | 
						|
    name = "osb";
 | 
						|
    }
 | 
						|
 | 
						|
    backend = "redis";
 | 
						|
    servers = "redis:6379";
 | 
						|
    min_tokens = 11;
 | 
						|
    min_learns = 20;
 | 
						|
    autolearn = true;
 | 
						|
 | 
						|
    per_user = <<EOD
 | 
						|
return function(task)
 | 
						|
    local rcpt = task:get_recipients(1)
 | 
						|
 | 
						|
if rcpt then
 | 
						|
    one_rcpt = rcpt[1]
 | 
						|
    if one_rcpt['domain'] then
 | 
						|
        return one_rcpt['domain']
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
return nil
 | 
						|
end
 | 
						|
EOD
 | 
						|
 | 
						|
    statfile {
 | 
						|
        symbol = "BAYES_HAM";
 | 
						|
        spam = false;
 | 
						|
    }
 | 
						|
    statfile {
 | 
						|
        symbol = "BAYES_SPAM";
 | 
						|
        spam = true;
 | 
						|
    }
 | 
						|
    learn_condition =<<EOD
 | 
						|
return function(task, is_spam, is_unlearn)
 | 
						|
    local prob = task:get_mempool():get_variable('bayes_prob', 'double')
 | 
						|
 | 
						|
    if prob then
 | 
						|
        local in_class = false
 | 
						|
        local cl
 | 
						|
        if is_spam then
 | 
						|
            cl = 'spam'
 | 
						|
            in_class = prob >= 0.95
 | 
						|
        else
 | 
						|
            cl = 'ham'
 | 
						|
            in_class = prob <= 0.05
 | 
						|
        end
 | 
						|
 | 
						|
        if in_class then
 | 
						|
            return false,string.format('already in class %s; probability %.2f%%',
 | 
						|
            cl, math.abs((prob - 0.5) * 200.0))
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    return true
 | 
						|
end
 | 
						|
EOD
 | 
						|
}
 |