lexicalCache PhraseDictionaryMultiModelCounts::CacheLexicalStatistics( const Phrase &phraseS, const Phrase &phraseT, AlignVector &alignment, const vector<lexicalTable*> &tables, bool is_input ) { //do all the necessary lexical table lookups and get counts, but don't apply weights yet Word null; if (is_input) { null.CreateFromString(Input, m_input, "NULL", false); } else { null.CreateFromString(Output, m_output, "NULL", false); } lexicalCache ret; // all target words have to be explained for(size_t ti=0; ti<alignment.size(); ti++) { const set< size_t > & srcIndices = alignment[ ti ]; Word t_word = phraseT.GetWord(ti); vector<lexicalPair> ti_vector; if (srcIndices.empty()) { // explain unaligned word by NULL vector<float> joint_count (m_numModels); vector<float> marginals (m_numModels); FillLexicalCountsJoint(null, t_word, joint_count, tables); FillLexicalCountsMarginal(null, marginals, tables); ti_vector.push_back(make_pair(joint_count, marginals)); } else { for (set< size_t >::const_iterator si(srcIndices.begin()); si != srcIndices.end(); ++si) { Word s_word = phraseS.GetWord(*si); vector<float> joint_count (m_numModels); vector<float> marginals (m_numModels); FillLexicalCountsJoint(s_word, t_word, joint_count, tables); FillLexicalCountsMarginal(s_word, marginals, tables); ti_vector.push_back(make_pair(joint_count, marginals)); } } ret.push_back(ti_vector); } return ret; }
std::vector<double> StationaryMarginals(const DblCubeHypermatrix& P) { std::vector<double> st = Stationary(P); int dim = P.dim(); std::vector<double> marginals(dim, 0.0); for (int i = 0; i < st.size(); ++i) { int marginal_ind = (i % dim); marginals[marginal_ind] += st[i]; } return marginals; }
// get lexical probability for single word alignment pair double PhraseDictionaryMultiModelCounts::GetLexicalProbability( Word &wordS, Word &wordT, const vector<lexicalTable*> &tables, vector<float> &multimodelweights ) const { vector<float> joint_count (m_numModels); vector<float> marginals (m_numModels); FillLexicalCountsJoint(wordS, wordT, joint_count, tables); FillLexicalCountsMarginal(wordS, marginals, tables); double lexProb = m_combineFunction(joint_count, marginals, multimodelweights); return lexProb; }