|
#include "GlueRuleSynthesizer.h" |
|
|
|
#include <sstream> |
|
|
|
#include "moses/FF/UnknownWordPenaltyProducer.h" |
|
#include "util/string_stream.hh" |
|
#include "moses/parameters/AllOptions.h" |
|
namespace Moses |
|
{ |
|
namespace Syntax |
|
{ |
|
namespace F2S |
|
{ |
|
|
|
GlueRuleSynthesizer:: |
|
GlueRuleSynthesizer(Moses::AllOptions const& opts, HyperTree &trie) |
|
: m_input_default_nonterminal(opts.syntax.input_default_non_terminal) |
|
, m_output_default_nonterminal(opts.syntax.output_default_non_terminal) |
|
, m_hyperTree(trie) |
|
{ |
|
Word *lhs = NULL; |
|
m_dummySourcePhrase.CreateFromString(Input, opts.input.factor_order, "hello", &lhs); |
|
delete lhs; |
|
} |
|
|
|
void GlueRuleSynthesizer::SynthesizeRule(const Forest::Hyperedge &e) |
|
{ |
|
HyperPath source; |
|
SynthesizeHyperPath(e, source); |
|
TargetPhrase *tp = SynthesizeTargetPhrase(e); |
|
TargetPhraseCollection::shared_ptr tpc |
|
= GetOrCreateTargetPhraseCollection(m_hyperTree, source); |
|
tpc->Add(tp); |
|
} |
|
|
|
void GlueRuleSynthesizer::SynthesizeHyperPath(const Forest::Hyperedge &e, |
|
HyperPath &path) |
|
{ |
|
path.nodeSeqs.clear(); |
|
path.nodeSeqs.resize(2); |
|
path.nodeSeqs[0].push_back(e.head->pvertex.symbol[0]->GetId()); |
|
for (std::vector<Forest::Vertex*>::const_iterator p = e.tail.begin(); |
|
p != e.tail.end(); ++p) { |
|
const Forest::Vertex &child = **p; |
|
path.nodeSeqs[1].push_back(child.pvertex.symbol[0]->GetId()); |
|
} |
|
} |
|
|
|
TargetPhrase* |
|
GlueRuleSynthesizer:: |
|
SynthesizeTargetPhrase(const Forest::Hyperedge &e) |
|
{ |
|
const UnknownWordPenaltyProducer &unknownWordPenaltyProducer = |
|
UnknownWordPenaltyProducer::Instance(); |
|
|
|
TargetPhrase *targetPhrase = new TargetPhrase(); |
|
|
|
util::StringStream alignmentSS; |
|
for (std::size_t i = 0; i < e.tail.size(); ++i) { |
|
const Word &symbol = e.tail[i]->pvertex.symbol; |
|
if (symbol.IsNonTerminal()) { |
|
targetPhrase->AddWord(m_output_default_nonterminal); |
|
} else { |
|
|
|
Word &targetWord = targetPhrase->AddWord(); |
|
targetWord.CreateUnknownWord(symbol); |
|
} |
|
alignmentSS << i << "-" << i << " "; |
|
} |
|
|
|
|
|
|
|
float score = LOWEST_SCORE; |
|
targetPhrase->GetScoreBreakdown().Assign(&unknownWordPenaltyProducer, score); |
|
targetPhrase->EvaluateInIsolation(m_dummySourcePhrase); |
|
Word *targetLhs = new Word(m_output_default_nonterminal); |
|
targetPhrase->SetTargetLHS(targetLhs); |
|
targetPhrase->SetAlignmentInfo(alignmentSS.str()); |
|
|
|
return targetPhrase; |
|
} |
|
|
|
} |
|
} |
|
} |
|
|