public double scoreSentence(List<String> sentence) { double p = 0; int M = this.baseModel.getLmOrder(); List<String> normalizedSentence = new ArrayList<String>(); final List<String> sentenceWithBounds = new BoundedList<String>( sentence, baseModel.getWordIndexer().getStartSymbol(), baseModel.getWordIndexer().getEndSymbol()); final int lmOrder = baseModel.getLmOrder() + 1; float sentenceScore = 0.0f; float previousScore = 0.0f; // beginnetje for (int i = 1; i < lmOrder - 1 && i <= sentenceWithBounds.size() + 1; ++i) { final List<String> ngram = sentenceWithBounds.subList(-1, i); final float scoreNgram = (float) getLogProb(ngram, previousScore); sentenceScore += scoreNgram; previousScore = scoreNgram; } // rest for (int i = lmOrder - 1; i < sentenceWithBounds.size() + 2; ++i) { final List<String> ngram = sentenceWithBounds.subList(i - lmOrder, i); final float scoreNgram = (float) getLogProb(ngram, previousScore); sentenceScore += scoreNgram; previousScore = scoreNgram; } return sentenceScore; }