// assumes that source-side syntax labels are stored in the target non-terminal field of the rules void SourceGHKMTreeInputMatchFeature::EvaluateWithSourceContext(const InputType &input , const InputPath &inputPath , const TargetPhrase &targetPhrase , const StackVec *stackVec , ScoreComponentCollection &scoreBreakdown , ScoreComponentCollection *estimatedScores) const { const Range& range = inputPath.GetWordsRange(); size_t startPos = range.GetStartPos(); size_t endPos = range.GetEndPos(); const TreeInput& treeInput = static_cast<const TreeInput&>(input); const NonTerminalSet& treeInputLabels = treeInput.GetLabelSet(startPos,endPos); const Word& lhsLabel = targetPhrase.GetTargetLHS(); const StaticData& staticData = StaticData::Instance(); const Word& outputDefaultNonTerminal = staticData.GetOutputDefaultNonTerminal(); std::vector<float> newScores(m_numScoreComponents,0.0); // m_numScoreComponents == 2 // first fires for matches, second for mismatches if ( (treeInputLabels.find(lhsLabel) != treeInputLabels.end()) && (lhsLabel != outputDefaultNonTerminal) ) { // match newScores[0] = 1.0; } else { // mismatch newScores[1] = 1.0; } scoreBreakdown.PlusEquals(this, newScores); }
void RulePairUnlexicalizedSource::EvaluateInIsolation(const Phrase &source , const TargetPhrase &targetPhrase , ScoreComponentCollection &scoreBreakdown , ScoreComponentCollection &estimatedFutureScore) const { const Factor* targetPhraseLHS = targetPhrase.GetTargetLHS()[0]; if ( !m_glueRules && (targetPhraseLHS == m_glueTargetLHS) ) { return; } if ( !m_nonGlueRules && (targetPhraseLHS != m_glueTargetLHS) ) { return; } for (size_t posS=0; posS<source.GetSize(); ++posS) { const Word &wordS = source.GetWord(posS); if ( !wordS.IsNonTerminal() ) { return; } } ostringstream namestr; for (size_t posT=0; posT<targetPhrase.GetSize(); ++posT) { const Word &wordT = targetPhrase.GetWord(posT); const Factor* factorT = wordT[0]; if ( wordT.IsNonTerminal() ) { namestr << "["; } namestr << factorT->GetString(); if ( wordT.IsNonTerminal() ) { namestr << "]"; } namestr << "|"; } namestr << targetPhraseLHS->GetString() << "|"; for (AlignmentInfo::const_iterator it=targetPhrase.GetAlignNonTerm().begin(); it!=targetPhrase.GetAlignNonTerm().end(); ++it) { namestr << "|" << it->first << "-" << it->second; } scoreBreakdown.PlusEquals(this, namestr.str(), 1); if ( targetPhraseLHS != m_glueTargetLHS ) { scoreBreakdown.PlusEquals(this, 1); } }
void MaxSpanFreeNonTermSource::EvaluateWithSourceContext(const InputType &input , const InputPath &inputPath , const TargetPhrase &targetPhrase , const StackVec *stackVec , ScoreComponentCollection &scoreBreakdown , ScoreComponentCollection *estimatedScores) const { const Word &targetLHS = targetPhrase.GetTargetLHS(); if (targetLHS == m_glueTargetLHS) { // don't delete glue rules return; } const Phrase *source = targetPhrase.GetRuleSource(); assert(source); float score = 0; if (source->Front().IsNonTerminal()) { const ChartCellLabel &cell = *stackVec->front(); if (cell.GetCoverage().GetNumWordsCovered() > m_maxSpan) { score = - std::numeric_limits<float>::infinity(); } } if (source->Back().IsNonTerminal()) { const ChartCellLabel &cell = *stackVec->back(); if (cell.GetCoverage().GetNumWordsCovered() > m_maxSpan) { score = - std::numeric_limits<float>::infinity(); } } scoreBreakdown.PlusEquals(this, score); }