Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'moses/src/LexicalDistortionCost.cpp')
-rw-r--r--moses/src/LexicalDistortionCost.cpp72
1 files changed, 70 insertions, 2 deletions
diff --git a/moses/src/LexicalDistortionCost.cpp b/moses/src/LexicalDistortionCost.cpp
index 8a36f0e24..cd7749702 100644
--- a/moses/src/LexicalDistortionCost.cpp
+++ b/moses/src/LexicalDistortionCost.cpp
@@ -8,6 +8,23 @@
#include "WordsRange.h"
#include "TranslationOption.h"
+
+LexicalDistortionCost *LexicalDistortionCost::CreateModel(const std::string &modelType,
+ const std::string &filePath,
+ Direction direction,
+ std::vector< FactorType >& f_factors,
+ std::vector< FactorType >& e_factors)
+{
+ if(modelType == "beta-binomial-phrase")
+ return new LDCBetaBinomial(filePath, direction, PhrasePair, f_factors, e_factors);
+ else if(modelType == "beta-geometric-phrase")
+ return new LDCBetaGeometric(filePath, direction, PhrasePair, f_factors, e_factors);
+ else {
+ UserMessage::Add("Lexical distortion model type not implemented: " + modelType);
+ return NULL;
+ }
+}
+
LexicalDistortionCost::LexicalDistortionCost(const std::string &filePath,
Direction direction,
Condition condition,
@@ -17,7 +34,6 @@ LexicalDistortionCost::LexicalDistortionCost(const std::string &filePath,
m_modelFileName(filePath),
m_direction(direction), m_condition(condition),
m_srcfactors(f_factors), m_tgtfactors(e_factors),
- m_defaultDistortion(4,12),
m_numParametersPerDirection(numParametersPerDirection)
{
m_distortionTable = LexicalReorderingTable::LoadAvailable(filePath, f_factors, e_factors, std::vector<FactorType>(), false);
@@ -31,7 +47,7 @@ LexicalDistortionCost::~LexicalDistortionCost()
const std::vector<float> LexicalDistortionCost::GetDistortionParameters(const Phrase &src, const Phrase &tgt) const
{
std::vector<float> params = m_distortionTable->GetScore(src, tgt, Phrase(Output));
- if(params.size() == 0) return m_defaultDistortion;
+ if(params.size() == 0) return GetDefaultDistortion();
assert(params.size() == GetNumParameterSets() * GetNumParametersPerDirection());
@@ -124,3 +140,55 @@ float LDCBetaBinomial::beta_binomial(float p, float q, int x) const
return FloorScore((float) score);
}
+
+std::vector<float> LDCBetaBinomial::GetDefaultDistortion() const
+{
+ return std::vector<float>(4, 12);
+}
+
+float LDCBetaGeometric::CalculateDistortionScore(const WordsRange &prev, const WordsRange &curr,
+ const std::vector<float> *params) const
+{
+ float p_dir = params->at(0);
+ float q_dir = params->at(1);
+ float p_pos = params->at(2);
+ float q_pos = params->at(3);
+ float p_neg = params->at(4);
+ float q_neg = params->at(5);
+
+ int distance = StaticData::Instance().GetInput()->ComputeDistortionDistance(prev, curr);
+
+ float score = .0f;
+
+ if(distance >= 0) {
+ score += log(p_dir / (p_dir + q_dir));
+
+ int x = distance;
+ score += beta_geometric(p_pos, q_pos, x);
+ } else {
+ score += log(1.0f - p_dir / (p_dir + q_dir));
+
+ int x = -distance - 1;
+ score += beta_geometric(p_neg, q_neg, x);
+ }
+
+ assert(finite(score));
+ return FloorScore(score);
+}
+
+float LDCBetaGeometric::beta_geometric(float p, float q, int x) const
+{
+ assert(x >= 0);
+
+ float result = log(p);
+ for(int i = 0; i <= x - 1; i++)
+ result += log(q + i);
+ for(int i = 0; i <= x; i++)
+ result -= log(p + q + i);
+ return result;
+}
+
+std::vector<float> LDCBetaGeometric::GetDefaultDistortion() const
+{
+ return std::vector<float>(12, 2);
+}