prob_t ViterbiESentence(const Hypergraph& hg, vector
return Viterbi
}
viterbi.h
template
typename WeightFunction::Weight Viterbi(const Hypergraph& hg,
typename Traversal::Result* result,
const Traversal& traverse,
const WeightFunction& weight) {
typedef typename Traversal::Result T;
typedef typename WeightFunction::Weight WeightType;
const int num_nodes = hg.nodes_.size();
std::vector
std::vector
for (int i = 0; i < num_nodes; ++i) {
const Hypergraph::Node& cur_node = hg.nodes_[i];
WeightType* const cur_node_best_weight = &vit_weight[i];
T* const cur_node_best_result = &vit_result[i];
const unsigned num_in_edges = cur_node.in_edges_.size();
if (num_in_edges == 0) {
*cur_node_best_weight = WeightType(1);
continue;
}
HG::Edge const* edge_best=0;
for (unsigned j = 0; j < num_in_edges; ++j) {
const HG::Edge& edge = hg.edges_[cur_node.in_edges_[j]];
WeightType score = weight(edge);
for (unsigned k = 0; k < edge.tail_nodes_.size(); ++k)
score *= vit_weight[edge.tail_nodes_[k]];
if (!edge_best || *cur_node_best_weight < score) {
*cur_node_best_weight = score;
edge_best=&edge;
}
}
assert(edge_best);
HG::Edge const& edgeb=*edge_best;
std::vector
for (unsigned k = 0; k < edgeb.tail_nodes_.size(); ++k)
antsb[k] = &vit_result[edgeb.tail_nodes_[k]];
traverse(edgeb, antsb, cur_node_best_result);
}
if (vit_result.empty())
return WeightType(0);
std::swap(*result, vit_result.back());
return vit_weight.back();
}
其中traverse调用ESentenceTraversal() --> TRule::ESubstitute()
没有评论:
发表评论