|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <boost/foreach.hpp> |
|
#include "util/exception.hh" |
|
#include "LexicalReordering.h" |
|
#include "LRModel.h" |
|
#include "PhraseBasedReorderingState.h" |
|
#include "BidirectionalReorderingState.h" |
|
#include "../../TranslationModel/PhraseTable.h" |
|
#include "../../System.h" |
|
#include "../../PhraseBased/PhraseImpl.h" |
|
#include "../../PhraseBased/Manager.h" |
|
#include "../../PhraseBased/Hypothesis.h" |
|
#include "../../PhraseBased/TargetPhrases.h" |
|
#include "../../PhraseBased/TargetPhraseImpl.h" |
|
#include "../../legacy/InputFileStream.h" |
|
#include "../../legacy/Util2.h" |
|
|
|
#ifdef HAVE_CMPH |
|
#include "../../TranslationModel/CompactPT/LexicalReorderingTableCompact.h" |
|
#endif |
|
|
|
|
|
using namespace std; |
|
|
|
namespace Moses2 |
|
{ |
|
|
|
|
|
|
|
LexicalReordering::LexicalReordering(size_t startInd, const std::string &line) |
|
: StatefulFeatureFunction(startInd, line) |
|
, m_blank(NULL) |
|
, m_propertyInd(-1) |
|
, m_coll(NULL) |
|
, m_configuration(NULL) |
|
#ifdef HAVE_CMPH |
|
, m_compactModel(NULL) |
|
#endif |
|
{ |
|
ReadParameters(); |
|
assert(m_configuration); |
|
|
|
} |
|
|
|
LexicalReordering::~LexicalReordering() |
|
{ |
|
delete m_coll; |
|
delete m_configuration; |
|
#ifdef HAVE_CMPH |
|
delete m_compactModel; |
|
#endif |
|
} |
|
|
|
void LexicalReordering::Load(System &system) |
|
{ |
|
MemPool &pool = system.GetSystemPool(); |
|
|
|
if (m_propertyInd >= 0) { |
|
|
|
#ifdef HAVE_CMPH |
|
} else if (FileExists(m_path + ".minlexr")) { |
|
m_compactModel = new LexicalReorderingTableCompact(m_path + ".minlexr", |
|
m_FactorsF, m_FactorsE, m_FactorsC); |
|
m_blank = new (pool.Allocate<PhraseImpl>()) PhraseImpl(pool, 0); |
|
#endif |
|
} else { |
|
m_coll = new Coll(); |
|
InputFileStream file(m_path); |
|
string line; |
|
size_t lineNum = 0; |
|
|
|
while (getline(file, line)) { |
|
if (++lineNum % 1000000 == 0) { |
|
cerr << lineNum << " "; |
|
} |
|
|
|
std::vector<std::string> toks = TokenizeMultiCharSeparator(line, "|||"); |
|
assert(toks.size() == 3); |
|
PhraseImpl *source = PhraseImpl::CreateFromString(pool, system.GetVocab(), |
|
system, toks[0]); |
|
PhraseImpl *target = PhraseImpl::CreateFromString(pool, system.GetVocab(), |
|
system, toks[1]); |
|
std::vector<SCORE> scores = Tokenize<SCORE>(toks[2]); |
|
std::transform(scores.begin(), scores.end(), scores.begin(), |
|
TransformScore); |
|
std::transform(scores.begin(), scores.end(), scores.begin(), FloorScore); |
|
|
|
Key key(source, target); |
|
(*m_coll)[key] = scores; |
|
} |
|
} |
|
} |
|
|
|
void LexicalReordering::SetParameter(const std::string& key, |
|
const std::string& value) |
|
{ |
|
if (key == "path") { |
|
m_path = value; |
|
} else if (key == "type") { |
|
m_configuration = new LRModel(value, *this); |
|
} else if (key == "input-factor") { |
|
m_FactorsF = Tokenize<FactorType>(value); |
|
} else if (key == "output-factor") { |
|
m_FactorsE = Tokenize<FactorType>(value); |
|
} else if (key == "property-index") { |
|
m_propertyInd = Scan<int>(value); |
|
} else { |
|
StatefulFeatureFunction::SetParameter(key, value); |
|
} |
|
} |
|
|
|
FFState* LexicalReordering::BlankState(MemPool &pool, const System &sys) const |
|
{ |
|
FFState *ret = m_configuration->CreateLRState(pool); |
|
return ret; |
|
} |
|
|
|
void LexicalReordering::EmptyHypothesisState(FFState &state, |
|
const ManagerBase &mgr, const InputType &input, |
|
const Hypothesis &hypo) const |
|
{ |
|
BidirectionalReorderingState &stateCast = |
|
static_cast<BidirectionalReorderingState&>(state); |
|
stateCast.Init(NULL, hypo.GetTargetPhrase(), hypo.GetInputPath(), true, |
|
&hypo.GetBitmap()); |
|
} |
|
|
|
void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system, |
|
const Phrase<Moses2::Word> &source, const TargetPhraseImpl &targetPhrase, Scores &scores, |
|
SCORE &estimatedScore) const |
|
{ |
|
} |
|
|
|
void LexicalReordering::EvaluateInIsolation(MemPool &pool, const System &system, const Phrase<SCFG::Word> &source, |
|
const TargetPhrase<SCFG::Word> &targetPhrase, Scores &scores, |
|
SCORE &estimatedScore) const |
|
{ |
|
UTIL_THROW2("Don't use with SCFG models"); |
|
} |
|
|
|
|
|
void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool, |
|
const TargetPhrases &tps, const Phrase<Moses2::Word> &sourcePhrase) const |
|
{ |
|
BOOST_FOREACH(const TargetPhraseImpl *tp, tps) { |
|
EvaluateAfterTablePruning(pool, *tp, sourcePhrase); |
|
} |
|
} |
|
|
|
void LexicalReordering::EvaluateAfterTablePruning(MemPool &pool, |
|
const TargetPhraseImpl &targetPhrase, const Phrase<Moses2::Word> &sourcePhrase) const |
|
{ |
|
if (m_propertyInd >= 0) { |
|
SCORE *scoreArr = targetPhrase.GetScoresProperty(m_propertyInd); |
|
targetPhrase.ffData[m_PhraseTableInd] = scoreArr; |
|
#ifdef HAVE_CMPH |
|
} else if (m_compactModel) { |
|
|
|
const Values values = m_compactModel->GetScore(sourcePhrase, targetPhrase, |
|
*m_blank); |
|
if (values.size()) { |
|
assert(values.size() == m_numScores); |
|
|
|
SCORE *scoreArr = pool.Allocate<SCORE>(m_numScores); |
|
for (size_t i = 0; i < m_numScores; ++i) { |
|
scoreArr[i] = values[i]; |
|
} |
|
targetPhrase.ffData[m_PhraseTableInd] = scoreArr; |
|
} else { |
|
targetPhrase.ffData[m_PhraseTableInd] = NULL; |
|
} |
|
#endif |
|
} else if (m_coll) { |
|
|
|
|
|
|
|
const Values *values = GetValues(sourcePhrase, targetPhrase); |
|
assert(values->size() == m_numScores); |
|
|
|
if (values) { |
|
SCORE *scoreArr = pool.Allocate<SCORE>(m_numScores); |
|
for (size_t i = 0; i < m_numScores; ++i) { |
|
scoreArr[i] = (*values)[i]; |
|
} |
|
targetPhrase.ffData[m_PhraseTableInd] = scoreArr; |
|
} else { |
|
targetPhrase.ffData[m_PhraseTableInd] = NULL; |
|
} |
|
} |
|
} |
|
|
|
void LexicalReordering::EvaluateWhenApplied(const ManagerBase &mgr, |
|
const Hypothesis &hypo, const FFState &prevState, Scores &scores, |
|
FFState &state) const |
|
{ |
|
const LRState &prevStateCast = static_cast<const LRState&>(prevState); |
|
prevStateCast.Expand(mgr, *this, hypo, m_PhraseTableInd, scores, state); |
|
} |
|
|
|
const LexicalReordering::Values *LexicalReordering::GetValues( |
|
const Phrase<Moses2::Word> &source, const Phrase<Moses2::Word> &target) const |
|
{ |
|
Key key(&source, &target); |
|
Coll::const_iterator iter; |
|
iter = m_coll->find(key); |
|
if (iter == m_coll->end()) { |
|
return NULL; |
|
} else { |
|
return &iter->second; |
|
} |
|
} |
|
|
|
void LexicalReordering::EvaluateWhenApplied(const SCFG::Manager &mgr, |
|
const SCFG::Hypothesis &hypo, int featureID, Scores &scores, |
|
FFState &state) const |
|
{ |
|
UTIL_THROW2("Not implemented"); |
|
} |
|
|
|
} |
|
|