/** constructor; just initialize the base class */ TranslationOptionCollectionText::TranslationOptionCollectionText(Sentence const &input, size_t maxNoTransOptPerCoverage, float translationOptionThreshold) : TranslationOptionCollection(input, maxNoTransOptPerCoverage, translationOptionThreshold) { size_t size = input.GetSize(); m_inputPathMatrix.resize(size); for (size_t phaseSize = 1; phaseSize <= size; ++phaseSize) { for (size_t startPos = 0; startPos < size - phaseSize + 1; ++startPos) { size_t endPos = startPos + phaseSize -1; vector<InputPath*> &vec = m_inputPathMatrix[startPos]; WordsRange range(startPos, endPos); Phrase subphrase(input.GetSubString(WordsRange(startPos, endPos))); const NonTerminalSet &labels = input.GetLabelSet(startPos, endPos); InputPath *node; if (range.GetNumWordsCovered() == 1) { node = new InputPath(subphrase, labels, range, NULL, NULL); vec.push_back(node); } else { const InputPath &prevNode = GetInputPath(startPos, endPos - 1); node = new InputPath(subphrase, labels, range, &prevNode, NULL); vec.push_back(node); } m_phraseDictionaryQueue.push_back(node); } } }
void ChartParser::CreateInputPaths(const InputType &input) { size_t size = input.GetSize(); m_inputPathMatrix.resize(size); UTIL_THROW_IF2(input.GetType() != SentenceInput && input.GetType() != TreeInputType, "Input must be a sentence or a tree, not lattice or confusion networks"); for (size_t phaseSize = 1; phaseSize <= size; ++phaseSize) { for (size_t startPos = 0; startPos < size - phaseSize + 1; ++startPos) { size_t endPos = startPos + phaseSize -1; vector<InputPath*> &vec = m_inputPathMatrix[startPos]; WordsRange range(startPos, endPos); Phrase subphrase(input.GetSubString(WordsRange(startPos, endPos))); const NonTerminalSet &labels = input.GetLabelSet(startPos, endPos); InputPath *node; if (range.GetNumWordsCovered() == 1) { node = new InputPath(subphrase, labels, range, NULL, NULL); vec.push_back(node); } else { const InputPath &prevNode = GetInputPath(startPos, endPos - 1); node = new InputPath(subphrase, labels, range, &prevNode, NULL); vec.push_back(node); } //m_inputPathQueue.push_back(node); } } }
void ChartParser::Create(const Range &range, ChartParserCallback &to) { assert(m_decodeGraphList.size() == m_ruleLookupManagers.size()); std::vector <DecodeGraph*>::const_iterator iterDecodeGraph; std::vector <ChartRuleLookupManager*>::const_iterator iterRuleLookupManagers = m_ruleLookupManagers.begin(); for (iterDecodeGraph = m_decodeGraphList.begin(); iterDecodeGraph != m_decodeGraphList.end(); ++iterDecodeGraph, ++iterRuleLookupManagers) { const DecodeGraph &decodeGraph = **iterDecodeGraph; assert(decodeGraph.GetSize() == 1); ChartRuleLookupManager &ruleLookupManager = **iterRuleLookupManagers; size_t maxSpan = decodeGraph.GetMaxChartSpan(); size_t last = m_source.GetSize()-1; if (maxSpan != 0) { last = min(last, range.GetStartPos()+maxSpan); } if (maxSpan == 0 || range.GetNumWordsCovered() <= maxSpan) { const InputPath &inputPath = GetInputPath(range); ruleLookupManager.GetChartRuleCollection(inputPath, last, to); } } if (range.GetNumWordsCovered() == 1 && range.GetStartPos() != 0 && range.GetStartPos() != m_source.GetSize()-1) { bool alwaysCreateDirectTranslationOption = StaticData::Instance().IsAlwaysCreateDirectTranslationOption(); if (to.Empty() || alwaysCreateDirectTranslationOption) { // create unknown words for 1 word coverage where we don't have any trans options const Word &sourceWord = m_source.GetWord(range.GetStartPos()); m_unknown.Process(sourceWord, range, to); } } }
/** create translation options that exactly cover a specific input span. * Called by CreateTranslationOptions() and ProcessUnknownWord() * \param decodeGraph list of decoding steps * \param factorCollection input sentence with all factors * \param startPos first position in input sentence * \param lastPos last position in input sentence * \param adhereTableLimit whether phrase & generation table limits are adhered to */ void TranslationOptionCollectionText::CreateTranslationOptionsForRange( const DecodeGraph &decodeGraph , size_t startPos , size_t endPos , bool adhereTableLimit , size_t graphInd) { InputPath &inputPath = GetInputPath(startPos, endPos); TranslationOptionCollection::CreateTranslationOptionsForRange(decodeGraph , startPos , endPos , adhereTableLimit , graphInd , inputPath); }
/** * Create xml-based translation options for the specific input span */ void TranslationOptionCollectionText::CreateXmlOptionsForRange(size_t startPos, size_t endPos) { Sentence const& source=dynamic_cast<Sentence const&>(m_source); InputPath &inputPath = GetInputPath(startPos,endPos); vector <TranslationOption*> xmlOptions; source.GetXmlTranslationOptions(xmlOptions,startPos,endPos); //get vector of TranslationOptions from Sentence for(size_t i=0; i<xmlOptions.size(); i++) { TranslationOption *transOpt = xmlOptions[i]; transOpt->SetInputPath(inputPath); Add(transOpt); } };
/* forcibly create translation option for a particular source word. * For text, this function is easy, just call the base class' ProcessOneUnknownWord() */ void TranslationOptionCollectionText::ProcessUnknownWord(size_t sourcePos) { const InputPath &inputPath = GetInputPath(sourcePos, sourcePos); ProcessOneUnknownWord(inputPath,sourcePos); }
void TranslationOption::Evaluate(const InputType &input) { const InputPath &inputPath = GetInputPath(); m_targetPhrase.Evaluate(input, inputPath); }
void TranslationOption::EvaluateWithSourceContext(const InputType &input) { const InputPath &inputPath = GetInputPath(); m_targetPhrase.EvaluateWithSourceContext(input, inputPath); }
const InputPath &ChartParser::GetInputPath(WordsRange &range) const { return GetInputPath(range.GetStartPos(), range.GetEndPos()); }