#include "global_ff.h" #include #include #include "tdict.h" using namespace std; struct GFFImpl { void PrepareForInput(const TaggedSentence& sentence) { } void Features(const TaggedSentence& sentence, const EdgeSubset& tree, SparseVector* feats) const { const vector& words = sentence.words; const vector& tags = sentence.pos; const vector >& hms = tree.h_m_pairs; assert(words.size() == tags.size()); vector mods(words.size()); for (int i = 0; i < hms.size(); ++i) { mods[hms[i].first]++; // first = head, second = modifier } for (int i = 0; i < mods.size(); ++i) { ostringstream os; os << "NM:" << TD::Convert(tags[i]) << "_" << mods[i]; feats->add_value(FD::Convert(os.str()), 1.0); } } }; GlobalFeatureFunctions::GlobalFeatureFunctions() : pimpl(new GFFImpl) {} GlobalFeatureFunctions::~GlobalFeatureFunctions() { delete pimpl; } void GlobalFeatureFunctions::PrepareForInput(const TaggedSentence& sentence) { pimpl->PrepareForInput(sentence); } void GlobalFeatureFunctions::Features(const TaggedSentence& sentence, const EdgeSubset& tree, SparseVector* feats) const { pimpl->Features(sentence, tree, feats); }