Spaces:
Runtime error
Runtime error
import sys | |
from operator import itemgetter; | |
from score.core import anchor, explode, intersect, fscore; | |
def identify(graph, node, anchors = None, dominated = None, recursion = False): | |
# | |
# from how this ends up being called in various places, there is a missing | |
# higher-level interface; something like (maybe even as a Graph method): | |
# | |
# identities = identify(graph, walk = True, explode = True) | |
# | |
if dominated is None: | |
dominated = dict() | |
if node not in dominated: dominated[node] = node_dominated = set() | |
else: node_dominated = dominated[node] | |
if anchors is None: | |
anchors = dict(); | |
elif node in anchors: | |
return anchors, dominated; | |
anchors[node] = node_anchors = anchor(graph.find_node(node)); | |
for edge in graph.edges: | |
if edge.attributes is None or "remote" not in edge.attributes: | |
if node == edge.src: | |
identify(graph, edge.tgt, anchors, dominated, True); | |
for leaf in anchors[edge.tgt]: | |
if leaf not in node_anchors: node_anchors.append(leaf); | |
node_dominated.add(edge.tgt) | |
node_dominated |= dominated[edge.tgt] | |
if not recursion: | |
anchors = {key: tuple(sorted(value, key = itemgetter(0, 1))) | |
for key, value in anchors.items()} | |
return anchors, dominated; | |
def tuples(graph): | |
identities = dict(); | |
for node in graph.nodes: | |
identities, _ = identify(graph, node.id, identities); | |
# | |
# for robust comparison, represent each yield as a character set | |
# | |
if graph.input: | |
for id in identities: | |
identities[id] = explode(graph.input, identities[id]); | |
lprimary = set(); | |
lremote = set(); | |
uprimary = set(); | |
uremote = set(); | |
for edge in graph.edges: | |
source = identities[edge.src]; | |
target = identities[edge.tgt]; | |
if edge.attributes and "remote" in edge.attributes: | |
lremote.add((source, target, edge.lab)); | |
uremote.add((source, target)); | |
else: | |
lprimary.add((source, target, edge.lab)); | |
uprimary.add((source, target)); | |
return lprimary, lremote, uprimary, uremote; | |
def evaluate(golds, systems, format = "json", trace = 0): | |
tglp = tslp = tclp = 0; | |
tgup = tsup = tcup = 0; | |
tglr = tslr = tclr = 0; | |
tgur = tsur = tcur = 0; | |
tp = tr = 0; | |
scores = dict() if trace else None; | |
result = {"n": 0, "labeled": dict(), "unlabeled": dict()}; | |
for gold, system in intersect(golds, systems): | |
glprimary, glremote, guprimary, guremote = tuples(gold); | |
slprimary, slremote, suprimary, suremote = tuples(system); | |
glp = len(glprimary); slp = len(slprimary); | |
clp = len(glprimary & slprimary); | |
gup = len(guprimary); sup = len(suprimary); | |
cup = len(guprimary & suprimary); | |
glr = len(glremote); slr = len(slremote); | |
clr = len(glremote & slremote); | |
gur = len(guremote); sur = len(suremote); | |
cur = len(guremote & suremote); | |
tglp += glp; tslp += slp; tclp += clp; | |
tgup += gup; tsup += sup; tcup += cup; | |
tglr += glr; tslr += slr; tclr += clr; | |
tgur += gur; tsur += sur; tcur += cur; | |
result["n"] += 1; | |
if trace: | |
if gold.id in scores: | |
print("ucca.evaluate(): duplicate graph identifier: {}" | |
"".format(gold.id), file = sys.stderr); | |
score = {"labeled": dict(), "unlabeled": dict()}; | |
score["labeled"]["primary"] = {"g": glp, "s": slp, "c": clp}; | |
score["labeled"]["remote"] = {"g": glr, "s": slr, "c": clr}; | |
score["unlabeled"]["primary"] = {"g": gup, "s": sup, "c": cup}; | |
score["unlabeled"]["remote"] = {"g": gur, "s": sur, "c": cur}; | |
scores[gold.id] = score; | |
if trace > 1: print("{}: {}".format(gold.id, score)); | |
p, r, f = fscore(tglp, tslp, tclp); | |
result["labeled"]["primary"] = \ | |
{"g": tglp, "s": tslp, "c": tclp, "p": p, "r": r, "f": f}; | |
p, r, f = fscore(tglr, tslr, tclr); | |
result["labeled"]["remote"] = \ | |
{"g": tglr, "s": tslr, "c": tclr, "p": p, "r": r, "f": f}; | |
p, r, f = fscore(tgup, tsup, tcup); | |
result["unlabeled"]["primary"] = \ | |
{"g": tgup, "s": tsup, "c": tcup, "p": p, "r": r, "f": f}; | |
p, r, f = fscore(tgur, tsur, tcur); | |
result["unlabeled"]["remote"] = \ | |
{"g": tgur, "s": tsur, "c": tcur, "p": p, "r": r, "f": f}; | |
if trace: result["scores"] = scores; | |
return result; | |