void insert(struct ss **r, int v) { if (!(*r)) { *r = &t[v]; t[v].hams = !isspam(v); t[v].spams = isspam(v); return; } if (t[v].score < (*r)->score) insert(&(*r)->left, v); else insert(&(*r)->right, v); (*r)->hams += (!isspam(v)); (*r)->spams += isspam(v); }
int main() { scanf("%*[^\n]"); thams = tspams = 0; for (n = 0; 2 == scanf("%*d%*f%*d%d%*d%*d%*d%*d%*d%*f%lf", &t[n].qrel, &t[n].score); n++) { t[n].score += random() * 1e-20; if (t[n].qrel == 1) thams++; else tspams++; } head = NULL; hams = spams = 0; for (i = 0; i < n; i++) { double hamabove = hamgt(head, t[i].score); double spambelow = spamlt(head, t[i].score); double eps = .3; /* * double oddsratio = (hams-hamabove+eps)/(hamabove+eps) * (spambelow+eps)/(spams-spambelow+eps); * double oddsratio = 1/(hamabove+eps) * (spambelow+eps); * double logoddsratio = log(oddsratio); */ double hamNtail = (hamabove + eps) / (hams + eps); double spamNtail = (spambelow + eps) / (spams + eps); double tail = (hamabove + spambelow + eps + eps) / (hams + spams + eps + eps); double spamCtail = spamNtail / tail; double hamCtail = hamNtail / tail; /* double logoddsratio = log(spamNtail/hamNtail); */ double logoddsratio = log((spambelow * hams + eps) / (hamabove * spams + eps)); printf("%d judge=%s class=%s score=%f hamprob=%f spamprob=%f sum %f hamNtail %f spamNtail %f tail %f\n", i + 1, isspam(i) ? "spam" : "ham", logoddsratio <= 0 ? "ham" : "spam", logoddsratio, hamCtail, spamCtail, hamCtail + spamCtail, hamNtail, spamNtail, tail); if (isspam(i)) { spams++; } else { hams++; } insert(&head, i); } return 0; }
int main(void) { char *mesg; setprogname("spam-2"); spaminit(); mesg = read_mesg(stdin); if (mesg == NULL) eprintf("Could not read message."); if (isspam(mesg)) printf("spam\n"); else printf("not spam\n"); free(mesg); return 0; }