📄 targetphrase.cpp.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 <cassert>#include <algorithm>#include "TargetPhrase.h"#include "PhraseDictionaryMemory.h"#include "GenerationDictionary.h"#include "LanguageModel.h"#include "StaticData.h"#include "ScoreIndexManager.h"#include "LMList.h"#include "ScoreComponentCollection.h"#include "Util.h"using namespace std;TargetPhrase::TargetPhrase(FactorDirection direction) //:Phrase(direction), m_ngramScore(0.0), m_fullScore(0.0), m_sourcePhrase(0) :Phrase(direction),m_transScore(0.0), m_ngramScore(0.0), m_fullScore(0.0), m_sourcePhrase(0){}void TargetPhrase::SetScore(){ // used when creating translations of unknown words: m_transScore = m_ngramScore = 0; //m_ngramScore = 0; m_fullScore = - StaticData::Instance().GetWeightWordPenalty(); }void TargetPhrase::SetScore(float score) { //we use an existing score producer to figure out information for score setting (number of scores and weights) //TODO: is this a good idea? ScoreProducer* prod = StaticData::Instance().GetPhraseDictionaries()[0]; //get the weight list unsigned int id = prod->GetScoreBookkeepingID(); const vector<float> &allWeights = StaticData::Instance().GetAllWeights(); size_t beginIndex = StaticData::Instance().GetScoreIndexManager().GetBeginIndex(id); size_t endIndex = StaticData::Instance().GetScoreIndexManager().GetEndIndex(id); vector<float> weights; std::copy(allWeights.begin() +beginIndex, allWeights.begin() + endIndex,std::back_inserter(weights)); //find out how many items are in the score vector for this producer size_t numScores = prod->GetNumScoreComponents(); //divide up the score among all of the score vectors vector <float> scoreVector(numScores,score/numScores); //Now we have what we need to call the full SetScore method SetScore(prod,scoreVector,weights,StaticData::Instance().GetWeightWordPenalty(),StaticData::Instance().GetAllLM());}void TargetPhrase::SetScore(const ScoreProducer* translationScoreProducer, const vector<float> &scoreVector, const vector<float> &weightT, float weightWP, const LMList &languageModels){ assert(weightT.size() == scoreVector.size()); // calc average score if non-best m_transScore = std::inner_product(scoreVector.begin(), scoreVector.end(), weightT.begin(), 0.0f); m_scoreBreakdown.PlusEquals(translationScoreProducer, scoreVector); // Replicated from TranslationOptions.cpp float totalFutureScore = 0; float totalNgramScore = 0; float totalFullScore = 0; LMList::const_iterator lmIter; for (lmIter = languageModels.begin(); lmIter != languageModels.end(); ++lmIter) { const LanguageModel &lm = **lmIter; if (lm.Useable(*this)) { // contains factors used by this LM const float weightLM = lm.GetWeight(); float fullScore, nGramScore; lm.CalcScore(*this, fullScore, nGramScore); m_scoreBreakdown.Assign(&lm, nGramScore); // total LM score so far totalNgramScore += nGramScore * weightLM; totalFullScore += fullScore * weightLM; } } m_ngramScore = totalNgramScore; m_fullScore = m_transScore + totalFutureScore + totalFullScore - (this->GetSize() * weightWP); // word penalty}void TargetPhrase::SetWeights(const ScoreProducer* translationScoreProducer, const vector<float> &weightT){ // calling this function in case of confusion net input is undefined assert(StaticData::Instance().GetInputType()==SentenceInput); /* one way to fix this, you have to make sure the weightT contains (in addition to the usual phrase translation scaling factors) the input weight factor as last element */ m_transScore = m_scoreBreakdown.PartialInnerProduct(translationScoreProducer, weightT);}void TargetPhrase::ResetScore(){ m_fullScore = m_ngramScore = 0; m_scoreBreakdown.ZeroAll();}TargetPhrase *TargetPhrase::MergeNext(const TargetPhrase &inputPhrase) const{ if (! IsCompatible(inputPhrase)) { return NULL; } // ok, merge TargetPhrase *clone = new TargetPhrase(*this); clone->m_sourcePhrase = m_sourcePhrase; int currWord = 0; const size_t len = GetSize(); for (size_t currPos = 0 ; currPos < len ; currPos++) { const Word &inputWord = inputPhrase.GetWord(currPos); Word &cloneWord = clone->GetWord(currPos); cloneWord.Merge(inputWord); currWord++; } return clone;}TO_STRING_BODY(TargetPhrase);std::ostream& operator<<(std::ostream& os, const TargetPhrase& tp){ os << static_cast<const Phrase&>(tp) << ", pC=" << tp.m_transScore << ", c=" << tp.m_fullScore; //os << static_cast<const Phrase&>(tp) << ", c=" << tp.m_fullScore; return os;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -