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

📄 targetphrase.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 <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 + -