⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decodestepgeneration.cpp.svn-base

📁 moses开源的机器翻译系统
💻 SVN-BASE
字号:
// $Id$/***********************************************************************Moses - factored phrase-based language decoderCopyright (C) 2006 University of EdinburghThis library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA***********************************************************************/#include "DecodeStepGeneration.h"#include "GenerationDictionary.h"#include "TranslationOption.h"#include "TranslationOptionCollection.h"#include "PartialTranslOptColl.h"#include "FactorCollection.h"DecodeStepGeneration::DecodeStepGeneration(GenerationDictionary* dict, const DecodeStep* prev): DecodeStep(dict, prev){}const GenerationDictionary &DecodeStepGeneration::GetGenerationDictionary() const{  return *static_cast<const GenerationDictionary*>(m_ptr);}TranslationOption *DecodeStepGeneration::MergeGeneration(const TranslationOption& oldTO, Phrase &mergePhrase                                  , const ScoreComponentCollection& generationScore) const{	if (IsFilteringStep()) {  	if (!oldTO.IsCompatible(mergePhrase, m_conflictFactors)) 			return NULL;	}  TranslationOption *newTransOpt = new TranslationOption(oldTO);  newTransOpt->MergeNewFeatures(mergePhrase, generationScore, m_newOutputFactors);  return newTransOpt;}// helperstypedef pair<Word, ScoreComponentCollection> WordPair;typedef list< WordPair > WordList;// 1st = word// 2nd = scoretypedef list< WordPair >::const_iterator WordListIterator;/** used in generation: increases iterators when looping through the exponential number of generation expansions */inline void IncrementIterators(vector< WordListIterator > &wordListIterVector                               , const vector< WordList > &wordListVector){  for (size_t currPos = 0 ; currPos < wordListVector.size() ; currPos++)    {      WordListIterator &iter = wordListIterVector[currPos];      iter++;      if (iter != wordListVector[currPos].end())        { // eg. 4 -> 5          return;        }      else        { //  eg 9 -> 10          iter = wordListVector[currPos].begin();        }    }}void DecodeStepGeneration::Process(const TranslationOption &inputPartialTranslOpt                              , const DecodeStep &decodeStep                              , PartialTranslOptColl &outputPartialTranslOptColl                              , TranslationOptionCollection *toc                              , bool adhereTableLimit) const{  if (inputPartialTranslOpt.GetTargetPhrase().GetSize() == 0)    { // word deletion      TranslationOption *newTransOpt = new TranslationOption(inputPartialTranslOpt);      outputPartialTranslOptColl.Add(newTransOpt);      return;    }  // normal generation step  const GenerationDictionary &generationDictionary  = decodeStep.GetGenerationDictionary();//  const WordsRange &sourceWordsRange                = inputPartialTranslOpt.GetSourceWordsRange();  const Phrase &targetPhrase  = inputPartialTranslOpt.GetTargetPhrase();  size_t targetLength         = targetPhrase.GetSize();  // generation list for each word in phrase  vector< WordList > wordListVector(targetLength);  // create generation list  int wordListVectorPos = 0;  for (size_t currPos = 0 ; currPos < targetLength ; currPos++) // going thorugh all words    {      // generatable factors for this word to be put in wordList      WordList &wordList = wordListVector[wordListVectorPos];      const Word &word = targetPhrase.GetWord(currPos);      // consult dictionary for possible generations for this word      const OutputWordCollection *wordColl = generationDictionary.FindWord(word);      if (wordColl == NULL)        { // word not found in generation dictionary          //toc->ProcessUnknownWord(sourceWordsRange.GetStartPos(), factorCollection);          return; // can't be part of a phrase, special handling        }      else        {          // sort(*wordColl, CompareWordCollScore);          OutputWordCollection::const_iterator iterWordColl;          for (iterWordColl = wordColl->begin() ; iterWordColl != wordColl->end(); ++iterWordColl)            {              const Word &outputWord = (*iterWordColl).first;              const ScoreComponentCollection& score = (*iterWordColl).second;              // enter into word list generated factor(s) and its(their) score(s)              wordList.push_back(WordPair(outputWord, score));            }          wordListVectorPos++; // done, next word        }    }  // use generation list (wordList)  // set up iterators (total number of expansions)  size_t numIteration = 1;  vector< WordListIterator >  wordListIterVector(targetLength);  vector< const Word* >       mergeWords(targetLength);  for (size_t currPos = 0 ; currPos < targetLength ; currPos++)    {      wordListIterVector[currPos] = wordListVector[currPos].begin();      numIteration *= wordListVector[currPos].size();    }  // go thru each possible factor for each word & create hypothesis  for (size_t currIter = 0 ; currIter < numIteration ; currIter++)    {      ScoreComponentCollection generationScore; // total score for this string of words      // create vector of words with new factors for last phrase      for (size_t currPos = 0 ; currPos < targetLength ; currPos++)        {          const WordPair &wordPair = *wordListIterVector[currPos];          mergeWords[currPos] = &(wordPair.first);          generationScore.PlusEquals(wordPair.second);        }      // merge with existing trans opt      Phrase genPhrase(Output, mergeWords);      TranslationOption *newTransOpt = MergeGeneration(inputPartialTranslOpt, genPhrase, generationScore);      if (newTransOpt != NULL)        {          outputPartialTranslOptColl.Add(newTransOpt);        }      // increment iterators      IncrementIterators(wordListIterVector, wordListVector);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -