void AlignmentGraph::AttachUnalignedSourceWords() { // Find the unaligned source words (if any). std::set<int> unaligned; for (int i = 0; i < m_sourceNodes.size(); ++i) { const Node &sourceNode = (*m_sourceNodes[i]); if (sourceNode.GetParents().empty()) { unaligned.insert(i); } } // Determine the attachment point for each one and attach it. for (std::set<int>::iterator p = unaligned.begin(); p != unaligned.end(); ++p) { int index = *p; Node *attachmentPoint = DetermineAttachmentPoint(index); Node *sourceNode = m_sourceNodes[index]; attachmentPoint->AddChild(sourceNode); sourceNode->AddParent(attachmentPoint); } }
Node *AlignmentGraph::CopyParseTree(const ParseTree *root) { NodeType nodeType = (root->IsLeaf()) ? TARGET : TREE; std::auto_ptr<Node> n(new Node(root->GetLabel(), nodeType)); const std::vector<ParseTree *> &children = root->GetChildren(); std::vector<Node *> childNodes; childNodes.reserve(children.size()); for (std::vector<ParseTree *>::const_iterator p(children.begin()); p != children.end(); ++p) { Node *child = CopyParseTree(*p); child->AddParent(n.get()); childNodes.push_back(child); } n->SetChildren(childNodes); Node *p = n.release(); m_targetNodes.push_back(p); return p; }
AlignmentGraph::AlignmentGraph(const ParseTree *t, const std::vector<std::string> &s, const Alignment &a) { // Copy the parse tree nodes and add them to m_targetNodes. m_root = CopyParseTree(t); // Create a node for each source word. m_sourceNodes.reserve(s.size()); for (std::vector<std::string>::const_iterator p(s.begin()); p != s.end(); ++p) { m_sourceNodes.push_back(new Node(*p, SOURCE)); } // Connect source nodes to parse tree leaves according to the given word // alignment. std::vector<Node *> targetTreeLeaves; GetTargetTreeLeaves(m_root, targetTreeLeaves); for (Alignment::const_iterator p(a.begin()); p != a.end(); ++p) { Node *src = m_sourceNodes[p->first]; Node *tgt = targetTreeLeaves[p->second]; src->AddParent(tgt); tgt->AddChild(src); } // Attach unaligned source words (if any). AttachUnalignedSourceWords(); // Populate node spans. std::vector<Node *>::const_iterator p(m_sourceNodes.begin()); for (int i = 0; p != m_sourceNodes.end(); ++p, ++i) { (*p)->PropagateIndex(i); } // Calculate complement spans. CalcComplementSpans(m_root); }