def replace_subgraph_for_person_or_organization(amr: AMR, node_var): """ Replace a subgraph for a person or organization. The wiki node and name subgraph are removed and person is replaced with PERSON, while organization is replaced with ORGANIZATION Eg. p / person :wiki "Deng_Xiaoping" :name (n / name :op1 "Deng"~e.1 :op2 "Xiaoping"~e.2) :ARG0-of (h / have-rel-role-91 :ARG2 (c / comrade~e.0))) With p / PERSON :ARG0-of (h / have-rel-role-91 :ARG2 (c / comrade~e.0))) """ # replaced amr[node_var]['name'][0][0] with amr[node_var].get('name')[0][0] # because the first option sometimes gives wrong results wiki_literal = amr[node_var].get('wiki')[0][0] name_node = amr[node_var].get('name')[0][0] name_op_literals = [ name_op_tuple[0][0] for name_op_tuple in amr[name_node].values() ] # remove from relation_to_tokens update_relation_to_tokens(amr, node_var, ['wiki', 'name']) update_relation_to_tokens(amr, name_node, amr[name_node].keys()) # remove from default dict del amr[node_var]['wiki'] del amr[node_var]['name'] del amr[name_node] if wiki_literal in amr.keys(): # the condition is necessary in case there are two or more - wiki literals if wiki_literal == '-': # do not delete it if there is also polarity in the amr all_relations_list = [item.keys() for item in amr.values()] all_relations = [ item for sublist in all_relations_list for item in sublist ] if 'polarity' not in all_relations: del amr[wiki_literal] else: del amr[wiki_literal] for name_op_literal in name_op_literals: if name_op_literal in amr.keys(): del amr[name_op_literal] # remove from node_to_concepts del amr.node_to_concepts[name_node] # remove from node_to_tokens nodes_to_remove: List = name_op_literals.copy() nodes_to_remove.append(name_node) nodes_to_remove.append(wiki_literal) for node in nodes_to_remove: if node in amr.node_to_tokens.keys(): del amr.node_to_tokens[node] # replace person -> PERSON and organization -> ORGANIZATION amr.node_to_concepts[node_var] = amr.node_to_concepts[node_var].upper() return amr
def __create_concept_to_tokens_dict(amr: AMR): concepts_to_tokens = {} for var in amr.keys(): # get aligned tokens if possible tokens = [] if var in amr.node_to_tokens.keys(): tokens = amr.node_to_tokens[var] # differentiate between concepts with vars and without if var in amr.node_to_concepts.keys(): concept = Concept(var, amr.node_to_concepts[var]) # need to check for tuples because there are some constants with the same values as variables # eg. literal "a" in graph which also has variable a tokens_list = [ t[0] if isinstance(t, tuple) else t for t in tokens ] concepts_to_tokens[concept] = tokens_list else: c_t = IdentifiedConcepts.__get_concepts_tokens_list_for_no_var_node( amr, var, tokens) concepts_to_tokens.update(c_t) return concepts_to_tokens