package edu.stanford.nlp.semparse.open.dataset.entity; import java.util.Collection; import edu.stanford.nlp.semparse.open.ling.LingUtils; import edu.stanford.nlp.semparse.open.util.EditDistance; import fig.basic.Option; public class TargetEntityNearMatch implements TargetEntity { public static class Options { @Option public int nearMatchMaxEditDistance = 2; @Option(gloss = "level of target entity string normalization " + "(0 = none / 1 = whitespace / 2 = simple / 3 = aggressive)") public int targetNormalizeEntities = 2; } public static Options opts = new Options(); public final String expected, normalizedExpected; public TargetEntityNearMatch(String expected) { this.expected = expected; this.normalizedExpected = LingUtils.normalize(expected, opts.targetNormalizeEntities); } @Override public String toString() { StringBuilder sb = new StringBuilder(expected); if (!expected.equals(normalizedExpected)) sb.append(" || ").append(normalizedExpected); return sb.toString(); } @Override public boolean match(String predictedEntity) { // Easy cases if (expected.equals(predictedEntity)) return true; // Edit distance if (EditDistance.withinEditDistance(normalizedExpected, predictedEntity, opts.nearMatchMaxEditDistance)) return true; return false; } @Override public boolean matchAny(Collection<String> predictedEntities) { for (String predictedEntity : predictedEntities) { if (match(predictedEntity)) return true; } return false; } }