def __init__(self, span, lhs, rhs, dot=0, bindings=None): """ Construct a new edge. If the edge is incomplete (i.e., if ``dot<len(rhs)``), then store the bindings as-is. If the edge is complete (i.e., if ``dot==len(rhs)``), then apply the bindings to all nonterminals in ``lhs`` and ``rhs``, and then clear the bindings. See ``TreeEdge`` for a description of the other arguments. """ if bindings is None: bindings = {} # If the edge is complete, then substitute in the bindings, # and then throw them away. (If we didn't throw them away, we # might think that 2 complete edges are different just because # they have different bindings, even though all bindings have # already been applied.) if dot == len(rhs) and bindings: lhs = self._bind(lhs, bindings) rhs = [self._bind(elt, bindings) for elt in rhs] bindings = {} # Initialize the edge. TreeEdge.__init__(self, span, lhs, rhs, dot) self._bindings = bindings self._comparison_key = (self._comparison_key, tuple(sorted(bindings.items())))
def __str__(self): if self.is_complete(): return TreeEdge.__unicode__(self) else: bindings = '{%s}' % ', '.join('%s: %r' % item for item in sorted(self._bindings.items())) return '%s %s' % (TreeEdge.__unicode__(self), bindings)
def __str__(self): if self.is_complete(): return TreeEdge.__unicode__(self) else: bindings = '{%s}' % ', '.join( '%s: %r' % item for item in sorted(self._bindings.items())) return '%s %s' % (TreeEdge.__unicode__(self), bindings)
def apply_iter(self, chart, grammar, right_edge): if (right_edge.is_incomplete() or # use only completed edges isinstance(right_edge, LeafEdge) or # skip terminal leaves is_lexical(right_edge) or # skip lexical productions right_edge.lhs().symbol() == 'G'): # skip BRM rules return # We only merge if both the right end left edge are completed. The # left edge must be adjacent to the right edge in the chart. for left_edge in chart.select(end=right_edge.start(), is_complete=True): if isinstance(left_edge, LeafEdge) or is_lexical(left_edge): continue new_edge = TreeEdge(span=(left_edge.start(), right_edge.end()), lhs=right_edge.lhs(), rhs=[left_edge.lhs(), right_edge.lhs()], dot=2) # edge is completed at initialization if chart.insert(new_edge, (left_edge, right_edge)): yield new_edge
def __init__(self, prob, *args, **kwargs): TreeEdge.__init__(self, *args, **kwargs) self._prob = prob # two edges with different probabilities are not equal. self._comparison_key = (self._comparison_key, prob)
def __cmp__(self, other): if self._prob != other.prob(): return -1 return TreeEdge.__cmp__(self, other)
def __init__(self, prob, *args, **kwargs): self._prob = prob TreeEdge.__init__(self, *args, **kwargs)
def __str__(self): if self.is_complete(): return TreeEdge.__unicode__(self) else: bindings = "{%s}" % ", ".join("%s: %r" % item for item in sorted(self._bindings.items())) return "%s %s" % (TreeEdge.__unicode__(self), bindings)