コード例 #1
0
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
コード例 #2
0
ファイル: concept.py プロジェクト: keg-tucn/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