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 }