00001 #include "MergeScorer.h"
00002
00003 #include <cmath>
00004 #include <stdexcept>
00005 #include "ScoreStats.h"
00006 #include "TerScorer.h"
00007 #include "BleuScorer.h"
00008 #include "PerScorer.h"
00009 #include "CderScorer.h"
00010
00011 #include "TER/tercalc.h"
00012 #include "TER/terAlignment.h"
00013
00014 using namespace std;
00015 using namespace TERCpp;
00016
00017 namespace MosesTuning
00018 {
00019
00020
00021 MergeScorer::MergeScorer(const string& config)
00022 : StatisticsBasedScorer("MERGE", config) {}
00023
00024 MergeScorer::~MergeScorer() {}
00025
00026 void MergeScorer::setReferenceFiles(const vector<string>& referenceFiles)
00027 {
00028 throw runtime_error("MERGE Scorer can be used only in mert execution");
00029 exit(0);
00030 }
00031
00032 void MergeScorer::prepareStats(size_t sid, const string& text, ScoreStats& entry)
00033 {
00034 throw runtime_error("MergeScorer::prepareStats : MERGE Scorer can be used only in mert execution");
00035 exit(0);
00036 }
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 float MergeScorer::calculateScore(const std::vector< int >& comps) const
00047 {
00048 float result = 0.0;
00049 vector<int> vecLine;
00050 vector<string> vecScorerType;
00051 vector<float> weightsModifier;
00052 int pos = 0;
00053 int weightIncrement = 0;
00054 string initfile = "merge.init";
00055 string line;
00056 ifstream opt(initfile.c_str());
00057 float denom = 0.0;
00058
00059 if (opt.fail()) {
00060 cerr<<"MergeScorer::calculateScore : could not open initfile: " << initfile << endl;
00061 exit(3);
00062 }
00063 while (getline (opt, line)) {
00064 vector<string> vecLine=stringToVector(line, " ");
00065 if (vecLine.size() != 4) {
00066 cerr<<"MergeScorer::calculateScore : Error in initfile: " << initfile << endl;
00067 exit(4);
00068 }
00069 vecScorerType.push_back(vecLine.at(0));
00070 weightsModifier.push_back(atof(vecLine.at(1).c_str()));
00071 denom += abs(atof(vecLine.at(1).c_str()));
00072 }
00073 const int weights_modifier_size = static_cast<int>(weightsModifier.size());
00074 for (weightIncrement = 0; weightIncrement < weights_modifier_size; weightIncrement++)
00075 {
00076 if (vecScorerType.at(weightIncrement).compare("BLEU") == 0)
00077 {
00078 BleuScorer* scorer01 = new BleuScorer("");
00079 const float weight = weightsModifier.at(weightIncrement) / denom;
00080 vecLine.clear();
00081 const int num_scores = static_cast<int>(scorer01->NumberOfScores());
00082 vecLine = subVector(comps, pos, pos + num_scores);
00083 pos += num_scores;
00084 result += weight * scorer01->calculateScore(vecLine);;
00085 delete scorer01;
00086 }
00087 else if (vecScorerType.at(weightIncrement).compare("TER") == 0)
00088 {
00089 TerScorer* scorer02 = new TerScorer("");
00090 const float weight = weightsModifier.at(weightIncrement) / denom;
00091 vecLine.clear();
00092 const int num_scores = static_cast<int>(scorer02->NumberOfScores());
00093 vecLine = subVector(comps, pos, pos + num_scores);
00094 pos += num_scores;
00095 result += weight * scorer02->calculateScore(vecLine);
00096 delete scorer02;
00097 }
00098 else if (vecScorerType.at(weightIncrement).compare("PER") == 0)
00099 {
00100 PerScorer* scorer03 = new PerScorer("");
00101 const float weight = weightsModifier.at(weightIncrement) / denom;
00102 vecLine.clear();
00103 const int num_scores = static_cast<int>(scorer03->NumberOfScores());
00104 vecLine = subVector(comps, pos, pos + num_scores);
00105 pos += num_scores;
00106 result += weight * scorer03->calculateScore(vecLine);
00107 delete scorer03;
00108 }
00109 else if (vecScorerType.at(weightIncrement).compare("CER") == 0)
00110 {
00111 CderScorer* scorer04 = new CderScorer("");
00112 const float weight = weightsModifier.at(weightIncrement) / denom;
00113 vecLine.clear();
00114 const int num_scores = static_cast<int>(scorer04->NumberOfScores());
00115 vecLine = subVector(comps, pos, pos + num_scores);
00116 pos += num_scores;
00117 result += weight * scorer04->calculateScore(vecLine);
00118 delete scorer04;
00119 }
00120 else
00121 {
00122 throw runtime_error("MergeScorer::calculateScore : Scorer unknown");
00123 exit(0);
00124 }
00125 }
00126 return result;
00127 }
00128
00129 }
00130