00001 #pragma once
00002
00003 #include <string>
00004 #include <cstdlib>
00005
00006 #include "ThreadLocalByFeatureStorage.h"
00007 #include "VWFeatureSource.h"
00008 #include "TabbedSentence.h"
00009
00010 namespace Moses
00011 {
00012
00013
00014 class VWFeatureSourceExternalFeatures : public VWFeatureSource
00015 {
00016 public:
00017 VWFeatureSourceExternalFeatures(const std::string &line)
00018 : VWFeatureSource(line), m_tls(this), m_column(0) {
00019 ReadParameters();
00020
00021
00022 VWFeatureBase::UpdateRegister();
00023 }
00024
00025 void operator()(const InputType &input
00026 , const Range &sourceRange
00027 , Discriminative::Classifier &classifier
00028 , Discriminative::FeatureVector &outFeatures) const {
00029 const Features& features = *m_tls.GetStored();
00030 for (size_t i = 0; i < features.size(); i++) {
00031 outFeatures.push_back(classifier.AddLabelIndependentFeature("srcext^" + features[i]));
00032 }
00033 }
00034
00035 virtual void SetParameter(const std::string& key, const std::string& value) {
00036 if(key == "column")
00037 m_column = Scan<size_t>(value);
00038 else
00039 VWFeatureSource::SetParameter(key, value);
00040 }
00041
00042 virtual void InitializeForInput(ttasksptr const& ttask) {
00043 InputType const& source = *(ttask->GetSource().get());
00044 UTIL_THROW_IF2(source.GetType() != TabbedSentenceInput,
00045 "This feature function requires the TabbedSentence input type");
00046
00047 const TabbedSentence& tabbedSentence = static_cast<const TabbedSentence&>(source);
00048 const std::string &column = tabbedSentence.GetColumn(m_column);
00049
00050 Features& features = *m_tls.GetStored();
00051 features.clear();
00052
00053 Tokenize(features, column, " ");
00054 }
00055
00056 private:
00057 typedef std::vector<std::string> Features;
00058 typedef ThreadLocalByFeatureStorage<Features> TLSFeatures;
00059
00060 TLSFeatures m_tls;
00061 size_t m_column;
00062 };
00063
00064 }