summaryrefslogtreecommitdiff
path: root/rst_parser/global_ff.cc
diff options
context:
space:
mode:
authorChris Dyer <cdyer@cs.cmu.edu>2012-04-16 22:43:29 -0400
committerChris Dyer <cdyer@cs.cmu.edu>2012-04-16 22:43:29 -0400
commit44c36473b420ff47652da103949a1175a10c528d (patch)
tree7106454a3b13a04a17a3a7c7cfb3010ce261d2a3 /rst_parser/global_ff.cc
parent23dcec445852d140291bba4a8c40bb0e47e9a266 (diff)
global features
Diffstat (limited to 'rst_parser/global_ff.cc')
-rw-r--r--rst_parser/global_ff.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/rst_parser/global_ff.cc b/rst_parser/global_ff.cc
new file mode 100644
index 00000000..bb715f18
--- /dev/null
+++ b/rst_parser/global_ff.cc
@@ -0,0 +1,43 @@
+#include "global_ff.h"
+
+#include <iostream>
+
+#include "tdict.h"
+
+using namespace std;
+
+struct GFFImpl {
+ void PrepareForInput(const TaggedSentence& sentence) {
+ }
+ void Features(const TaggedSentence& sentence,
+ const EdgeSubset& tree,
+ SparseVector<double>* feats) const {
+ const vector<WordID>& words = sentence.words;
+ const vector<WordID>& tags = sentence.pos;
+ const vector<pair<short,short> >& hms = tree.h_m_pairs;
+ assert(words.size() == tags.size());
+ vector<int> 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() {}
+GlobalFeatureFunctions::~GlobalFeatureFunctions() { delete pimpl; }
+
+void GlobalFeatureFunctions::PrepareForInput(const TaggedSentence& sentence) {
+ pimpl->PrepareForInput(sentence);
+}
+
+void GlobalFeatureFunctions::Features(const TaggedSentence& sentence,
+ const EdgeSubset& tree,
+ SparseVector<double>* feats) const {
+ pimpl->Features(sentence, tree, feats);
+}
+