00001 #pragma once
00002
00003 #include <string>
00004 #include <set>
00005 #include <boost/lexical_cast.hpp>
00006
00007 #include "VWFeatureTarget.h"
00008
00009 namespace Moses
00010 {
00011
00012 class VWFeatureTargetPhraseScores : public VWFeatureTarget
00013 {
00014 public:
00015 VWFeatureTargetPhraseScores(const std::string &line)
00016 : VWFeatureTarget(line) {
00017 ReadParameters();
00018
00019 VWFeatureBase::UpdateRegister();
00020 }
00021
00022 void operator()(const InputType &input
00023 , const TargetPhrase &targetPhrase
00024 , Discriminative::Classifier &classifier
00025 , Discriminative::FeatureVector &outFeatures) const {
00026 std::vector<FeatureFunction*> features = FeatureFunction::GetFeatureFunctions();
00027 for (size_t i = 0; i < features.size(); i++) {
00028 std::string fname = features[i]->GetScoreProducerDescription();
00029 if(!m_fnames.empty() && m_fnames.count(fname) == 0)
00030 continue;
00031
00032 std::vector<float> scores = targetPhrase.GetScoreBreakdown().GetScoresForProducer(features[i]);
00033 for(size_t j = 0; j < scores.size(); ++j)
00034 outFeatures.push_back(classifier.AddLabelDependentFeature(fname + "^" + boost::lexical_cast<std::string>(j), scores[j]));
00035 }
00036 }
00037
00038 virtual void SetParameter(const std::string& key, const std::string& value) {
00039 if(key == "use") {
00040 std::vector<std::string> names;
00041 Tokenize(names, value, ",");
00042 m_fnames.insert(names.begin(), names.end());
00043 } else
00044 VWFeatureTarget::SetParameter(key, value);
00045 }
00046
00047 private:
00048 std::set<std::string> m_fnames;
00049
00050 };
00051
00052 }