|
#include <sstream> |
|
#include <boost/algorithm/string/predicate.hpp> |
|
#include <boost/foreach.hpp> |
|
|
|
#include "moses/FF/FFState.h" |
|
#include "moses/TranslationOptionList.h" |
|
#include "LexicalReordering.h" |
|
#include "LRState.h" |
|
#include "moses/StaticData.h" |
|
#include "moses/Util.h" |
|
#include "moses/InputPath.h" |
|
|
|
using namespace std; |
|
using namespace boost::algorithm; |
|
|
|
namespace Moses |
|
{ |
|
LexicalReordering:: |
|
LexicalReordering(const std::string &line) |
|
: StatefulFeatureFunction(line,false) |
|
{ |
|
VERBOSE(1, "Initializing Lexical Reordering Feature.." << std::endl); |
|
|
|
map<string,string> sparseArgs; |
|
m_haveDefaultScores = false; |
|
for (size_t i = 0; i < m_args.size(); ++i) { |
|
const vector<string> &args = m_args[i]; |
|
|
|
if (args[0] == "type") { |
|
m_configuration.reset(new LRModel(args[1])); |
|
m_configuration->SetScoreProducer(this); |
|
m_modelTypeString = m_configuration->GetModelString(); |
|
} else if (args[0] == "input-factor") |
|
m_factorsF =Tokenize<FactorType>(args[1]); |
|
else if (args[0] == "output-factor") |
|
m_factorsE =Tokenize<FactorType>(args[1]); |
|
else if (args[0] == "path") |
|
m_filePath = args[1]; |
|
else if (starts_with(args[0], "sparse-")) |
|
sparseArgs[args[0].substr(7)] = args[1]; |
|
else if (args[0] == "default-scores") { |
|
vector<string> tokens = Tokenize(args[1],","); |
|
for(size_t i=0; i<tokens.size(); i++) |
|
m_defaultScores.push_back( TransformScore( Scan<float>(tokens[i]))); |
|
m_haveDefaultScores = true; |
|
} else UTIL_THROW2("Unknown argument " + args[0]); |
|
} |
|
|
|
switch(m_configuration->GetCondition()) { |
|
case LRModel::FE: |
|
case LRModel::E: |
|
UTIL_THROW_IF2(m_factorsE.empty(), |
|
"TL factor mask for lexical reordering is " |
|
<< "unexpectedly empty"); |
|
|
|
if(m_configuration->GetCondition() == LRModel::E) |
|
break; |
|
case LRModel::F: |
|
UTIL_THROW_IF2(m_factorsF.empty(), |
|
"SL factor mask for lexical reordering is " |
|
<< "unexpectedly empty"); |
|
break; |
|
default: |
|
UTIL_THROW2("Unknown conditioning option!"); |
|
} |
|
|
|
|
|
size_t numScores |
|
= m_numScoreComponents |
|
= m_numTuneableComponents |
|
= m_configuration->GetNumScoreComponents(); |
|
UTIL_THROW_IF2(m_haveDefaultScores && m_defaultScores.size() != numScores, |
|
"wrong number of default scores (" << m_defaultScores.size() |
|
<< ") for lexicalized reordering model (expected " |
|
<< m_configuration->GetNumScoreComponents() << ")"); |
|
|
|
m_configuration->ConfigureSparse(sparseArgs, this); |
|
|
|
} |
|
|
|
LexicalReordering:: |
|
~LexicalReordering() |
|
{ } |
|
|
|
void |
|
LexicalReordering:: |
|
Load(AllOptions::ptr const& opts) |
|
{ |
|
m_options = opts; |
|
typedef LexicalReorderingTable LRTable; |
|
if (m_filePath.size()) |
|
m_table.reset(LRTable::LoadAvailable(m_filePath, m_factorsF, |
|
m_factorsE, std::vector<FactorType>())); |
|
} |
|
|
|
Scores |
|
LexicalReordering:: |
|
GetProb(const Phrase& f, const Phrase& e) const |
|
{ |
|
return m_table->GetScore(f, e, Phrase(ARRAY_SIZE_INCR)); |
|
} |
|
|
|
FFState* |
|
LexicalReordering:: |
|
EvaluateWhenApplied(const Hypothesis& hypo, |
|
const FFState* prev_state, |
|
ScoreComponentCollection* out) const |
|
{ |
|
VERBOSE(3,"LexicalReordering::Evaluate(const Hypothesis& hypo,...) START" << std::endl); |
|
const LRState *prev = static_cast<const LRState *>(prev_state); |
|
LRState *next_state = prev->Expand(hypo.GetTranslationOption(), hypo.GetInput(), out); |
|
|
|
VERBOSE(3,"LexicalReordering::Evaluate(const Hypothesis& hypo,...) END" << std::endl); |
|
|
|
return next_state; |
|
} |
|
|
|
FFState const* |
|
LexicalReordering::EmptyHypothesisState(const InputType &input) const |
|
{ |
|
return m_configuration->CreateLRState(input); |
|
} |
|
|
|
bool |
|
LexicalReordering:: |
|
IsUseable(const FactorMask &mask) const |
|
{ |
|
BOOST_FOREACH(FactorType const& f, m_factorsE) { |
|
if (!mask[f]) return false; |
|
} |
|
return true; |
|
} |
|
|
|
|
|
void |
|
LexicalReordering:: |
|
SetCache(TranslationOption& to) const |
|
{ |
|
if (to.GetLexReorderingScores(this)) return; |
|
|
|
|
|
if (m_table) { |
|
Phrase const& sphrase = to.GetInputPath().GetPhrase(); |
|
Phrase const& tphrase = to.GetTargetPhrase(); |
|
to.CacheLexReorderingScores(*this, this->GetProb(sphrase,tphrase)); |
|
} else { |
|
|
|
|
|
} |
|
} |
|
|
|
LRModel const& |
|
LexicalReordering |
|
::GetModel() const |
|
{ |
|
return *m_configuration; |
|
} |
|
|
|
|
|
void |
|
LexicalReordering:: |
|
SetCache(TranslationOptionList& tol) const |
|
{ |
|
BOOST_FOREACH(TranslationOption* to, tol) |
|
this->SetCache(*to); |
|
} |
|
|
|
|
|
} |
|
|
|
|