def fix_rnr(self, rnr, g): # G is the node dominating all the conjuncts rnr_tags = [] for node, ctx in find_all( g, r'/:c/a', with_context=True): for rnr in find_all( node, r'^/\*RNR\*/'): rnr_tags.append(get_trace_index_from_tag(rnr.lex)) for index in rnr_tags: for node, ctx in find_all( g, r'*=PP < { *=P < { *=T < ^/\*RNR\*%s/ $ *=S } }' % index, with_context=True ): inherit_tag(ctx.s, ctx.p) self.fix_object_gap(ctx.pp, ctx.p, ctx.t, ctx.s) self.fix_categories_starting_from(ctx.s, g) # This breaks with the IP (LC CC LC) case in 9:19(11) -- last_conjunct returns None # because the last conjunct has been shrunk last_conjunct = list(find_first(g, r'/:c/a', left_to_right=False)) args = [] # Here, we uniquify the rnr tags so that we excise each shared argument only once for index in set(rnr_tags): # find_first, because we only want to find one match, the shallowest. # cf 7:27(10), if NP-OBJ-2(NN NP-OBJ-2(JJ NN)), then we only want to identify # one matching node for index -2 -- the shallowest -- and not two. for node, ctx in find_first( last_conjunct[0], r'*=P < { /%s/a=T $ *=S }' % index, with_context=True ): args.append(ctx.t) # Note: last_conjunct may be disconnected from # the tree by replace_kid (when ctx.p == last_conjunct) replace_kid(ctx.p.parent, ctx.p, ctx.s) self.fix_categories_starting_from(ctx.s, g) # Because the find_all which retrieved the args is an in-order left-to-right traversal, it will find # shallower nodes before deeper nodes. Therefore, if a verb has two args V A1 A2, the _args_ list will # contain [A2, A1] because A2 is shallower (further from the head) than A1. # We reverse the list of args, so that args are re-attached from the inside out (starting from A1). # args.reverse() new_g = g for arg in args: new_g = Node(new_g.tag, [new_g, arg], new_g.category.left, head_index=0) arg.parent = new_g replace_kid(g.parent, g, new_g)
def fix_rnr(self, rnr, g): # G is the node dominating all the conjuncts rnr_tags = [] for node, ctx in find_all(g, r'/:c/a', with_context=True): for rnr in find_all(node, r'^/\*RNR\*/'): rnr_tags.append(get_trace_index_from_tag(rnr.lex)) for index in rnr_tags: for node, ctx in find_all( g, r'*=PP < { *=P < { *=T < ^/\*RNR\*%s/ $ *=S } }' % index, with_context=True): inherit_tag(ctx.s, ctx.p) self.fix_object_gap(ctx.pp, ctx.p, ctx.t, ctx.s) self.fix_categories_starting_from(ctx.s, g) # This breaks with the IP (LC CC LC) case in 9:19(11) -- last_conjunct returns None # because the last conjunct has been shrunk last_conjunct = list(find_first(g, r'/:c/a', left_to_right=False)) args = [] # Here, we uniquify the rnr tags so that we excise each shared argument only once for index in set(rnr_tags): # find_first, because we only want to find one match, the shallowest. # cf 7:27(10), if NP-OBJ-2(NN NP-OBJ-2(JJ NN)), then we only want to identify # one matching node for index -2 -- the shallowest -- and not two. for node, ctx in find_first(last_conjunct[0], r'*=P < { /%s/a=T $ *=S }' % index, with_context=True): args.append(ctx.t) # Note: last_conjunct may be disconnected from # the tree by replace_kid (when ctx.p == last_conjunct) replace_kid(ctx.p.parent, ctx.p, ctx.s) self.fix_categories_starting_from(ctx.s, g) # Because the find_all which retrieved the args is an in-order left-to-right traversal, it will find # shallower nodes before deeper nodes. Therefore, if a verb has two args V A1 A2, the _args_ list will # contain [A2, A1] because A2 is shallower (further from the head) than A1. # We reverse the list of args, so that args are re-attached from the inside out (starting from A1). # args.reverse() new_g = g for arg in args: new_g = Node(new_g.tag, [new_g, arg], new_g.category.left, head_index=0) arg.parent = new_g replace_kid(g.parent, g, new_g)
def get_first(*args, **kwargs): '''Returns one tgrep result, or None if no nodes match.''' try: return find_first(*args, **kwargs).next() except StopIteration: return None