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