void OutputNBest(std::ostream& out, const Moses::TrellisPathList &nBestList, const std::vector<Moses::FactorType>& outputFactorOrder, const TranslationSystem* system, long translationId) { const StaticData &staticData = StaticData::Instance(); bool labeledOutput = staticData.IsLabeledNBestList(); bool reportAllFactors = staticData.GetReportAllFactorsNBest(); bool includeAlignment = staticData.NBestIncludesAlignment(); bool includeWordAlignment = staticData.PrintAlignmentInfoInNbest(); TrellisPathList::const_iterator iter; for (iter = nBestList.begin() ; iter != nBestList.end() ; ++iter) { const TrellisPath &path = **iter; const std::vector<const Hypothesis *> &edges = path.GetEdges(); // print the surface factor of the translation out << translationId << " ||| "; for (int currEdge = (int)edges.size() - 1 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; OutputSurface(out, edge.GetCurrTargetPhrase(), outputFactorOrder, reportAllFactors); } out << " |||"; std::string lastName = ""; const vector<const StatefulFeatureFunction*>& sff = system->GetStatefulFeatureFunctions(); for( size_t i=0; i<sff.size(); i++ ) { if( labeledOutput && lastName != sff[i]->GetScoreProducerWeightShortName() ) { lastName = sff[i]->GetScoreProducerWeightShortName(); out << " " << lastName << ":"; } vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( sff[i] ); for (size_t j = 0; j<scores.size(); ++j) { out << " " << scores[j]; } } const vector<const StatelessFeatureFunction*>& slf = system->GetStatelessFeatureFunctions(); for( size_t i=0; i<slf.size(); i++ ) { if( labeledOutput && lastName != slf[i]->GetScoreProducerWeightShortName() ) { lastName = slf[i]->GetScoreProducerWeightShortName(); out << " " << lastName << ":"; } vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( slf[i] ); for (size_t j = 0; j<scores.size(); ++j) { out << " " << scores[j]; } } // translation components const vector<PhraseDictionaryFeature*>& pds = system->GetPhraseDictionaries(); if (pds.size() > 0) { for( size_t i=0; i<pds.size(); i++ ) { size_t pd_numinputscore = pds[i]->GetNumInputScores(); vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( pds[i] ); for (size_t j = 0; j<scores.size(); ++j){ if (labeledOutput && (i == 0) ){ if ((j == 0) || (j == pd_numinputscore)){ lastName = pds[i]->GetScoreProducerWeightShortName(j); out << " " << lastName << ":"; } } out << " " << scores[j]; } } } // generation const vector<GenerationDictionary*>& gds = system->GetGenerationDictionaries(); if (gds.size() > 0) { for( size_t i=0; i<gds.size(); i++ ) { size_t pd_numinputscore = gds[i]->GetNumInputScores(); vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( gds[i] ); for (size_t j = 0; j<scores.size(); ++j){ if (labeledOutput && (i == 0) ){ if ((j == 0) || (j == pd_numinputscore)){ lastName = gds[i]->GetScoreProducerWeightShortName(j); out << " " << lastName << ":"; } } out << " " << scores[j]; } } } // total out << " ||| " << path.GetTotalScore(); //phrase-to-phrase alignment if (includeAlignment) { out << " |||"; for (int currEdge = (int)edges.size() - 2 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; const WordsRange &sourceRange = edge.GetCurrSourceWordsRange(); WordsRange targetRange = path.GetTargetWordsRange(edge); out << " " << sourceRange.GetStartPos(); if (sourceRange.GetStartPos() < sourceRange.GetEndPos()) { out << "-" << sourceRange.GetEndPos(); } out<< "=" << targetRange.GetStartPos(); if (targetRange.GetStartPos() < targetRange.GetEndPos()) { out<< "-" << targetRange.GetEndPos(); } } } if (includeWordAlignment) { out << " ||| "; for (int currEdge = (int)edges.size() - 2 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; const WordsRange &sourceRange = edge.GetCurrSourceWordsRange(); WordsRange targetRange = path.GetTargetWordsRange(edge); const int sourceOffset = sourceRange.GetStartPos(); const int targetOffset = targetRange.GetStartPos(); const AlignmentInfo &ai = edge.GetCurrTargetPhrase().GetAlignmentInfo(); OutputAlignment(out, ai, sourceOffset, targetOffset); } } if (StaticData::Instance().IsPathRecoveryEnabled()) { out << "|||"; OutputInput(out, edges[0]); } out << endl; } out <<std::flush; }
void OutputNBest(std::ostream& out , const Moses::TrellisPathList &nBestList , const std::vector<Moses::FactorType>& outputFactorOrder , long translationId , char reportSegmentation) { const StaticData &staticData = StaticData::Instance(); bool reportAllFactors = staticData.GetReportAllFactorsNBest(); bool includeSegmentation = staticData.NBestIncludesSegmentation(); bool includeWordAlignment = staticData.PrintAlignmentInfoInNbest(); TrellisPathList::const_iterator iter; for (iter = nBestList.begin() ; iter != nBestList.end() ; ++iter) { const TrellisPath &path = **iter; const std::vector<const Hypothesis *> &edges = path.GetEdges(); // print the surface factor of the translation out << translationId << " ||| "; for (int currEdge = (int)edges.size() - 1 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; OutputSurface(out, edge, outputFactorOrder, reportSegmentation, reportAllFactors); } out << " |||"; // print scores with feature names OutputAllFeatureScores(path.GetScoreBreakdown(), out ); // total out << " ||| " << path.GetTotalScore(); //phrase-to-phrase segmentation if (includeSegmentation) { out << " |||"; for (int currEdge = (int)edges.size() - 2 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; const WordsRange &sourceRange = edge.GetCurrSourceWordsRange(); WordsRange targetRange = path.GetTargetWordsRange(edge); out << " " << sourceRange.GetStartPos(); if (sourceRange.GetStartPos() < sourceRange.GetEndPos()) { out << "-" << sourceRange.GetEndPos(); } out<< "=" << targetRange.GetStartPos(); if (targetRange.GetStartPos() < targetRange.GetEndPos()) { out<< "-" << targetRange.GetEndPos(); } } } if (includeWordAlignment) { out << " ||| "; for (int currEdge = (int)edges.size() - 2 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; const WordsRange &sourceRange = edge.GetCurrSourceWordsRange(); WordsRange targetRange = path.GetTargetWordsRange(edge); const int sourceOffset = sourceRange.GetStartPos(); const int targetOffset = targetRange.GetStartPos(); const AlignmentInfo &ai = edge.GetCurrTargetPhrase().GetAlignTerm(); OutputAlignment(out, ai, sourceOffset, targetOffset); } } if (StaticData::Instance().IsPathRecoveryEnabled()) { out << " ||| "; OutputInput(out, edges[0]); } out << endl; } out << std::flush; }
void OutputNBest(std::ostream& out, const Moses::TrellisPathList &nBestList, const std::vector<Moses::FactorType>& outputFactorOrder,long translationId) { const StaticData &staticData = StaticData::Instance(); bool labeledOutput = staticData.IsLabeledNBestList(); bool reportAllFactors = staticData.GetReportAllFactorsNBest(); bool includeAlignment = staticData.NBestIncludesAlignment(); //bool includeWordAlignment = staticData.PrintAlignmentInfoInNbest(); TrellisPathList::const_iterator iter; for (iter = nBestList.begin() ; iter != nBestList.end() ; ++iter) { const TrellisPath &path = **iter; const std::vector<const Hypothesis *> &edges = path.GetEdges(); // print the surface factor of the translation out << translationId << " ||| "; for (int currEdge = (int)edges.size() - 1 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; OutputSurface(out, edge.GetCurrTargetPhrase(), outputFactorOrder, reportAllFactors); } out << " |||"; std::string lastName = ""; const vector<const StatefulFeatureFunction*>& sff = staticData.GetScoreIndexManager().GetStatefulFeatureFunctions(); for( size_t i=0; i<sff.size(); i++ ) { if( labeledOutput && lastName != sff[i]->GetScoreProducerWeightShortName() ) { lastName = sff[i]->GetScoreProducerWeightShortName(); out << " " << lastName << ":"; } vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( sff[i] ); for (size_t j = 0; j<scores.size(); ++j) { out << " " << scores[j]; } } const vector<const StatelessFeatureFunction*>& slf = staticData.GetScoreIndexManager().GetStatelessFeatureFunctions(); for( size_t i=0; i<slf.size(); i++ ) { if( labeledOutput && lastName != slf[i]->GetScoreProducerWeightShortName() ) { lastName = slf[i]->GetScoreProducerWeightShortName(); out << " " << lastName << ":"; } vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer( slf[i] ); for (size_t j = 0; j<scores.size(); ++j) { out << " " << scores[j]; } } // translation components if (StaticData::Instance().GetInputType()==SentenceInput){ // translation components for text input vector<PhraseDictionaryFeature*> pds = StaticData::Instance().GetPhraseDictionaries(); if (pds.size() > 0) { if (labeledOutput) out << " tm:"; vector<PhraseDictionaryFeature*>::iterator iter; for (iter = pds.begin(); iter != pds.end(); ++iter) { vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer(*iter); for (size_t j = 0; j<scores.size(); ++j) out << " " << scores[j]; } } } else{ // translation components for Confusion Network input // first translation component has GetNumInputScores() scores from the input Confusion Network // at the beginning of the vector vector<PhraseDictionaryFeature*> pds = StaticData::Instance().GetPhraseDictionaries(); if (pds.size() > 0) { vector<PhraseDictionaryFeature*>::iterator iter; iter = pds.begin(); vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer(*iter); size_t pd_numinputscore = (*iter)->GetNumInputScores(); if (pd_numinputscore){ if (labeledOutput) out << " I:"; for (size_t j = 0; j < pd_numinputscore; ++j) out << " " << scores[j]; } for (iter = pds.begin() ; iter != pds.end(); ++iter) { vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer(*iter); size_t pd_numinputscore = (*iter)->GetNumInputScores(); if (iter == pds.begin() && labeledOutput) out << " tm:"; for (size_t j = pd_numinputscore; j < scores.size() ; ++j) out << " " << scores[j]; } } } // generation vector<GenerationDictionary*> gds = StaticData::Instance().GetGenerationDictionaries(); if (gds.size() > 0) { if (labeledOutput) out << " g: "; vector<GenerationDictionary*>::iterator iter; for (iter = gds.begin(); iter != gds.end(); ++iter) { vector<float> scores = path.GetScoreBreakdown().GetScoresForProducer(*iter); for (size_t j = 0; j<scores.size(); j++) { out << scores[j] << " "; } } } // total out << " ||| " << path.GetTotalScore(); //phrase-to-phrase alignment if (includeAlignment) { out << " |||"; for (int currEdge = (int)edges.size() - 2 ; currEdge >= 0 ; currEdge--) { const Hypothesis &edge = *edges[currEdge]; const WordsRange &sourceRange = edge.GetCurrSourceWordsRange(); WordsRange targetRange = path.GetTargetWordsRange(edge); out << " " << sourceRange.GetStartPos(); if (sourceRange.GetStartPos() < sourceRange.GetEndPos()) { out << "-" << sourceRange.GetEndPos(); } out<< "=" << targetRange.GetStartPos(); if (targetRange.GetStartPos() < targetRange.GetEndPos()) { out<< "-" << targetRange.GetEndPos(); } } } if (StaticData::Instance().IsPathRecoveryEnabled()) { out << "|||"; OutputInput(out, edges[0]); } out << endl; } out <<std::flush; }