// A simple algorithm with majority voting Counter<std::string, double> fast_scores(const Example& example) { Counter<std::string, double> res; for (const auto& it: _word_counter._counter2) { const auto& label = it.first; const auto& prob_wc = it.second; for (const auto& word: example._words) { if (prob_wc.contains(word)) { res.add(label, 1); } } } return res; }
Counter<std::string, double> scores(const Example& example) { Counter<std::string, double> res; bool is_any_words_matched = false; for (const auto& cls: _class_counter._counter) { const auto& label = cls.first; double prior = static_cast<double>(cls.second); res.add(label, log(prior + _class_smoothing)); double log_denom = log(_word_totals.get(label) + _vocab_size * _word_smoothing); double log_prob = 0.0; auto prob_wc = _word_counter.get(label); for (const auto& word: example._words) { if (prob_wc.contains(word)) { is_any_words_matched = true; } log_prob += log(prob_wc.get_or_else(word, 0) + _word_smoothing) - log_denom; } res.add(label, log_prob); } if (is_any_words_matched) { return res; } else { return Counter<std::string, double>(); } }