diff options
| author | Chris Dyer <cdyer@cs.cmu.edu> | 2011-03-03 22:44:42 -0500 | 
|---|---|---|
| committer | Chris Dyer <cdyer@cs.cmu.edu> | 2011-03-03 22:44:42 -0500 | 
| commit | 703fd668503e147ea2596c3715eb3a29f8ff89e1 (patch) | |
| tree | 161ad1d548099bb393d2c9af9e672c5c6445b0d7 | |
| parent | 0cefd265894af776583f8fdfdaadf2c7d95a81f8 (diff) | |
new span features
| -rw-r--r-- | decoder/ff_spans.cc | 45 | ||||
| -rw-r--r-- | decoder/ff_spans.h | 7 | 
2 files changed, 38 insertions, 14 deletions
| diff --git a/decoder/ff_spans.cc b/decoder/ff_spans.cc index 1cf72be9..17e1d650 100644 --- a/decoder/ff_spans.cc +++ b/decoder/ff_spans.cc @@ -13,6 +13,13 @@  using namespace std; +// log transform to make long spans cluster together +// but preserve differences +int SpanSizeTransform(unsigned span_size) { +  if (!span_size) return 0; +  return static_cast<int>(log(span_size+1) / log(1.39)) - 1; +} +  SpanFeatures::SpanFeatures(const string& param) :      kS(TD::Convert("S") * -1),      kX(TD::Convert("X") * -1), @@ -41,8 +48,8 @@ SpanFeatures::SpanFeatures(const string& param) :        }        word2class_[v[0]] = v[1];      } -    word2class_[TD::Convert("<s>")] = TD::Convert("BOS"); -    word2class_[TD::Convert("</s>")] = TD::Convert("EOS"); +    word2class_[TD::Convert("BOS")] = TD::Convert("BOS"); +    word2class_[TD::Convert("EOS")] = TD::Convert("EOS");      oov_ = TD::Convert("OOV");    } @@ -88,10 +95,15 @@ void SpanFeatures::TraversalFeaturesImpl(const SentenceMetadata& smeta,    } else {  // non-collapsed features:      features->set_value(end_span_ids_[edge.j_], 1);      features->set_value(beg_span_ids_[edge.i_], 1); -    if (edge.rule_->lhs_ == kS) +    features->set_value(end_bigram_ids_[edge.j_], 1); +    features->set_value(beg_bigram_ids_[edge.i_], 1); +    if (edge.rule_->lhs_ == kS) {        features->set_value(span_feats_(edge.i_,edge.j_).second, 1); -    else +      features->set_value(len_span_feats_(edge.i_,edge.j_).second, 1); +    } else {        features->set_value(span_feats_(edge.i_,edge.j_).first, 1); +      features->set_value(len_span_feats_(edge.i_,edge.j_).first, 1); +    }    }  } @@ -104,11 +116,14 @@ WordID SpanFeatures::MapIfNecessary(const WordID& w) const {  void SpanFeatures::PrepareForInput(const SentenceMetadata& smeta) {    const Lattice& lattice = smeta.GetSourceLattice(); -  const WordID eos = TD::Convert("</s>"); -  const WordID bos = TD::Convert("<s>"); +  const WordID eos = TD::Convert("EOS");  // right of the last source word +  const WordID bos = TD::Convert("BOS");  // left of the first source word    beg_span_ids_.resize(lattice.size() + 1);    end_span_ids_.resize(lattice.size() + 1);    span_feats_.resize(lattice.size() + 1, lattice.size() + 1); +  beg_bigram_ids_.resize(lattice.size() + 1); +  end_bigram_ids_.resize(lattice.size() + 1); +  len_span_feats_.resize(lattice.size() + 1, lattice.size() + 1);    if (use_collapsed_features_) {      beg_span_vals_.resize(lattice.size() + 1);      end_span_vals_.resize(lattice.size() + 1); @@ -126,6 +141,12 @@ void SpanFeatures::PrepareForInput(const SentenceMetadata& smeta) {      ostringstream sfid;      sfid << "ES:" << TD::Convert(word);      end_span_ids_[i] = FD::Convert(sfid.str()); +    ostringstream esbiid; +    esbiid << "EBI:" << TD::Convert(bword) << "_" << TD::Convert(word); +    end_bigram_ids_[i] = FD::Convert(esbiid.str()); +    ostringstream bsbiid; +    bsbiid << "BBI:" << TD::Convert(bword) << "_" << TD::Convert(word); +    beg_bigram_ids_[i] = FD::Convert(bsbiid.str());      ostringstream bfid;      bfid << "BS:" << TD::Convert(bword);      beg_span_ids_[i] = FD::Convert(bfid.str()); @@ -145,9 +166,14 @@ void SpanFeatures::PrepareForInput(const SentenceMetadata& smeta) {          word = lattice[j][0].label;        word = MapIfNecessary(word);        ostringstream pf; -      pf << "SS:" << TD::Convert(bword) << "_" << TD::Convert(word); +      pf << "S:" << TD::Convert(bword) << "_" << TD::Convert(word);        span_feats_(i,j).first = FD::Convert(pf.str());        span_feats_(i,j).second = FD::Convert("S_" + pf.str()); +      ostringstream lf; +      const unsigned span_size = (i < j ? j - i : i - j); +      lf << "LS:" << SpanSizeTransform(span_size) << "_" << TD::Convert(bword) << "_" << TD::Convert(word); +      len_span_feats_(i,j).first = FD::Convert(lf.str()); +      len_span_feats_(i,j).second = FD::Convert("S_" + lf.str());        if (use_collapsed_features_) {          span_vals_(i,j).first = feat2val_[pf.str()];          span_vals_(i,j).second = feat2val_["S_" + pf.str()]; @@ -187,11 +213,6 @@ CMR2008ReorderingFeatures::CMR2008ReorderingFeatures(const std::string& param) :    }  } -int CMR2008ReorderingFeatures::SpanSizeTransform(unsigned span_size) { -  if (!span_size) return 0; -  return static_cast<int>(log(span_size+1) / log(1.39)) - 1; -} -  void CMR2008ReorderingFeatures::TraversalFeaturesImpl(const SentenceMetadata& smeta,                                           const Hypergraph::Edge& edge,                                           const vector<const void*>& ant_contexts, diff --git a/decoder/ff_spans.h b/decoder/ff_spans.h index 9928d70f..67269d26 100644 --- a/decoder/ff_spans.h +++ b/decoder/ff_spans.h @@ -23,8 +23,11 @@ class SpanFeatures : public FeatureFunction {    const int kS;    const int kX;    Array2D<std::pair<int,int> > span_feats_; // first for X, second for S +  Array2D<std::pair<int,int> > len_span_feats_; // first for X, second for S, including length    std::vector<int> end_span_ids_; +  std::vector<int> end_bigram_ids_;    std::vector<int> beg_span_ids_; +  std::vector<int> beg_bigram_ids_;    std::map<WordID, WordID> word2class_;  // optional projection to coarser class    // collapsed feature values @@ -35,7 +38,9 @@ class SpanFeatures : public FeatureFunction {    int fid_span_;    std::map<std::string, double> feat2val_;    std::vector<double> end_span_vals_; +  std::vector<double> end_bigram_vals_;    std::vector<double> beg_span_vals_; +  std::vector<double> beg_bigram_vals_;    Array2D<std::pair<double,double> > span_vals_;    WordID oov_; @@ -52,8 +57,6 @@ class CMR2008ReorderingFeatures : public FeatureFunction {                                       SparseVector<double>* estimated_features,                                       void* context) const;   private: -  static int SpanSizeTransform(unsigned span_size); -    const int kS;    std::pair<int, int> unconditioned_fids_;  // first = monotone                                              // second = inverse | 
