| |
| |
| |
| |
| |
| |
| #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"); |
| } |
|
|
| } |
|
|
|
|