#pragma once #include #include #include #include #include #include "moses/ScoreComponentCollection.h" #include "moses/FF/InternalTree.h" #include "SHyperedge.h" #include "SVertex.h" namespace Moses { namespace Syntax { // k-best list extractor that implements algorithm 3 from this paper: // // Liang Huang and David Chiang // "Better k-best parsing" // In Proceedings of IWPT 2005 // class KBestExtractor { public: struct KVertex; struct KHyperedge { KHyperedge(const SHyperedge &e) : shyperedge(e) {} const SHyperedge ­peredge; boost::shared_ptr head; std::vector > tail; }; struct Derivation { Derivation(const boost::shared_ptr &); Derivation(const Derivation &, std::size_t); boost::shared_ptr edge; std::vector backPointers; std::vector > subderivations; ScoreComponentCollection scoreBreakdown; float score; }; struct DerivationOrderer { bool operator()(const boost::weak_ptr &d1, const boost::weak_ptr &d2) const { boost::shared_ptr s1(d1); boost::shared_ptr s2(d2); return s1->score < s2->score; } }; struct KVertex { typedef std::priority_queue, std::vector >, DerivationOrderer> DerivationQueue; KVertex(const SVertex &v) : svertex(v), visited(false) {} const SVertex &svertex; std::vector > kBestList; DerivationQueue candidates; bool visited; }; typedef std::vector > KBestVec; // Extract the k-best list from the search hypergraph given the full, sorted // list of top-level SVertices. void Extract(const std::vector > &, std::size_t, KBestVec &); static Phrase GetOutputPhrase(const Derivation &); static TreePointer GetOutputTree(const Derivation &); private: typedef boost::unordered_map > VertexMap; struct DerivationHasher { std::size_t operator()(const boost::shared_ptr &d) const { std::size_t seed = 0; boost::hash_combine(seed, &(d->edge->shyperedge)); boost::hash_combine(seed, d->backPointers); return seed; } }; struct DerivationEqualityPred { bool operator()(const boost::shared_ptr &d1, const boost::shared_ptr &d2) const { return &(d1->edge->shyperedge) == &(d2->edge->shyperedge) && d1->backPointers == d2->backPointers; } }; typedef boost::unordered_set, DerivationHasher, DerivationEqualityPred> DerivationSet; boost::shared_ptr FindOrCreateVertex(const SVertex &); void GetCandidates(boost::shared_ptr, std::size_t); void LazyKthBest(boost::shared_ptr, std::size_t, std::size_t); void LazyNext(KVertex &, const Derivation &, std::size_t); VertexMap m_vertexMap; DerivationSet m_derivations; }; } // namespace Syntax } // namespace Moses