Spaces:
Runtime error
Runtime error
import sys; | |
import score.core; | |
from smatch.smatch import get_amr_match; | |
def tuples(graph, prefix, values, faith = True): | |
# | |
# mimicry of get_triples() in amr.py | |
# | |
id = 0; | |
mapping = dict(); | |
instances = []; | |
relations = []; | |
attributes = []; | |
n = 0; | |
for node in graph.nodes: | |
mapping[node.id] = name = prefix + str(id); | |
id += 1; | |
if "anchors" in values and node.anchors is not None: | |
anchor = score.core.anchor(node); | |
if graph.input: anchor = score.core.explode(graph.input, anchor); | |
attributes.append(("anchor", name, str(anchor))); | |
if "labels" in values and node.label is not None: | |
instance = node.label; | |
else: | |
instance = "__()_{}__".format(prefix, n); | |
n += 1; | |
instances.append(("instance", name, instance)); | |
if "tops" in values and node.is_top: | |
# | |
# the native SMATCH code (wrongly, i believe) ties the top property to | |
# the node label (see https://github.com/cfmrp/mtool/issues/12). we get | |
# to choose whether to faithfully replicate those scores or not. | |
# | |
attributes.append(("TOP", name, | |
node.label if node.label and faith else "")); | |
if "properties" in values and node.properties and node.values: | |
for property, value in zip(node.properties, node.values): | |
attributes.append((property, name, value)); | |
for edge in graph.edges: | |
if "edges" in values: | |
relations.append((edge.lab, mapping[edge.src], mapping[edge.tgt])); | |
if "attributes" in values: | |
if edge.attributes and edge.values: | |
for attribute, value in zip(edge.attributes, edge.values): | |
relations.append((str((attribute, value)), | |
mapping[edge.src], mapping[edge.tgt])); | |
return instances, attributes, relations, n; | |
def smatch(gold, system, limit = 20, values = {}, trace = 0, faith = True): | |
gprefix = "g"; sprefix = "s"; | |
ginstances, gattributes, grelations, gn \ | |
= tuples(gold, gprefix, values, faith); | |
sinstances, sattributes, srelations, sn \ | |
= tuples(system, sprefix, values, faith); | |
if trace > 1: | |
print("gold instances [{}]: {}\ngold attributes [{}]: {}\n" | |
"gold relations [{}]: {}" | |
"".format(len(ginstances), ginstances, | |
len(gattributes), gattributes, | |
len(grelations), grelations), | |
file = sys.stderr); | |
print("system instances [{}]: {}\nsystem attributes [{}]: {}\n" | |
"system relations [{}]: {}" | |
"".format(len(sinstances), sinstances, | |
len(sattributes), sattributes, | |
len(srelations), srelations), | |
file = sys.stderr); | |
correct, gold, system, mapping \ | |
= get_amr_match(None, None, gold.id, limit = limit, | |
instance1 = ginstances, attributes1 = gattributes, | |
relation1 = grelations, prefix1 = gprefix, | |
instance2 = sinstances, attributes2 = sattributes, | |
relation2 = srelations, prefix2 = sprefix); | |
return correct, gold - gn, system - sn, mapping; | |
def evaluate(golds, systems, format = "json", limit = 20, | |
values = {}, trace = 0): | |
if limit is None or not limit > 0: limit = 20; | |
if trace > 1: print("RRHC limit: {}".format(limit), file = sys.stderr); | |
tg = ts = tc = n = 0; | |
scores = dict() if trace else None; | |
for gold, system in score.core.intersect(golds, systems): | |
id = gold.id; | |
correct, gold, system, mapping \ | |
= smatch(gold, system, limit, values, trace); | |
tg += gold; ts += system; tc += correct; | |
n += 1; | |
if trace: | |
if id in scores: | |
print("smatch.evaluate(): duplicate graph identifier: {}" | |
"".format(id), file = sys.stderr); | |
scores[id] = {"g": gold, "s": system, "c": correct}; | |
if trace > 1: | |
p, r, f = score.core.fscore(gold, system, correct); | |
print("G: {}; S: {}; C: {}; P: {}; R: {}; F: {}" | |
"".format(gold, system, correct, p, r, f), file = sys.stderr); | |
p, r, f = score.core.fscore(tg, ts, tc); | |
result = {"n": n, "g": tg, "s": ts, "c": tc, "p": p, "r": r, "f": f}; | |
if trace: result["scores"] = scores; | |
return result; | |