def char_level_drs(new_clauses, sep): '''Return to string format, use char-level for concepts''' return_strings = [] keep_word = ['"now"', '"speaker"', '"hearer"', '"+"'] for cur_clause in new_clauses: ret_str = '' for idx, item in enumerate(cur_clause): if between_quotes(item) and cur_clause[1] == 'Name' and idx == 3: item = " ".join(item) # Items between quotes are characters, except the ones in keep_word elif between_quotes(item) and item not in keep_word: item = " ".join(cur_clause[idx]) elif idx == 1 and not is_operator(item) and not is_role(item): # Concepts and roles are kept as is item = " ".join(item) ret_str += ' ' + item + ' ' + sep return_strings.append(" ".join(ret_str.rstrip(sep).strip().split())) return return_strings
def rewrite_length_four(self, cur_clause): '''Rewrite clauses of length 4, only rewrites, no introductions''' first_var = self.get_box_var(cur_clause[0]) second_var, third_var = cur_clause[2], cur_clause[3] # defaults # Only rewrite items that are not between quotes (so variables) if not between_quotes(cur_clause[2]): if cur_clause[1] in op_boxes: second_var = self.get_box_var(cur_clause[2]) else: second_var = self.get_disc_var(cur_clause[2]) # Now for the third variable if not between_quotes(cur_clause[3]): if cur_clause[1] in op_boxes + ["PRP"]: third_var = self.get_box_var(cur_clause[3]) else: third_var = self.get_disc_var(cur_clause[3]) self.new_clauses.append( [first_var, cur_clause[1], second_var, third_var])
def rewrite_length_four(self, cur_clause): '''Rewrite clauses of length four in relative manner''' first_var = self.get_variable(cur_clause[0], True) second_var, third_var = cur_clause[2], cur_clause[3] # defaults # First do second variable, then do third variable if not between_quotes(cur_clause[2]): second_var = self.get_variable(cur_clause[2], cur_clause[1] in op_boxes) if not between_quotes(cur_clause[3]): third_var = self.get_variable(cur_clause[3], cur_clause[1] in op_boxes + self.extra_third_var_boxes) # Fix sense if model didn't produce one if is_concept(cur_clause[1]) and not between_quotes(cur_clause[2]): self.pp_info.pp_dict["no-sense"].append(self.pp_info.cur_idx) second_var = self.default_sense # If fourth item is not between quotes for name, add "tom" if not between_quotes(cur_clause[3]) and cur_clause[1] == "Name": pass # third_var = '"tom"' else: # Add the final clause self.new_clauses.append([first_var, cur_clause[1], second_var, third_var])
def is_disc_ref(main_item, item, clause_idx): '''Return whether item is discourse variable, given main_item and position in the clause''' if main_item == "PRP": return clause_idx == 2 return main_item not in op_boxes and not between_quotes(item)
def rewrite_drss_absolute(drs): '''Rewrite DRS variables to a more general standard -- absolute naming''' new_clauses = [] box_dict, var_dict = {}, {} #dicts to keep track of variable names box_id, var_id = '$', '@' for cur_clause in drs: # Clause has 3 items if len(cur_clause) == 3: # Rewrite box variable first_var, box_dict = get_from_dict(cur_clause[0], box_dict, box_id) if cur_clause[1] in op_boxes: #handle box variables second_var, box_dict = get_from_dict(cur_clause[2], box_dict, box_id) new_clauses.append([first_var, cur_clause[1], second_var]) else: second_var, var_dict = get_from_dict(cur_clause[2], var_dict, var_id) new_clauses.append([first_var, cur_clause[1], second_var]) # Clause has 4 items else: first_var, box_dict = get_from_dict(cur_clause[0], box_dict, box_id) # Second item is an operator if is_operator(cur_clause[1]): # Handle second variable second_var, third_var = cur_clause[2], cur_clause[3] #defaults if not between_quotes(cur_clause[2]): if not (cur_clause[1] in op_boxes and cur_clause[1] != 'PRP'): second_var, var_dict = get_from_dict( cur_clause[2], var_dict, var_id) # Handle third variable (if there) if not between_quotes(cur_clause[3]): if cur_clause[1] == 'PRP': second_var, var_dict = get_from_dict( cur_clause[2], var_dict, var_id) third_var, box_dict = get_from_dict( cur_clause[3], box_dict, box_id) elif cur_clause[1] in op_boxes: second_var, box_dict = get_from_dict( cur_clause[2], box_dict, box_id) third_var, box_dict = get_from_dict( cur_clause[3], box_dict, box_id) else: third_var, var_dict = get_from_dict( cur_clause[3], var_dict, var_id) new_clauses.append( [first_var, cur_clause[1], second_var, third_var]) # Second item is a role elif is_role(cur_clause[1]): second_var, var_dict = get_from_dict(cur_clause[2], var_dict, var_id) if not between_quotes(cur_clause[3]): third_var, var_dict = get_from_dict( cur_clause[3], var_dict, var_id) else: third_var = cur_clause[3] new_clauses.append( [first_var, cur_clause[1], second_var, third_var]) # Otherwise it must be a concept (b1 work "v.01" x2) else: third_var, var_dict = get_from_dict(cur_clause[3], var_dict, var_id) new_clauses.append( [first_var, cur_clause[1], cur_clause[2], third_var]) return new_clauses
def rewrite_drss_relative(drs): '''Rewrite DRS variables to a more general standard -- relative naming''' # Get order of REFs var_order = [x[2] for x in drs if x[1] == 'REF'] new_clauses, vars_seen, boxes_seen = [], [], [] cur_var = 0 for cur_clause in drs: # Clause has 3 items if len(cur_clause) == 3: # Rewrite box variable first_var, boxes_seen, new_clauses = get_box_var( cur_clause[0], boxes_seen, new_clauses) # REF is a special case, it introduces a variable if cur_clause[1] == 'REF': new_clauses.append([first_var, cur_clause[1]]) cur_var += 1 #saw a new var, so increase cur_var elif cur_clause[1] in op_boxes: #handle box variables second_var, boxes_seen, new_clauses = get_box_var( cur_clause[2], boxes_seen, new_clauses) new_clauses.append([first_var, cur_clause[1], second_var]) else: #otherwise treat it as a discourse variable second_var, vars_seen = new_var_name(cur_clause[2], var_order, cur_var, vars_seen) new_clauses.append([first_var, cur_clause[1], second_var]) # Clause has 4 items else: first_var, boxes_seen, new_clauses = get_box_var( cur_clause[0], boxes_seen, new_clauses) # Second item is an operator if is_operator(cur_clause[1]): # Handle second variable second_var, third_var = cur_clause[2], cur_clause[3] #defaults if not between_quotes(cur_clause[2]): if not (cur_clause[1] in op_boxes and cur_clause[1] != 'PRP'): second_var, vars_seen = new_var_name( cur_clause[2], var_order, cur_var, vars_seen) # Handle third variable (if there) if not between_quotes(cur_clause[3]): if cur_clause[1] == 'PRP': second_var, vars_seen = new_var_name( cur_clause[2], var_order, cur_var, vars_seen) third_var, boxes_seen, new_clauses = get_box_var( cur_clause[3], boxes_seen, new_clauses) elif cur_clause[1] in op_boxes: second_var, boxes_seen, new_clauses = get_box_var( cur_clause[2], boxes_seen, new_clauses) third_var, boxes_seen, new_clauses = get_box_var( cur_clause[3], boxes_seen, new_clauses) else: third_var, vars_seen = new_var_name( cur_clause[3], var_order, cur_var, vars_seen) new_clauses.append( [first_var, cur_clause[1], second_var, third_var]) # Second item is a role elif is_role(cur_clause[1]): second_var, third_var = cur_clause[2], cur_clause[3] if not between_quotes(cur_clause[2]): second_var, vars_seen = new_var_name( cur_clause[2], var_order, cur_var, vars_seen) if not between_quotes(cur_clause[3]): third_var, vars_seen = new_var_name( cur_clause[3], var_order, cur_var, vars_seen) new_clauses.append( [first_var, cur_clause[1], second_var, third_var]) # Otherwise it must be a concept (b1 work "v.01" x2) else: third_var = cur_clause[3] if not between_quotes(cur_clause[3]): third_var, vars_seen = new_var_name( cur_clause[3], var_order, cur_var, vars_seen) new_clauses.append( [first_var, cur_clause[1], cur_clause[2], third_var]) return new_clauses