00001 #include "InternalStructFeature.h"
00002 #include <map>
00003
00004 using namespace std;
00005
00006 namespace MosesTraining
00007 {
00008
00009 void InternalStructFeature::add(const ScoreFeatureContext& context,
00010 std::vector<float>& denseValues,
00011 std::map<std::string,float>& sparseValues) const
00012 {
00013 const std::map<std::string,float> *allTrees = context.phrasePair.GetProperty("Tree");
00014 for ( std::map<std::string,float>::const_iterator iter=allTrees->begin();
00015 iter!=allTrees->end(); ++iter ) {
00016 add(&(iter->first), iter->second, denseValues, sparseValues);
00017 }
00018 }
00019
00020 void InternalStructFeatureDense::add(const std::string *treeFragment,
00021 float count,
00022 std::vector<float>& denseValues,
00023 std::map<std::string,float>& sparseValues) const
00024 {
00025
00026 size_t start=0;
00027 int countNP=0;
00028 while((start = treeFragment->find("NP", start)) != string::npos) {
00029 countNP += count;
00030 start+=2;
00031 }
00032
00033
00034 denseValues.push_back(exp(countNP));
00035
00036 }
00037
00038 void InternalStructFeatureSparse::add(const std::string *treeFragment,
00039 float count,
00040 std::vector<float>& denseValues,
00041 std::map<std::string,float>& sparseValues) const
00042 {
00043
00044 if(treeFragment->find("VBZ")!=std::string::npos)
00045 sparseValues["NTVBZ"] += count;
00046 if(treeFragment->find("VBD")!=std::string::npos)
00047 sparseValues["NTVBD"] += count;
00048 if(treeFragment->find("VBP")!=std::string::npos)
00049 sparseValues["NTVBP"] += count;
00050 if(treeFragment->find("PP")!=std::string::npos)
00051 sparseValues["NTPP"] += count;
00052 if(treeFragment->find("SBAR")!=std::string::npos)
00053 sparseValues["NTSBAR"] += count;
00054 }
00055
00056
00057 }