def pronunciation_performance(target, source, env): with meta_open(source[0].rstr()) as gold_fd, meta_open(source[1].rstr()) as gen_fd: tp, fp, fn = 0, 0, 0 gold = Pronunciations(gold_fd) gen = Pronunciations(gen_fd) logging.info("gold phone inventory: %s", " ".join(gold.phones())) logging.info("generated phone inventory: %s", " ".join(gen.phones())) for x in gen.get_words().intersection(gold.get_words()): gold_prons = set(map(tuple, [map(str.lower, y) for y in gold[x].values()])) gen_prons = set(map(tuple, [map(str.lower, y) for y in gen[x].values()])) for go_p in gold_prons: if go_p in gen_prons: tp += 1 else: fn += 1 for ge_p in gen_prons: if ge_p not in gold_prons: fp += 1 prec = float(tp) / (tp + fp) rec = float(tp) / (tp + fn) f = 2 * (prec * rec) / (prec + rec) with meta_open(target[0].rstr(), "w") as ofd: ofd.write("%f %f %f\n" % (prec, rec, f)) return None