#include "ff_context.h" #include #include #include #include #include "filelib.h" #include "stringlib.h" #include "sentence_metadata.h" #include "lattice.h" #include "fdict.h" #include "verbose.h" RuleContextFeatures::RuleContextFeatures(const string& param) { // cerr << "initializing RuleContextFeatures with parameters: " << param; kSOS = TD::Convert(""); kEOS = TD::Convert(""); macro_regex = sregex::compile("%([xy])\\[(-[1-9][0-9]*|0|[1-9][1-9]*)]"); ParseArgs(param); } string RuleContextFeatures::Escape(const string& x) const { string y = x; for (int i = 0; i < y.size(); ++i) { if (y[i] == '=') y[i]='_'; if (y[i] == ';') y[i]='_'; } return y; } // replace %x[relative_location] or %y[relative_location] with actual_token // within feature_instance void RuleContextFeatures::ReplaceMacroWithString( string& feature_instance, bool token_vs_label, int relative_location, const string& actual_token) const { stringstream macro; if (token_vs_label) { macro << "%x["; } else { macro << "%y["; } macro << relative_location << "]"; int macro_index = feature_instance.find(macro.str()); if (macro_index == string::npos) { cerr << "Can't find macro " << macro << " in feature template " << feature_instance; abort(); } feature_instance.replace(macro_index, macro.str().size(), actual_token); } void RuleContextFeatures::ReplaceTokenMacroWithString( string& feature_instance, int relative_location, const string& actual_token) const { ReplaceMacroWithString(feature_instance, true, relative_location, actual_token); } void RuleContextFeatures::ReplaceLabelMacroWithString( string& feature_instance, int relative_location, const string& actual_token) const { ReplaceMacroWithString(feature_instance, false, relative_location, actual_token); } void RuleContextFeatures::Error(const string& error_message) const { cerr << "Error: " << error_message << "\n\n" << "RuleContextFeatures Usage: \n" << " feature_function=RuleContextFeatures -t