|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdlib.h> |
|
#include "TargetPhraseImpl.h" |
|
#include "../Scores.h" |
|
#include "../System.h" |
|
#include "../MemPool.h" |
|
#include "../PhraseBased/Manager.h" |
|
#include "../AlignmentInfoCollection.h" |
|
#include "../TranslationModel/PhraseTable.h" |
|
|
|
using namespace std; |
|
|
|
namespace Moses2 |
|
{ |
|
namespace SCFG |
|
{ |
|
|
|
TargetPhraseImpl *TargetPhraseImpl::CreateFromString(MemPool &pool, |
|
const PhraseTable &pt, const System &system, const std::string &str) |
|
{ |
|
|
|
FactorCollection &vocab = system.GetVocab(); |
|
|
|
vector<string> toks = Tokenize(str); |
|
size_t size = toks.size() - 1; |
|
TargetPhraseImpl *ret = |
|
new (pool.Allocate<TargetPhraseImpl>()) TargetPhraseImpl(pool, pt, system, |
|
size); |
|
|
|
for (size_t i = 0; i < size; ++i) { |
|
SCFG::Word &word = (*ret)[i]; |
|
word.CreateFromString(vocab, system, toks[i]); |
|
} |
|
|
|
|
|
ret->lhs.CreateFromString(vocab, system, toks.back()); |
|
|
|
return ret; |
|
} |
|
|
|
TargetPhraseImpl::TargetPhraseImpl(MemPool &pool, |
|
const PhraseTable &pt, |
|
const System &system, |
|
size_t size) |
|
:Moses2::TargetPhrase<SCFG::Word>(pool, pt, system, size) |
|
,m_alignNonTerm(&AlignmentInfoCollection::Instance().GetEmptyAlignmentInfo()) |
|
|
|
{ |
|
m_scores = new (pool.Allocate<Scores>()) Scores(system, pool, |
|
system.featureFunctions.GetNumScores()); |
|
|
|
} |
|
|
|
TargetPhraseImpl::~TargetPhraseImpl() |
|
{ |
|
|
|
} |
|
|
|
std::string TargetPhraseImpl::Debug(const System &system) const |
|
{ |
|
stringstream out; |
|
out << lhs.Debug(system); |
|
out << " -> "; |
|
for (size_t i = 0; i < GetSize(); ++i) { |
|
const SCFG::Word &word = (*this)[i]; |
|
out << word.Debug(system) << " "; |
|
} |
|
out << "pt=" << pt.GetName(); |
|
out << " SCORES:" << GetScores().Debug(system); |
|
out << " ALIGN-T:"; |
|
out << GetAlignTerm().Debug(system); |
|
out << " ALIGN-NT:"; |
|
out << GetAlignNonTerm().Debug(system); |
|
|
|
return out.str(); |
|
} |
|
|
|
void TargetPhraseImpl::SetAlignmentInfo(const std::string &alignString) |
|
{ |
|
AlignmentInfo::CollType alignTerm, alignNonTerm; |
|
|
|
vector<string> toks = Tokenize(alignString); |
|
for (size_t i = 0; i < toks.size(); ++i) { |
|
vector<size_t> alignPair = Tokenize<size_t>(toks[i], "-"); |
|
UTIL_THROW_IF2(alignPair.size() != 2, "Wrong alignment format"); |
|
|
|
size_t sourcePos = alignPair[0]; |
|
size_t targetPos = alignPair[1]; |
|
|
|
if ((*this)[targetPos].isNonTerminal) { |
|
alignNonTerm.insert(std::pair<size_t,size_t>(sourcePos, targetPos)); |
|
} else { |
|
alignTerm.insert(std::pair<size_t,size_t>(sourcePos, targetPos)); |
|
} |
|
} |
|
|
|
SetAlignTerm(alignTerm); |
|
SetAlignNonTerm(alignNonTerm); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
size_t TargetPhraseImpl::GetNumNonTerms() const |
|
{ |
|
size_t ret = 0; |
|
for (size_t i = 0; i < GetSize(); ++i) { |
|
if ((*this)[i].isNonTerminal) { |
|
++ret; |
|
} |
|
} |
|
return ret; |
|
} |
|
|
|
|
|
} |
|
} |
|
|