| namespace lm { | |
| namespace base { | |
| float ScoreSentence(const base::Model *model, const char *sentence) { | |
| // TODO: reduce virtual dispatch to one per sentence? | |
| const base::Vocabulary &vocab = model->BaseVocabulary(); | |
| // We know it's going to be a KenLM State. | |
| lm::ngram::State state_vec[2]; | |
| lm::ngram::State *state = &state_vec[0]; | |
| lm::ngram::State *state2 = &state_vec[1]; | |
| model->BeginSentenceWrite(state); | |
| float ret = 0.0; | |
| for (util::TokenIter<util::BoolCharacter, true> i(sentence, util::kSpaces); i; ++i) { | |
| lm::WordIndex index = vocab.Index(*i); | |
| ret += model->BaseScore(state, index, state2); | |
| std::swap(state, state2); | |
| } | |
| ret += model->BaseScore(state, vocab.EndSentence(), state2); | |
| return ret; | |
| } | |
| } // namespace base | |
| } // namespace lm | |