00001 #pragma once 00002 00003 #include <string> 00004 #include "lm/model.hh" 00005 00006 namespace Moses 00007 { 00008 00009 class KenOSMBase 00010 { 00011 public: 00012 virtual ~KenOSMBase() {} 00013 00014 virtual float Score(const lm::ngram::State&, StringPiece, 00015 lm::ngram::State&) const = 0; 00016 00017 virtual const lm::ngram::State &BeginSentenceState() const = 0; 00018 00019 virtual const lm::ngram::State &NullContextState() const = 0; 00020 }; 00021 00022 template <class KenModel> 00023 class KenOSM : public KenOSMBase 00024 { 00025 public: 00026 KenOSM(const char *file, const lm::ngram::Config &config) 00027 : m_kenlm(file, config) {} 00028 00029 float Score(const lm::ngram::State &in_state, 00030 StringPiece word, 00031 lm::ngram::State &out_state) const { 00032 return m_kenlm.Score(in_state, m_kenlm.GetVocabulary().Index(word), 00033 out_state); 00034 } 00035 00036 const lm::ngram::State &BeginSentenceState() const { 00037 return m_kenlm.BeginSentenceState(); 00038 } 00039 00040 const lm::ngram::State &NullContextState() const { 00041 return m_kenlm.NullContextState(); 00042 } 00043 00044 private: 00045 KenModel m_kenlm; 00046 }; 00047 00048 typedef KenOSMBase OSMLM; 00049 00050 OSMLM* ConstructOSMLM(const char *file, util::LoadMethod load_method); 00051 00052 00053 } // namespace