|
|
|
|
|
|
|
|
|
|
|
|
|
#include <boost/foreach.hpp> |
|
#include "UnknownWordPenalty.h" |
|
#include "../System.h" |
|
#include "../Scores.h" |
|
#include "../InputType.h" |
|
#include "../PhraseBased/Manager.h" |
|
#include "../PhraseBased/TargetPhraseImpl.h" |
|
#include "../PhraseBased/InputPath.h" |
|
#include "../PhraseBased/TargetPhrases.h" |
|
#include "../PhraseBased/Sentence.h" |
|
#include "../SCFG/InputPath.h" |
|
#include "../SCFG/TargetPhraseImpl.h" |
|
#include "../SCFG/Manager.h" |
|
#include "../SCFG/Sentence.h" |
|
#include "../SCFG/ActiveChart.h" |
|
|
|
using namespace std; |
|
|
|
namespace Moses2 |
|
{ |
|
|
|
UnknownWordPenalty::UnknownWordPenalty(size_t startInd, const std::string &line) |
|
:PhraseTable(startInd, line) |
|
,m_drop(false) |
|
{ |
|
m_tuneable = false; |
|
ReadParameters(); |
|
} |
|
|
|
UnknownWordPenalty::~UnknownWordPenalty() |
|
{ |
|
|
|
} |
|
|
|
void UnknownWordPenalty::SetParameter(const std::string& key, const std::string& value) |
|
{ |
|
if (key == "drop") { |
|
m_drop = Scan<bool>(value); |
|
} else if (key == "prefix") { |
|
m_prefix = value; |
|
} else if (key == "suffix") { |
|
m_suffix = value; |
|
} else { |
|
PhraseTable::SetParameter(key, value); |
|
} |
|
} |
|
|
|
void UnknownWordPenalty::ProcessXML( |
|
const Manager &mgr, |
|
MemPool &pool, |
|
const Sentence &sentence, |
|
InputPaths &inputPaths) const |
|
{ |
|
const Vector<const InputType::XMLOption*> &xmlOptions = sentence.GetXMLOptions(); |
|
BOOST_FOREACH(const InputType::XMLOption *xmlOption, xmlOptions) { |
|
TargetPhraseImpl *target = TargetPhraseImpl::CreateFromString(pool, *this, mgr.system, xmlOption->GetTranslation()); |
|
|
|
if (xmlOption->prob) { |
|
Scores &scores = target->GetScores(); |
|
scores.PlusEquals(mgr.system, *this, Moses2::TransformScore(xmlOption->prob)); |
|
} |
|
|
|
InputPath *path = inputPaths.GetMatrix().GetValue(xmlOption->startPos, xmlOption->phraseSize - 1); |
|
const SubPhrase<Moses2::Word> &source = path->subPhrase; |
|
|
|
mgr.system.featureFunctions.EvaluateInIsolation(pool, mgr.system, source, *target); |
|
|
|
TargetPhrases *tps = new (pool.Allocate<TargetPhrases>()) TargetPhrases(pool, 1); |
|
|
|
tps->AddTargetPhrase(*target); |
|
mgr.system.featureFunctions.EvaluateAfterTablePruning(pool, *tps, source); |
|
|
|
path->AddTargetPhrases(*this, tps); |
|
} |
|
} |
|
|
|
void UnknownWordPenalty::Lookup(const Manager &mgr, |
|
InputPathsBase &inputPaths) const |
|
{ |
|
BOOST_FOREACH(InputPathBase *pathBase, inputPaths) { |
|
InputPath *path = static_cast<InputPath*>(pathBase); |
|
|
|
if (SatisfyBackoff(mgr, *path)) { |
|
const SubPhrase<Moses2::Word> &phrase = path->subPhrase; |
|
|
|
TargetPhrases *tps = Lookup(mgr, mgr.GetPool(), *path); |
|
path->AddTargetPhrases(*this, tps); |
|
} |
|
} |
|
|
|
} |
|
|
|
TargetPhrases *UnknownWordPenalty::Lookup(const Manager &mgr, MemPool &pool, |
|
InputPath &inputPath) const |
|
{ |
|
const System &system = mgr.system; |
|
TargetPhrases *tps = NULL; |
|
|
|
|
|
size_t numPt = mgr.system.mappings.size(); |
|
const TargetPhrases **allTPS = |
|
static_cast<InputPath&>(inputPath).targetPhrases; |
|
for (size_t i = 0; i < numPt; ++i) { |
|
const TargetPhrases *otherTps = allTPS[i]; |
|
|
|
if (otherTps && otherTps->GetSize()) { |
|
return tps; |
|
} |
|
} |
|
|
|
const SubPhrase<Moses2::Word> &source = inputPath.subPhrase; |
|
const Moses2::Word &sourceWord = source[0]; |
|
const Factor *factor = sourceWord[0]; |
|
|
|
tps = new (pool.Allocate<TargetPhrases>()) TargetPhrases(pool, 1); |
|
|
|
size_t numWords = m_drop ? 0 : 1; |
|
|
|
TargetPhraseImpl *target = |
|
new (pool.Allocate<TargetPhraseImpl>()) TargetPhraseImpl(pool, *this, |
|
system, numWords); |
|
|
|
if (!m_drop) { |
|
Moses2::Word &word = (*target)[0]; |
|
|
|
if (m_prefix.empty() && m_suffix.empty()) { |
|
word[0] = factor; |
|
} else { |
|
stringstream strm; |
|
if (!m_prefix.empty()) { |
|
strm << m_prefix; |
|
} |
|
strm << factor->GetString(); |
|
if (!m_suffix.empty()) { |
|
strm << m_suffix; |
|
} |
|
|
|
FactorCollection &fc = system.GetVocab(); |
|
const Factor *targetFactor = fc.AddFactor(strm.str(), system, false); |
|
word[0] = targetFactor; |
|
} |
|
} |
|
|
|
Scores &scores = target->GetScores(); |
|
scores.PlusEquals(mgr.system, *this, -100); |
|
|
|
MemPool &memPool = mgr.GetPool(); |
|
system.featureFunctions.EvaluateInIsolation(memPool, system, source, *target); |
|
|
|
tps->AddTargetPhrase(*target); |
|
system.featureFunctions.EvaluateAfterTablePruning(memPool, *tps, source); |
|
|
|
return tps; |
|
} |
|
|
|
void UnknownWordPenalty::EvaluateInIsolation(const System &system, |
|
const Phrase<Moses2::Word> &source, const TargetPhraseImpl &targetPhrase, Scores &scores, |
|
SCORE &estimatedScore) const |
|
{ |
|
|
|
} |
|
|
|
|
|
void UnknownWordPenalty::InitActiveChart( |
|
MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
SCFG::InputPath &path) const |
|
{ |
|
} |
|
|
|
void UnknownWordPenalty::Lookup(MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
size_t maxChartSpan, |
|
const SCFG::Stacks &stacks, |
|
SCFG::InputPath &path) const |
|
{ |
|
const System &system = mgr.system; |
|
|
|
size_t numWords = path.range.GetNumWordsCovered(); |
|
if (numWords > 1) { |
|
|
|
return; |
|
} |
|
|
|
if (path.GetNumRules()) { |
|
|
|
return; |
|
} |
|
|
|
|
|
if (path.range.GetStartPos() == 0) { |
|
return; |
|
} |
|
|
|
|
|
const SCFG::Sentence &sentence = static_cast<const SCFG::Sentence&>(mgr.GetInput()); |
|
if (path.range.GetStartPos() + 1 == sentence.GetSize()) { |
|
return; |
|
} |
|
|
|
|
|
const SCFG::Word &lastWord = path.subPhrase.Back(); |
|
|
|
|
|
const Factor *factor = lastWord[0]; |
|
SCFG::TargetPhraseImpl *tp = new (pool.Allocate<SCFG::TargetPhraseImpl>()) SCFG::TargetPhraseImpl(pool, *this, system, 1); |
|
SCFG::Word &word = (*tp)[0]; |
|
word.CreateFromString(system.GetVocab(), system, factor->GetString().as_string()); |
|
|
|
tp->lhs.CreateFromString(system.GetVocab(), system, "[X]"); |
|
|
|
size_t endPos = path.range.GetEndPos(); |
|
const SCFG::InputPath &subPhrasePath = *mgr.GetInputPaths().GetMatrix().GetValue(endPos, 1); |
|
|
|
SCFG::ActiveChartEntry *chartEntry = new (pool.Allocate<SCFG::ActiveChartEntry>()) SCFG::ActiveChartEntry(pool); |
|
chartEntry->AddSymbolBindElement(subPhrasePath.range, lastWord, NULL, *this); |
|
path.AddActiveChartEntry(GetPtInd(), chartEntry); |
|
|
|
Scores &scores = tp->GetScores(); |
|
scores.PlusEquals(mgr.system, *this, -100); |
|
|
|
MemPool &memPool = mgr.GetPool(); |
|
const SubPhrase<SCFG::Word> &source = path.subPhrase; |
|
system.featureFunctions.EvaluateInIsolation(memPool, system, source, *tp); |
|
|
|
SCFG::TargetPhrases *tps = new (pool.Allocate<SCFG::TargetPhrases>()) SCFG::TargetPhrases(pool); |
|
tps->AddTargetPhrase(*tp); |
|
|
|
path.AddTargetPhrasesToPath(pool, mgr.system, *this, *tps, chartEntry->GetSymbolBind()); |
|
} |
|
|
|
void UnknownWordPenalty::LookupUnary(MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
const SCFG::Stacks &stacks, |
|
SCFG::InputPath &path) const |
|
{ |
|
} |
|
|
|
void UnknownWordPenalty::LookupNT( |
|
MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
const Moses2::Range &subPhraseRange, |
|
const SCFG::InputPath &prevPath, |
|
const SCFG::Stacks &stacks, |
|
SCFG::InputPath &outPath) const |
|
{ |
|
UTIL_THROW2("Not implemented"); |
|
} |
|
|
|
void UnknownWordPenalty::LookupGivenWord( |
|
MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
const SCFG::InputPath &prevPath, |
|
const SCFG::Word &wordSought, |
|
const Moses2::Hypotheses *hypos, |
|
const Moses2::Range &subPhraseRange, |
|
SCFG::InputPath &outPath) const |
|
{ |
|
UTIL_THROW2("Not implemented"); |
|
} |
|
|
|
void UnknownWordPenalty::LookupGivenNode( |
|
MemPool &pool, |
|
const SCFG::Manager &mgr, |
|
const SCFG::ActiveChartEntry &prevEntry, |
|
const SCFG::Word &wordSought, |
|
const Moses2::Hypotheses *hypos, |
|
const Moses2::Range &subPhraseRange, |
|
SCFG::InputPath &outPath) const |
|
{ |
|
UTIL_THROW2("Not implemented"); |
|
} |
|
|
|
} |
|
|
|
|