我目前正在研究贝叶斯垃圾邮件过滤器,使用算法制作过滤器,但它不适用于长电子邮件,只有太多的值可以乘以它超出double
的范围。我想要做到这一点,以便我只采取10或20个最重要的(垃圾邮件和火腿的最高值)并且只乘以它们。我想在内部再创建一个Dictionary
,然后将值乘以它。
这就是现在的样子:
if (countsWordOccurenceSpam.ContainsKey(word.Key) && (!countsWordOccurenceOk.ContainsKey(word.Key)))
{
int spamValue = 0;
countsWordOccurenceSpam.TryGetValue(word.Key, out spamValue);
totals = spamValue ;
fprob_spam = ((double)spamValue) / ile_spam;
sum_spam = (((weight * probability) + (totals * fprob_spam)) / (totals + weight));
sum_ok = ((weight * probability) / (totals + weight));
sum_spam = Math.Pow(sum_spam, word.Value);
sum_ok = Math.Pow(sum_ok, word.Value);
wp_spam_1 = wp_spam_1 * sum_spam;
last_o_1 = last_o_1 * sum_ok;
}
这是算法的一部分,现在我正在考虑将sum_spam中的所有值都放到一个Dictionary
,将sum_ok
中的所有值放到另一个值中,并使用.Take(10)
来选择10个最高值并将它们全部相乘。
看起来好吗?我真的认为效率很低,有没有办法做到这一点?