mosesdecoder/moses/LM/oxlm/OxLMParallelMapper.cpp
2015-01-14 11:07:42 +00:00

44 lines
1.3 KiB
C++

#include "moses/LM/oxlm/OxLMParallelMapper.h"
#include "lbl/parallel_vocabulary.h"
#include "moses/FactorCollection.h"
using namespace std;
namespace Moses
{
OxLMParallelMapper::OxLMParallelMapper(
const boost::shared_ptr<oxlm::Vocabulary>& vocab,
bool pos_back_off,
const FactorType& pos_factor_type)
: OxLMMapper(vocab, pos_back_off, pos_factor_type)
{
boost::shared_ptr<oxlm::ParallelVocabulary> parallel_vocab =
dynamic_pointer_cast<oxlm::ParallelVocabulary>(vocab);
assert(parallel_vocab != nullptr);
for (int i = 0; i < parallel_vocab->sourceSize(); ++i) {
string word = parallel_vocab->convertSource(i);
FactorCollection& fc = FactorCollection::Instance();
const Moses::Factor* factor = fc.AddFactor(word, false);
moses2SourceOxlm[factor] = i;
}
kSOURCE_UNKNOWN = parallel_vocab->convertSource("<unk>");
}
int OxLMParallelMapper::convertSource(const Word& word) const
{
const Moses::Factor* word_factor = word.GetFactor(0);
Coll::const_iterator iter = moses2SourceOxlm.find(word_factor);
if (posBackOff && iter == moses2SourceOxlm.end()) {
const Moses::Factor* pos_factor = word.GetFactor(posFactorType);
iter = moses2SourceOxlm.find(pos_factor);
}
return iter == moses2SourceOxlm.end() ? kSOURCE_UNKNOWN : iter->second;
}
} // namespace Moses