00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef moses_cmd_LatticeMBR_h
00011 #define moses_cmd_LatticeMBR_h
00012
00013 #include <map>
00014 #include <vector>
00015 #include <set>
00016 #include "moses/Hypothesis.h"
00017 #include "moses/Manager.h"
00018 #include "moses/TrellisPathList.h"
00019
00020
00021
00022 namespace Moses
00023 {
00024
00025 class Edge;
00026
00027 typedef std::vector< const Moses::Hypothesis *> Lattice;
00028 typedef std::vector<const Edge*> Path;
00029 typedef std::map<Path, size_t> PathCounts;
00030 typedef std::map<Moses::Phrase, PathCounts > NgramHistory;
00031
00032 class Edge
00033 {
00034 const Moses::Hypothesis* m_tailNode;
00035 const Moses::Hypothesis* m_headNode;
00036 float m_score;
00037 Moses::TargetPhrase m_targetPhrase;
00038 NgramHistory m_ngrams;
00039
00040 public:
00041 Edge(const Moses::Hypothesis* from, const Moses::Hypothesis* to, float score, const Moses::TargetPhrase& targetPhrase) : m_tailNode(from), m_headNode(to), m_score(score), m_targetPhrase(targetPhrase) {
00042
00043 }
00044
00045 const Moses::Hypothesis* GetHeadNode() const {
00046 return m_headNode;
00047 }
00048
00049 const Moses::Hypothesis* GetTailNode() const {
00050 return m_tailNode;
00051 }
00052
00053 float GetScore() const {
00054 return m_score;
00055 }
00056
00057 size_t GetWordsSize() const {
00058 return m_targetPhrase.GetSize();
00059 }
00060
00061 const Moses::Phrase& GetWords() const {
00062 return m_targetPhrase;
00063 }
00064
00065 friend std::ostream& operator<< (std::ostream& out, const Edge& edge);
00066
00067 const NgramHistory& GetNgrams( std::map<const Moses::Hypothesis*, std::vector<Edge> > & incomingEdges) ;
00068
00069 bool operator < (const Edge & compare) const;
00070
00071 void GetPhraseSuffix(const Moses::Phrase& origPhrase, size_t lastN, Moses::Phrase& targetPhrase) const;
00072
00073 void storeNgramHistory(const Moses::Phrase& phrase, Path & path, size_t count = 1) {
00074 m_ngrams[phrase][path]+= count;
00075 }
00076
00077 };
00078
00082 class NgramScores
00083 {
00084 public:
00085 NgramScores() {}
00086
00088 void addScore(const Moses::Hypothesis* node, const Moses::Phrase& ngram, float score);
00089
00091 typedef std::map<const Moses::Phrase*, float>::const_iterator NodeScoreIterator;
00092 NodeScoreIterator nodeBegin(const Moses::Hypothesis* node);
00093 NodeScoreIterator nodeEnd(const Moses::Hypothesis* node);
00094
00095 private:
00096 std::set<Moses::Phrase> m_ngrams;
00097 std::map<const Moses::Hypothesis*, std::map<const Moses::Phrase*, float> > m_scores;
00098 };
00099
00100
00102 class LatticeMBRSolution
00103 {
00104 public:
00106 LatticeMBRSolution(const Moses::TrellisPath& path, bool isMap);
00107 const std::vector<float>& GetNgramScores() const {
00108 return m_ngramScores;
00109 }
00110 const std::vector<Moses::Word>& GetWords() const {
00111 return m_words;
00112 }
00113 float GetMapScore() const {
00114 return m_mapScore;
00115 }
00116 float GetScore() const {
00117 return m_score;
00118 }
00119
00121 void CalcScore(std::map<Moses::Phrase, float>& finalNgramScores, const std::vector<float>& thetas, float mapWeight);
00122
00123 private:
00124 std::vector<Moses::Word> m_words;
00125 float m_mapScore;
00126 std::vector<float> m_ngramScores;
00127 float m_score;
00128 };
00129
00130 struct LatticeMBRSolutionComparator {
00131 bool operator()(const LatticeMBRSolution& a, const LatticeMBRSolution& b) {
00132 return a.GetScore() > b.GetScore();
00133 }
00134 };
00135
00136 void pruneLatticeFB(Lattice & connectedHyp, std::map < const Moses::Hypothesis*, std::set <const Moses::Hypothesis* > > & outgoingHyps, std::map<const Moses::Hypothesis*, std::vector<Edge> >& incomingEdges,
00137 const std::vector< float> & estimatedScores, const Moses::Hypothesis*, size_t edgeDensity,float scale);
00138
00139
00140 void getLatticeMBRNBest(const Moses::Manager& manager, const Moses::TrellisPathList& nBestList, std::vector<LatticeMBRSolution>& solutions, size_t n);
00141
00142 void calcNgramExpectations(Lattice & connectedHyp, std::map<const Moses::Hypothesis*, std::vector<Edge> >& incomingEdges, std::map<Moses::Phrase,
00143 float>& finalNgramScores, bool posteriors);
00144 void GetOutputFactors(const Moses::TrellisPath &path, std::vector <Moses::Word> &translation);
00145 void extract_ngrams(const std::vector<Moses::Word >& sentence, std::map < Moses::Phrase, int > & allngrams);
00146 bool ascendingCoverageCmp(const Moses::Hypothesis* a, const Moses::Hypothesis* b);
00147 std::vector<Moses::Word> doLatticeMBR(const Moses::Manager& manager, const Moses::TrellisPathList& nBestList);
00148 const Moses::TrellisPath doConsensusDecoding(const Moses::Manager& manager, const Moses::TrellisPathList& nBestList);
00149
00150
00151 }
00152
00153 #endif